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,154 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Persistence::Insert do
4
+
5
+ let(:document) do
6
+ Patient.new(:title => "Mr")
7
+ end
8
+
9
+ let(:address) do
10
+ Address.new(:street => "Oxford St")
11
+ end
12
+
13
+ let(:collection) do
14
+ stub.quacks_like(Mongoid::Collection.allocate)
15
+ end
16
+
17
+ let(:email) do
18
+ Email.new(:address => "test@example.com")
19
+ end
20
+
21
+ before do
22
+ document.stubs(:collection).returns(collection)
23
+ end
24
+
25
+ describe "#persist" do
26
+
27
+ def root_insert_expectation
28
+ lambda {
29
+ collection.expects(:insert).with(
30
+ document.raw_attributes,
31
+ :safe => true
32
+ ).returns("Object")
33
+ }
34
+ end
35
+
36
+ def root_push_expectation
37
+ lambda {
38
+ collection.expects(:update).with(
39
+ { "_id" => document.id },
40
+ { "$push" => { "addresses" => address.raw_attributes } },
41
+ :multi => false,
42
+ :safe => true
43
+ ).returns("Object")
44
+ }
45
+ end
46
+
47
+ def root_set_expectation
48
+ lambda {
49
+ collection.expects(:update).with(
50
+ { "_id" => document.id },
51
+ { "$set" => { "email" => email.raw_attributes } },
52
+ :multi => false,
53
+ :safe => true
54
+ ).returns("Object")
55
+ }
56
+ end
57
+
58
+ context "when the embedded document is an embeds_one" do
59
+
60
+ before do
61
+ document.email = email
62
+ end
63
+
64
+ context "when the parent is new" do
65
+
66
+ let(:insert) do
67
+ Mongoid::Persistence::InsertEmbedded.new(email)
68
+ end
69
+
70
+ it "notifies its changes to parent and inserts the parent" do
71
+ root_insert_expectation.call
72
+ insert.persist.should == email
73
+ end
74
+ end
75
+
76
+ context "when the parent is not new" do
77
+
78
+ let(:insert) do
79
+ Mongoid::Persistence::InsertEmbedded.new(email)
80
+ end
81
+
82
+ before do
83
+ document.instance_variable_set(:@new_record, false)
84
+ end
85
+
86
+ it "performs an in place $set on the embedded document" do
87
+ root_set_expectation.call
88
+ insert.persist.should == email
89
+ end
90
+
91
+ it "sets new_record to false" do
92
+ root_set_expectation.call
93
+ insert.persist.new_record?.should be_false
94
+ end
95
+ end
96
+ end
97
+
98
+ context "when the embedded document is an embeds_many" do
99
+
100
+ before do
101
+ document.addresses << address
102
+ end
103
+
104
+ context "when the parent is new" do
105
+
106
+ let(:insert) do
107
+ Mongoid::Persistence::InsertEmbedded.new(address)
108
+ end
109
+
110
+ it "notifies its changes to the parent and inserts the parent" do
111
+ root_insert_expectation.call
112
+ insert.persist.should == address
113
+ end
114
+
115
+ it "sets new_record to false" do
116
+ root_insert_expectation.call
117
+ insert.persist.new_record?.should be_false
118
+ end
119
+ end
120
+
121
+ context "when the parent is not new" do
122
+
123
+ let(:insert) do
124
+ Mongoid::Persistence::InsertEmbedded.new(address)
125
+ end
126
+
127
+ before do
128
+ document.instance_variable_set(:@new_record, false)
129
+ end
130
+
131
+ it "performs a $push on the embedded array" do
132
+ root_push_expectation.call
133
+ insert.persist.should == address
134
+ end
135
+
136
+ context "when we add the parent to the child" do
137
+ let(:other_address) do
138
+ Address.new(:street => "Oxford St", :addressable => document)
139
+ end
140
+
141
+ it "performs a $push on the embedded array" do
142
+ collection.expects(:update).with(
143
+ { "_id" => document.id },
144
+ { "$push" => { "addresses" => other_address.raw_attributes } },
145
+ :multi => false,
146
+ :safe => true
147
+ ).returns("Object")
148
+ Mongoid::Persistence::InsertEmbedded.new(other_address).persist.should == other_address
149
+ end
150
+ end
151
+ end
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,144 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Persistence::Insert do
4
+
5
+ let(:document) do
6
+ Patient.new(:title => "Mr")
7
+ end
8
+
9
+ let(:address) do
10
+ Address.new(:street => "Oxford St")
11
+ end
12
+
13
+ let(:collection) do
14
+ stub.quacks_like(Mongoid::Collection.allocate)
15
+ end
16
+
17
+ before do
18
+ document.stubs(:collection).returns(collection)
19
+ end
20
+
21
+ describe "#initialize" do
22
+
23
+ let(:insert) do
24
+ Mongoid::Persistence::Insert.new(document)
25
+ end
26
+
27
+ it "sets the document" do
28
+ insert.document.should == document
29
+ end
30
+
31
+ it "sets the collection" do
32
+ insert.collection.should == document.collection
33
+ end
34
+
35
+ it "defaults validation to true" do
36
+ insert.validate.should == true
37
+ end
38
+
39
+ it "sets the options" do
40
+ insert.options.should ==
41
+ { :safe => Mongoid.persist_in_safe_mode }
42
+ end
43
+ end
44
+
45
+ describe "#persist" do
46
+
47
+ def root_set_expectation
48
+ lambda {
49
+ collection.expects(:insert).with(
50
+ document.raw_attributes,
51
+ :safe => true
52
+ ).returns("Object")
53
+ }
54
+ end
55
+
56
+ def root_push_expectation
57
+ lambda {
58
+ collection.expects(:update).with(
59
+ { "_id" => document.id },
60
+ { "addresses" => { "$push" => address.raw_attributes } },
61
+ :safe => true
62
+ ).returns("Object")
63
+ }
64
+ end
65
+
66
+ let(:insert) do
67
+ Mongoid::Persistence::Insert.new(document)
68
+ end
69
+
70
+ context "when the document is valid" do
71
+
72
+ it "inserts the new document" do
73
+ root_set_expectation.call
74
+ insert.persist
75
+ end
76
+
77
+ it "returns the document" do
78
+ root_set_expectation.call
79
+ insert.persist.should == document
80
+ end
81
+
82
+ it "sets new_record to false" do
83
+ root_set_expectation.call
84
+ insert.persist
85
+ document.new_record?.should == false
86
+ end
87
+ end
88
+
89
+ context "when the document is not valid" do
90
+
91
+ before do
92
+ document.stubs(:valid?).returns(false)
93
+ end
94
+
95
+ it "returns the document" do
96
+ insert.persist.should == document
97
+ end
98
+
99
+ it "leaves the document as a new record" do
100
+ insert.persist
101
+ document.new_record?.should == true
102
+ end
103
+ end
104
+
105
+ context "when not validating" do
106
+
107
+ before do
108
+ insert.instance_variable_set(:@validate, false)
109
+ document.stubs(:valid?).returns(false)
110
+ end
111
+
112
+ after do
113
+ insert.instance_variable_set(:@validate, true)
114
+ end
115
+
116
+ it "inserts the document in the database" do
117
+ root_set_expectation.call
118
+ insert.persist
119
+ document.new_record?.should == false
120
+ end
121
+ end
122
+
123
+ context "when the document is embedded" do
124
+
125
+ before do
126
+ document.addresses << address
127
+ end
128
+
129
+ let(:insert) do
130
+ Mongoid::Persistence::Insert.new(address)
131
+ end
132
+
133
+ let(:persister) do
134
+ stub.quacks_like(Mongoid::Persistence::InsertEmbedded.allocate)
135
+ end
136
+
137
+ it "delegates to the embedded persister" do
138
+ Mongoid::Persistence::InsertEmbedded.expects(:new).with(address, true).returns(persister)
139
+ persister.expects(:persist).returns(address)
140
+ insert.persist.should == address
141
+ end
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,82 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Persistence::RemoveAll do
4
+
5
+ let(:document) do
6
+ Patient.new(:title => "Mr")
7
+ end
8
+
9
+ let(:collection) do
10
+ stub_everything.quacks_like(Mongoid::Collection.allocate)
11
+ end
12
+
13
+ let(:cursor) do
14
+ stub.quacks_like(Mongoid::Cursor.allocate)
15
+ end
16
+
17
+ let(:selector) do
18
+ { :field1 => { "$exists" => true } }
19
+ end
20
+
21
+ before do
22
+ Patient.stubs(:_collection).returns(collection)
23
+ end
24
+
25
+ describe "#initialize" do
26
+
27
+ let(:remove_all) do
28
+ Mongoid::Persistence::RemoveAll.new(Patient, false, selector)
29
+ end
30
+
31
+ it "sets the collection" do
32
+ remove_all.collection.should == document.collection
33
+ end
34
+
35
+ it "sets the options" do
36
+ remove_all.options.should ==
37
+ { :safe => Mongoid.persist_in_safe_mode }
38
+ end
39
+
40
+ it "sets the selector" do
41
+ remove_all.selector.should == selector
42
+ end
43
+ end
44
+
45
+ describe "#persist" do
46
+
47
+ def root_delete_expectation
48
+ lambda {
49
+ collection.expects(:remove).with(selector, :safe => true).returns(true)
50
+ }
51
+ end
52
+
53
+ def root_find_expectation
54
+ lambda {
55
+ collection.expects(:find).with(
56
+ selector
57
+ ).returns(cursor)
58
+ }
59
+ end
60
+
61
+ let(:remove_all) do
62
+ Mongoid::Persistence::RemoveAll.new(Patient, false, selector)
63
+ end
64
+
65
+ context "when the document is a root document" do
66
+
67
+ it "remove_alls the document from the collection" do
68
+ root_delete_expectation.call
69
+ root_find_expectation.call
70
+ cursor.expects(:count).returns(30)
71
+ remove_all.persist
72
+ end
73
+
74
+ it "returns the count of documents removed" do
75
+ root_delete_expectation.call
76
+ root_find_expectation.call
77
+ cursor.expects(:count).returns(30)
78
+ remove_all.persist.should == 30
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,152 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Persistence::Remove do
4
+
5
+ let(:document) do
6
+ Patient.new(:title => "Mr")
7
+ end
8
+
9
+ let(:address) do
10
+ Address.new(:street => "Oxford St")
11
+ end
12
+
13
+ let(:collection) do
14
+ stub.quacks_like(Mongoid::Collection.allocate)
15
+ end
16
+
17
+ let(:email) do
18
+ Email.new(:address => "test@example.com")
19
+ end
20
+
21
+ let(:location) do
22
+ Location.new(:name => "Home")
23
+ end
24
+
25
+ before do
26
+ document.stubs(:collection).returns(collection)
27
+ end
28
+
29
+ describe "#persist" do
30
+
31
+ def deep_pull_expectation
32
+ lambda {
33
+ collection.expects(:update).with(
34
+ { "_id" => document.id, "addresses._id" => address.id },
35
+ { "$pull" => { "addresses.0.locations" => { "_id" => location.id } } },
36
+ :multi => false,
37
+ :safe => true
38
+ ).returns("Object")
39
+ }
40
+ end
41
+
42
+ def root_pull_expectation
43
+ lambda {
44
+ collection.expects(:update).with(
45
+ { "_id" => document.id },
46
+ { "$pull" => { "addresses" => { "_id" => address.id } } },
47
+ :multi => false,
48
+ :safe => true
49
+ ).returns("Object")
50
+ }
51
+ end
52
+
53
+ def root_unset_expectation
54
+ lambda {
55
+ collection.expects(:update).with(
56
+ { "_id" => document.id },
57
+ { "$unset" => { "email" => true } },
58
+ :multi => false,
59
+ :safe => true
60
+ ).returns("Object")
61
+ }
62
+ end
63
+
64
+ context "when the embedded document is an embeds_one" do
65
+
66
+ before do
67
+ document.email = email
68
+ end
69
+
70
+ context "when the parent is new" do
71
+
72
+ let(:remove) do
73
+ Mongoid::Persistence::RemoveEmbedded.new(email)
74
+ end
75
+
76
+ it "notifies its changes to parent and removes the parent" do
77
+ remove.persist.should == true
78
+ document.email.should be_nil
79
+ end
80
+ end
81
+
82
+ context "when the parent is not new" do
83
+
84
+ let(:remove) do
85
+ Mongoid::Persistence::RemoveEmbedded.new(email)
86
+ end
87
+
88
+ before do
89
+ document.instance_variable_set(:@new_record, false)
90
+ end
91
+
92
+ it "performs an in place $set on the embedded document" do
93
+ root_unset_expectation.call
94
+ remove.persist.should == true
95
+ end
96
+ end
97
+ end
98
+
99
+ context "when the embedded document is an embeds_many" do
100
+
101
+ before do
102
+ address.locations << location
103
+ document.addresses << address
104
+ end
105
+
106
+ context "when the parent is new" do
107
+
108
+ let(:remove) do
109
+ Mongoid::Persistence::RemoveEmbedded.new(address)
110
+ end
111
+
112
+ it "notifies its changes to the parent and removes the document" do
113
+ remove.persist.should == true
114
+ document.addresses.should == []
115
+ end
116
+ end
117
+
118
+ context "when the parent is not new" do
119
+
120
+ let(:remove) do
121
+ Mongoid::Persistence::RemoveEmbedded.new(address)
122
+ end
123
+
124
+ before do
125
+ document.instance_variable_set(:@new_record, false)
126
+ end
127
+
128
+ it "performs a $pull on the embedded array" do
129
+ root_pull_expectation.call
130
+ remove.persist.should == true
131
+ end
132
+ end
133
+
134
+ context "when embedded multiple levels" do
135
+
136
+ let(:remove) do
137
+ Mongoid::Persistence::RemoveEmbedded.new(location)
138
+ end
139
+
140
+ before do
141
+ document.instance_variable_set(:@new_record, false)
142
+ address.instance_variable_set(:@new_record, false)
143
+ end
144
+
145
+ it "performs a $pull on the embedded array" do
146
+ deep_pull_expectation.call
147
+ remove.persist.should == true
148
+ end
149
+ end
150
+ end
151
+ end
152
+ end