mongoid-locomotive 2.0.0.beta9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (274) hide show
  1. data/MIT_LICENSE +20 -0
  2. data/README.rdoc +47 -0
  3. data/lib/mongoid.rb +141 -0
  4. data/lib/mongoid/associations.rb +306 -0
  5. data/lib/mongoid/associations/embedded_in.rb +74 -0
  6. data/lib/mongoid/associations/embeds_many.rb +280 -0
  7. data/lib/mongoid/associations/embeds_one.rb +97 -0
  8. data/lib/mongoid/associations/foreign_key.rb +35 -0
  9. data/lib/mongoid/associations/meta_data.rb +38 -0
  10. data/lib/mongoid/associations/options.rb +62 -0
  11. data/lib/mongoid/associations/proxy.rb +33 -0
  12. data/lib/mongoid/associations/referenced_in.rb +59 -0
  13. data/lib/mongoid/associations/references_many.rb +245 -0
  14. data/lib/mongoid/associations/references_many_as_array.rb +78 -0
  15. data/lib/mongoid/associations/references_one.rb +99 -0
  16. data/lib/mongoid/atomicity.rb +55 -0
  17. data/lib/mongoid/attributes.rb +242 -0
  18. data/lib/mongoid/callbacks.rb +21 -0
  19. data/lib/mongoid/collection.rb +120 -0
  20. data/lib/mongoid/collections.rb +71 -0
  21. data/lib/mongoid/collections/cyclic_iterator.rb +34 -0
  22. data/lib/mongoid/collections/master.rb +29 -0
  23. data/lib/mongoid/collections/operations.rb +41 -0
  24. data/lib/mongoid/collections/slaves.rb +45 -0
  25. data/lib/mongoid/components.rb +34 -0
  26. data/lib/mongoid/config.rb +263 -0
  27. data/lib/mongoid/contexts.rb +24 -0
  28. data/lib/mongoid/contexts/enumerable.rb +156 -0
  29. data/lib/mongoid/contexts/ids.rb +25 -0
  30. data/lib/mongoid/contexts/mongo.rb +285 -0
  31. data/lib/mongoid/contexts/paging.rb +50 -0
  32. data/lib/mongoid/criteria.rb +248 -0
  33. data/lib/mongoid/criterion/complex.rb +21 -0
  34. data/lib/mongoid/criterion/exclusion.rb +65 -0
  35. data/lib/mongoid/criterion/inclusion.rb +110 -0
  36. data/lib/mongoid/criterion/optional.rb +189 -0
  37. data/lib/mongoid/cursor.rb +81 -0
  38. data/lib/mongoid/deprecation.rb +21 -0
  39. data/lib/mongoid/dirty.rb +252 -0
  40. data/lib/mongoid/document.rb +210 -0
  41. data/lib/mongoid/errors.rb +131 -0
  42. data/lib/mongoid/extensions.rb +115 -0
  43. data/lib/mongoid/extensions/array/accessors.rb +17 -0
  44. data/lib/mongoid/extensions/array/assimilation.rb +26 -0
  45. data/lib/mongoid/extensions/array/conversions.rb +23 -0
  46. data/lib/mongoid/extensions/array/parentization.rb +13 -0
  47. data/lib/mongoid/extensions/big_decimal/conversions.rb +19 -0
  48. data/lib/mongoid/extensions/binary/conversions.rb +17 -0
  49. data/lib/mongoid/extensions/boolean/conversions.rb +27 -0
  50. data/lib/mongoid/extensions/date/conversions.rb +24 -0
  51. data/lib/mongoid/extensions/datetime/conversions.rb +12 -0
  52. data/lib/mongoid/extensions/false_class/equality.rb +13 -0
  53. data/lib/mongoid/extensions/float/conversions.rb +20 -0
  54. data/lib/mongoid/extensions/hash/accessors.rb +42 -0
  55. data/lib/mongoid/extensions/hash/assimilation.rb +40 -0
  56. data/lib/mongoid/extensions/hash/conversions.rb +42 -0
  57. data/lib/mongoid/extensions/hash/criteria_helpers.rb +20 -0
  58. data/lib/mongoid/extensions/hash/scoping.rb +12 -0
  59. data/lib/mongoid/extensions/integer/conversions.rb +20 -0
  60. data/lib/mongoid/extensions/nil/assimilation.rb +17 -0
  61. data/lib/mongoid/extensions/object/conversions.rb +21 -0
  62. data/lib/mongoid/extensions/objectid/conversions.rb +15 -0
  63. data/lib/mongoid/extensions/proc/scoping.rb +12 -0
  64. data/lib/mongoid/extensions/set/conversions.rb +20 -0
  65. data/lib/mongoid/extensions/string/conversions.rb +15 -0
  66. data/lib/mongoid/extensions/string/inflections.rb +97 -0
  67. data/lib/mongoid/extensions/symbol/inflections.rb +40 -0
  68. data/lib/mongoid/extensions/time_conversions.rb +35 -0
  69. data/lib/mongoid/extensions/true_class/equality.rb +13 -0
  70. data/lib/mongoid/extras.rb +61 -0
  71. data/lib/mongoid/factory.rb +20 -0
  72. data/lib/mongoid/field.rb +83 -0
  73. data/lib/mongoid/fields.rb +62 -0
  74. data/lib/mongoid/finders.rb +145 -0
  75. data/lib/mongoid/hierarchy.rb +74 -0
  76. data/lib/mongoid/identity.rb +47 -0
  77. data/lib/mongoid/indexes.rb +27 -0
  78. data/lib/mongoid/javascript.rb +21 -0
  79. data/lib/mongoid/javascript/functions.yml +37 -0
  80. data/lib/mongoid/logger.rb +19 -0
  81. data/lib/mongoid/matchers.rb +35 -0
  82. data/lib/mongoid/matchers/all.rb +11 -0
  83. data/lib/mongoid/matchers/default.rb +26 -0
  84. data/lib/mongoid/matchers/exists.rb +13 -0
  85. data/lib/mongoid/matchers/gt.rb +11 -0
  86. data/lib/mongoid/matchers/gte.rb +11 -0
  87. data/lib/mongoid/matchers/in.rb +11 -0
  88. data/lib/mongoid/matchers/lt.rb +11 -0
  89. data/lib/mongoid/matchers/lte.rb +11 -0
  90. data/lib/mongoid/matchers/ne.rb +11 -0
  91. data/lib/mongoid/matchers/nin.rb +11 -0
  92. data/lib/mongoid/matchers/size.rb +11 -0
  93. data/lib/mongoid/memoization.rb +33 -0
  94. data/lib/mongoid/named_scope.rb +37 -0
  95. data/lib/mongoid/paranoia.rb +106 -0
  96. data/lib/mongoid/paths.rb +61 -0
  97. data/lib/mongoid/persistence.rb +216 -0
  98. data/lib/mongoid/persistence/command.rb +39 -0
  99. data/lib/mongoid/persistence/insert.rb +48 -0
  100. data/lib/mongoid/persistence/insert_embedded.rb +44 -0
  101. data/lib/mongoid/persistence/remove.rb +39 -0
  102. data/lib/mongoid/persistence/remove_all.rb +38 -0
  103. data/lib/mongoid/persistence/remove_embedded.rb +50 -0
  104. data/lib/mongoid/persistence/update.rb +71 -0
  105. data/lib/mongoid/railtie.rb +67 -0
  106. data/lib/mongoid/railties/database.rake +60 -0
  107. data/lib/mongoid/scope.rb +75 -0
  108. data/lib/mongoid/state.rb +32 -0
  109. data/lib/mongoid/timestamps.rb +27 -0
  110. data/lib/mongoid/validations.rb +51 -0
  111. data/lib/mongoid/validations/associated.rb +32 -0
  112. data/lib/mongoid/validations/locale/en.yml +5 -0
  113. data/lib/mongoid/validations/uniqueness.rb +56 -0
  114. data/lib/mongoid/version.rb +4 -0
  115. data/lib/mongoid/versioning.rb +26 -0
  116. data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
  117. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +24 -0
  118. data/lib/rails/generators/mongoid/model/model_generator.rb +24 -0
  119. data/lib/rails/generators/mongoid/model/templates/model.rb +15 -0
  120. data/lib/rails/generators/mongoid_generator.rb +61 -0
  121. data/spec/integration/mongoid/association_attributes_spec.rb +71 -0
  122. data/spec/integration/mongoid/associations_spec.rb +768 -0
  123. data/spec/integration/mongoid/attributes_spec.rb +59 -0
  124. data/spec/integration/mongoid/callback_spec.rb +33 -0
  125. data/spec/integration/mongoid/contexts/enumerable_spec.rb +33 -0
  126. data/spec/integration/mongoid/criteria_spec.rb +281 -0
  127. data/spec/integration/mongoid/dirty_spec.rb +85 -0
  128. data/spec/integration/mongoid/document_spec.rb +741 -0
  129. data/spec/integration/mongoid/extensions_spec.rb +22 -0
  130. data/spec/integration/mongoid/finders_spec.rb +119 -0
  131. data/spec/integration/mongoid/inheritance_spec.rb +171 -0
  132. data/spec/integration/mongoid/named_scope_spec.rb +58 -0
  133. data/spec/integration/mongoid/paranoia_spec.rb +44 -0
  134. data/spec/integration/mongoid/persistence/update_spec.rb +46 -0
  135. data/spec/integration/mongoid/persistence_spec.rb +311 -0
  136. data/spec/integration/mongoid/validations/uniqueness_spec.rb +206 -0
  137. data/spec/models/account.rb +5 -0
  138. data/spec/models/address.rb +40 -0
  139. data/spec/models/agent.rb +7 -0
  140. data/spec/models/animal.rb +15 -0
  141. data/spec/models/answer.rb +4 -0
  142. data/spec/models/callbacks.rb +47 -0
  143. data/spec/models/category.rb +13 -0
  144. data/spec/models/comment.rb +10 -0
  145. data/spec/models/country_code.rb +6 -0
  146. data/spec/models/employer.rb +5 -0
  147. data/spec/models/favorite.rb +8 -0
  148. data/spec/models/game.rb +9 -0
  149. data/spec/models/inheritance.rb +72 -0
  150. data/spec/models/location.rb +5 -0
  151. data/spec/models/login.rb +6 -0
  152. data/spec/models/mixed_drink.rb +4 -0
  153. data/spec/models/name.rb +13 -0
  154. data/spec/models/namespacing.rb +11 -0
  155. data/spec/models/paranoid_post.rb +18 -0
  156. data/spec/models/parents.rb +32 -0
  157. data/spec/models/patient.rb +15 -0
  158. data/spec/models/person.rb +106 -0
  159. data/spec/models/pet.rb +7 -0
  160. data/spec/models/pet_owner.rb +6 -0
  161. data/spec/models/phone.rb +7 -0
  162. data/spec/models/post.rb +25 -0
  163. data/spec/models/preference.rb +7 -0
  164. data/spec/models/question.rb +8 -0
  165. data/spec/models/survey.rb +6 -0
  166. data/spec/models/translation.rb +5 -0
  167. data/spec/models/user.rb +6 -0
  168. data/spec/models/user_accout.rb +5 -0
  169. data/spec/models/vet_visit.rb +5 -0
  170. data/spec/models/video.rb +5 -0
  171. data/spec/spec_helper.rb +33 -0
  172. data/spec/unit/mongoid/associations/embedded_in_spec.rb +193 -0
  173. data/spec/unit/mongoid/associations/embeds_many_spec.rb +626 -0
  174. data/spec/unit/mongoid/associations/embeds_one_spec.rb +287 -0
  175. data/spec/unit/mongoid/associations/foreign_key_spec.rb +90 -0
  176. data/spec/unit/mongoid/associations/meta_data_spec.rb +110 -0
  177. data/spec/unit/mongoid/associations/options_spec.rb +215 -0
  178. data/spec/unit/mongoid/associations/referenced_in_spec.rb +145 -0
  179. data/spec/unit/mongoid/associations/references_many_as_array_spec.rb +424 -0
  180. data/spec/unit/mongoid/associations/references_many_spec.rb +502 -0
  181. data/spec/unit/mongoid/associations/references_one_spec.rb +204 -0
  182. data/spec/unit/mongoid/associations_spec.rb +688 -0
  183. data/spec/unit/mongoid/atomicity_spec.rb +164 -0
  184. data/spec/unit/mongoid/attributes_spec.rb +646 -0
  185. data/spec/unit/mongoid/callbacks_spec.rb +85 -0
  186. data/spec/unit/mongoid/collection_spec.rb +187 -0
  187. data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +75 -0
  188. data/spec/unit/mongoid/collections/master_spec.rb +41 -0
  189. data/spec/unit/mongoid/collections/slaves_spec.rb +81 -0
  190. data/spec/unit/mongoid/collections_spec.rb +98 -0
  191. data/spec/unit/mongoid/config_spec.rb +298 -0
  192. data/spec/unit/mongoid/contexts/enumerable_spec.rb +447 -0
  193. data/spec/unit/mongoid/contexts/mongo_spec.rb +703 -0
  194. data/spec/unit/mongoid/contexts_spec.rb +25 -0
  195. data/spec/unit/mongoid/criteria_spec.rb +873 -0
  196. data/spec/unit/mongoid/criterion/complex_spec.rb +17 -0
  197. data/spec/unit/mongoid/criterion/exclusion_spec.rb +121 -0
  198. data/spec/unit/mongoid/criterion/inclusion_spec.rb +274 -0
  199. data/spec/unit/mongoid/criterion/optional_spec.rb +483 -0
  200. data/spec/unit/mongoid/cursor_spec.rb +80 -0
  201. data/spec/unit/mongoid/deprecation_spec.rb +24 -0
  202. data/spec/unit/mongoid/dirty_spec.rb +430 -0
  203. data/spec/unit/mongoid/document_spec.rb +623 -0
  204. data/spec/unit/mongoid/errors_spec.rb +154 -0
  205. data/spec/unit/mongoid/extensions/array/accessors_spec.rb +50 -0
  206. data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +24 -0
  207. data/spec/unit/mongoid/extensions/array/conversions_spec.rb +52 -0
  208. data/spec/unit/mongoid/extensions/array/parentization_spec.rb +20 -0
  209. data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +36 -0
  210. data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +22 -0
  211. data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +49 -0
  212. data/spec/unit/mongoid/extensions/date/conversions_spec.rb +145 -0
  213. data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +14 -0
  214. data/spec/unit/mongoid/extensions/false_class/equality_spec.rb +35 -0
  215. data/spec/unit/mongoid/extensions/float/conversions_spec.rb +61 -0
  216. data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +184 -0
  217. data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +59 -0
  218. data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +35 -0
  219. data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +17 -0
  220. data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +14 -0
  221. data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +61 -0
  222. data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +29 -0
  223. data/spec/unit/mongoid/extensions/object/conversions_spec.rb +44 -0
  224. data/spec/unit/mongoid/extensions/objectid/conversions_spec.rb +22 -0
  225. data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +34 -0
  226. data/spec/unit/mongoid/extensions/set/conversions_spec.rb +21 -0
  227. data/spec/unit/mongoid/extensions/string/conversions_spec.rb +28 -0
  228. data/spec/unit/mongoid/extensions/string/inflections_spec.rb +208 -0
  229. data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +107 -0
  230. data/spec/unit/mongoid/extensions/time_conversions_spec.rb +186 -0
  231. data/spec/unit/mongoid/extensions/true_class/equality_spec.rb +35 -0
  232. data/spec/unit/mongoid/extras_spec.rb +102 -0
  233. data/spec/unit/mongoid/factory_spec.rb +31 -0
  234. data/spec/unit/mongoid/field_spec.rb +169 -0
  235. data/spec/unit/mongoid/fields_spec.rb +181 -0
  236. data/spec/unit/mongoid/finders_spec.rb +439 -0
  237. data/spec/unit/mongoid/hierarchy_spec.rb +68 -0
  238. data/spec/unit/mongoid/identity_spec.rb +109 -0
  239. data/spec/unit/mongoid/indexes_spec.rb +99 -0
  240. data/spec/unit/mongoid/javascript_spec.rb +48 -0
  241. data/spec/unit/mongoid/logger_spec.rb +38 -0
  242. data/spec/unit/mongoid/matchers/all_spec.rb +27 -0
  243. data/spec/unit/mongoid/matchers/default_spec.rb +27 -0
  244. data/spec/unit/mongoid/matchers/exists_spec.rb +56 -0
  245. data/spec/unit/mongoid/matchers/gt_spec.rb +39 -0
  246. data/spec/unit/mongoid/matchers/gte_spec.rb +49 -0
  247. data/spec/unit/mongoid/matchers/in_spec.rb +27 -0
  248. data/spec/unit/mongoid/matchers/lt_spec.rb +39 -0
  249. data/spec/unit/mongoid/matchers/lte_spec.rb +49 -0
  250. data/spec/unit/mongoid/matchers/ne_spec.rb +27 -0
  251. data/spec/unit/mongoid/matchers/nin_spec.rb +27 -0
  252. data/spec/unit/mongoid/matchers/size_spec.rb +27 -0
  253. data/spec/unit/mongoid/matchers_spec.rb +329 -0
  254. data/spec/unit/mongoid/memoization_spec.rb +75 -0
  255. data/spec/unit/mongoid/named_scope_spec.rb +123 -0
  256. data/spec/unit/mongoid/paranoia_spec.rb +108 -0
  257. data/spec/unit/mongoid/paths_spec.rb +272 -0
  258. data/spec/unit/mongoid/persistence/insert_embedded_spec.rb +154 -0
  259. data/spec/unit/mongoid/persistence/insert_spec.rb +144 -0
  260. data/spec/unit/mongoid/persistence/remove_all_spec.rb +82 -0
  261. data/spec/unit/mongoid/persistence/remove_embedded_spec.rb +152 -0
  262. data/spec/unit/mongoid/persistence/remove_spec.rb +89 -0
  263. data/spec/unit/mongoid/persistence/update_spec.rb +177 -0
  264. data/spec/unit/mongoid/persistence_spec.rb +452 -0
  265. data/spec/unit/mongoid/scope_spec.rb +240 -0
  266. data/spec/unit/mongoid/serialization_spec.rb +43 -0
  267. data/spec/unit/mongoid/state_spec.rb +94 -0
  268. data/spec/unit/mongoid/timestamps_spec.rb +30 -0
  269. data/spec/unit/mongoid/validations/associated_spec.rb +103 -0
  270. data/spec/unit/mongoid/validations/uniqueness_spec.rb +201 -0
  271. data/spec/unit/mongoid/validations_spec.rb +43 -0
  272. data/spec/unit/mongoid/versioning_spec.rb +41 -0
  273. data/spec/unit/mongoid_spec.rb +46 -0
  274. metadata +433 -0
@@ -0,0 +1,22 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Extensions do
4
+
5
+ context "setting floating point numbers" do
6
+
7
+ context "when value is an empty string" do
8
+
9
+ let(:person) { Person.new(:ssn => "555555555555555") }
10
+
11
+ before do
12
+ Person.validates_numericality_of :blood_alcohol_content, :allow_blank => true
13
+ end
14
+
15
+ it "does not set the value" do
16
+ person.save.should be_true
17
+ end
18
+
19
+ end
20
+ end
21
+
22
+ end
@@ -0,0 +1,119 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Finders do
4
+
5
+ describe "#find" do
6
+
7
+ context "using string ids" do
8
+
9
+ before do
10
+ @documents = []
11
+ @document = Person.create(:title => "Mrs.", :ssn => "another")
12
+ 3.times do |n|
13
+ @documents << Person.create(:title => "Mr.", :ssn => "#{n}22")
14
+ end
15
+ end
16
+
17
+ after do
18
+ Person.delete_all
19
+ end
20
+
21
+ context "with an id as an argument" do
22
+
23
+ context "when the document is found" do
24
+
25
+ it "returns the document" do
26
+ Person.find(@document.id).should == @document
27
+ end
28
+
29
+ end
30
+
31
+ context "when the document is not found" do
32
+
33
+ it "raises an error" do
34
+ lambda { Person.find("5") }.should raise_error
35
+ end
36
+
37
+ end
38
+
39
+ end
40
+
41
+ context "with an array of ids as args" do
42
+
43
+ context "when the documents are found" do
44
+
45
+ it "returns an array of the documents" do
46
+ @people = Person.find(@documents.map(&:id))
47
+ @people.should == @documents
48
+ end
49
+
50
+ end
51
+
52
+ context "when no documents found" do
53
+
54
+ it "raises an error" do
55
+ lambda { Person.find(["11", "21", "31"]) }.should raise_error
56
+ end
57
+
58
+ end
59
+ end
60
+ end
61
+
62
+ context "using object ids" do
63
+
64
+ before do
65
+ Mongoid.use_object_ids = true
66
+ @documents = []
67
+ @document = Person.create(:title => "Mrs.", :ssn => "another")
68
+ 3.times do |n|
69
+ @documents << Person.create(:title => "Mr.", :ssn => "#{n}22")
70
+ end
71
+ end
72
+
73
+ after do
74
+ Mongoid.use_object_ids = false
75
+ Person.delete_all
76
+ end
77
+
78
+ context "with an id as an argument" do
79
+
80
+ context "when the document is found" do
81
+
82
+ it "returns the document" do
83
+ Person.find(@document.id).should == @document
84
+ end
85
+
86
+ end
87
+
88
+ context "when the document is not found" do
89
+
90
+ it "raises an error" do
91
+ lambda { Person.find("5") }.should raise_error
92
+ end
93
+
94
+ end
95
+
96
+ end
97
+
98
+ context "with an array of ids as args" do
99
+
100
+ context "when the documents are found" do
101
+
102
+ it "returns an array of the documents" do
103
+ @people = Person.find(@documents.map(&:id))
104
+ @people.should == @documents
105
+ end
106
+
107
+ end
108
+
109
+ context "when no documents found" do
110
+
111
+ it "raises an error" do
112
+ lambda { Person.find(["11", "21", "31"]) }.should raise_error
113
+ end
114
+
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,171 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Document do
4
+
5
+ before do
6
+ Browser.delete_all
7
+ Firefox.delete_all
8
+ Canvas.delete_all
9
+ end
10
+
11
+ context "when document is a subclass of a root class" do
12
+
13
+ before do
14
+ Browser.delete_all
15
+ @browser = Browser.create(:version => 3, :name => "Test")
16
+ end
17
+
18
+ it "saves in the same collection as the root" do
19
+ collection = Mongoid.master.collection("canvases")
20
+ attributes = collection.find({ :name => "Test"}, {}).next_document
21
+ attributes["version"].should == 3
22
+ attributes["name"].should == "Test"
23
+ attributes["_type"].should == "Browser"
24
+ attributes["_id"].should == @browser.id
25
+ end
26
+
27
+ end
28
+
29
+ context "when document is a subclass of a subclass" do
30
+
31
+ before do
32
+ Firefox.delete_all
33
+ @firefox = Firefox.create(:version => 2, :name => "Testy")
34
+ end
35
+
36
+ it "saves in the same collection as the root" do
37
+ collection = Mongoid.master.collection("canvases")
38
+ attributes = collection.find({ :name => "Testy"}, {}).next_document
39
+ attributes["version"].should == 2
40
+ attributes["name"].should == "Testy"
41
+ attributes["_type"].should == "Firefox"
42
+ attributes["_id"].should == @firefox.id
43
+ end
44
+
45
+ it "returns the document when querying for superclass" do
46
+ Browser.where(:name => "Testy").first.should == @firefox
47
+ end
48
+
49
+ it "returns the document when querying for root class" do
50
+ Canvas.where(:name => "Testy").first.should == @firefox
51
+ end
52
+
53
+ it 'should returns on of this subclasses if you find by _type' do
54
+ Browser.create(:name => 'Safari', :version => '4.0.0')
55
+ Canvas.where(:_type.in => ['Firefox']).count.should == 1
56
+ end
57
+
58
+ end
59
+
60
+ context "when document has associations" do
61
+
62
+ before do
63
+ Firefox.delete_all
64
+ @firefox = Firefox.new(:name => "firefox")
65
+ @writer = HtmlWriter.new(:speed => 100)
66
+ @circle = Circle.new(:radius => 50)
67
+ @square = Square.new(:width => 300, :height => 150)
68
+ @firefox.writer = @writer
69
+ @firefox.shapes << [ @circle, @square ]
70
+ @firefox.save!
71
+ end
72
+
73
+ after do
74
+ Firefox.delete_all
75
+ end
76
+
77
+ it "properly saves a has one subclass" do
78
+ from_db = Firefox.find(@firefox.id)
79
+ from_db.should be_a_kind_of(Firefox)
80
+ from_db.writer.should be_a_kind_of(HtmlWriter)
81
+ from_db.writer.should == @writer
82
+ end
83
+
84
+ it "properly saves a has many subclass" do
85
+ from_db = Firefox.find(@firefox.id)
86
+ from_db.shapes.first.should == @circle
87
+ from_db.shapes.first.should be_a_kind_of(Circle)
88
+ from_db.shapes.last.should == @square
89
+ from_db.shapes.last.should be_a_kind_of(Square)
90
+ end
91
+
92
+ it "properly sets up the belongs to" do
93
+ from_db = Firefox.find(@firefox.id)
94
+ circle = from_db.shapes.first
95
+ circle.should == @circle
96
+ circle.canvas.should == @firefox
97
+ end
98
+
99
+ end
100
+
101
+ context "when document has subclasses" do
102
+
103
+ before do
104
+ @firefox = Firefox.create(:name => "firefox")
105
+ end
106
+
107
+ after do
108
+ Firefox.delete_all
109
+ end
110
+
111
+ it "returns subclasses for querying parents" do
112
+ firefox = Canvas.where(:name => "firefox").first
113
+ firefox.should be_a_kind_of(Firefox)
114
+ firefox.should == @firefox
115
+ end
116
+
117
+ end
118
+
119
+ context "deleting subclasses" do
120
+
121
+ before do
122
+ @firefox = Firefox.create(:name => "firefox")
123
+ @firefox2 = Firefox.create(:name => "firefox 2")
124
+ @browser = Browser.create(:name => "browser")
125
+ @canvas = Canvas.create(:name => "canvas")
126
+ end
127
+
128
+ after do
129
+ Firefox.delete_all
130
+ Browser.delete_all
131
+ Canvas.delete_all
132
+ end
133
+
134
+ it "deletes from the parent class collection" do
135
+ @firefox.delete
136
+ Firefox.count.should == 1
137
+ Browser.count.should == 2
138
+ Canvas.count.should == 3
139
+ end
140
+
141
+ it "deletes all documents except for those belonging to parent class collection" do
142
+ Firefox.delete_all
143
+ Firefox.count.should == 0
144
+ Browser.count.should == 1
145
+ Canvas.count.should == 2
146
+ end
147
+
148
+ end
149
+
150
+ context "when document is a subclass and its parent is an embedded document" do
151
+
152
+ before do
153
+ @canvas = Canvas.new(:name => "canvas")
154
+ @canvas.build_palette({})
155
+ @canvas.palette.tools << Pencil.new
156
+ @canvas.palette.tools << Eraser.new
157
+ @canvas.save
158
+ end
159
+
160
+ after do
161
+ Canvas.delete_all
162
+ end
163
+
164
+ it "properly saves the subclasses" do
165
+ from_db = Canvas.find(@canvas.id)
166
+ from_db.palette.tools.map(&:class).should == [Pencil, Eraser]
167
+ end
168
+
169
+ end
170
+
171
+ end
@@ -0,0 +1,58 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::NamedScope do
4
+
5
+ describe ".scope" do
6
+
7
+ before(:all) do
8
+ Person.class_eval do
9
+ scope :doctors, {:where => {:title => 'Dr.'} }
10
+ scope :old, criteria.where(:age.gt => 50)
11
+ scope :alki, where(:blood_alcohol_content.gt => 0.3).order_by(:blood_alcohol_content.asc)
12
+ end
13
+ end
14
+
15
+ before do
16
+ @document = Person.create(:title => "Dr.", :age => 65, :terms => true, :ssn => "123-22-8346")
17
+ end
18
+
19
+ after do
20
+ Person.delete_all
21
+ end
22
+
23
+ context "accessing a single named scope" do
24
+
25
+ it "returns the document" do
26
+ Person.doctors.first.should == @document
27
+ end
28
+ end
29
+
30
+ context "chaining named scopes" do
31
+
32
+ it "returns the document" do
33
+ Person.old.doctors.first.should == @document
34
+ end
35
+ end
36
+
37
+ context "mixing named scopes and class methods" do
38
+
39
+ it "returns the document" do
40
+ Person.accepted.old.doctors.first.should == @document
41
+ end
42
+ end
43
+
44
+ context "using order_by in a named scope" do
45
+
46
+ before do
47
+ Person.create(:blood_alcohol_content => 0.5, :ssn => "121-22-8346")
48
+ Person.create(:blood_alcohol_content => 0.4, :ssn => "124-22-8346")
49
+ Person.create(:blood_alcohol_content => 0.7, :ssn => "125-22-8346")
50
+ end
51
+
52
+ it "sorts the results" do
53
+ docs = Person.alki
54
+ docs.first.blood_alcohol_content.should == 0.4
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,44 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Paranoia do
4
+
5
+ before :all do
6
+ ParanoidPost.delete_all
7
+ end
8
+
9
+ context 'a soft deleted item' do
10
+
11
+ before :each do
12
+ @post = ParanoidPost.create(:title => 'Can I die more than once?')
13
+ @post.delete
14
+ @post.reload
15
+ end
16
+
17
+ after :each do
18
+ @post.destroy!
19
+ end
20
+
21
+ it 'should have a deletion date' do
22
+ @post.deleted_at.should_not be_nil
23
+ end
24
+
25
+ it 'should be restorable' do
26
+ @post.restore
27
+ @post.reload
28
+ @post.deleted_at.should be_nil
29
+ end
30
+
31
+ it 'should be invisible to searches' do
32
+ ParanoidPost.count.should == 0
33
+ end
34
+
35
+ it 'should be found overriding default deleted_at scoping' do
36
+ ParanoidPost.where(:deleted_at.ne => nil).count.should == 1
37
+ end
38
+
39
+ it 'should be hard-destroyable' do
40
+ @post.destroy!
41
+ ParanoidPost.where(:deleted_at.ne => nil).count.should == 0
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,46 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Persistence::Update do
4
+
5
+ before do
6
+ Person.delete_all
7
+ end
8
+
9
+ after do
10
+ Person.delete_all
11
+ end
12
+
13
+ describe "#persist" do
14
+
15
+ let(:person) do
16
+ Person.create!(:ssn => "111-11-1111", :title => "Sir")
17
+ end
18
+
19
+ context "when the document has changed" do
20
+
21
+ before do
22
+ @person = Person.find(person.id)
23
+ @person.title = "Grand Poobah"
24
+ end
25
+
26
+ it "updates the document in the database" do
27
+ update = Mongoid::Persistence::Update.new(@person)
28
+ update.persist
29
+ from_db = Person.find(@person.id)
30
+ from_db.title.should == "Grand Poobah"
31
+ end
32
+ end
33
+
34
+ context "when the document has not changed" do
35
+
36
+ before do
37
+ @person = Person.find(person.id)
38
+ end
39
+
40
+ it "returns true" do
41
+ update = Mongoid::Persistence::Update.new(@person)
42
+ update.persist.should == true
43
+ end
44
+ end
45
+ end
46
+ end