mongoid 1.2.14 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (200) hide show
  1. data/lib/mongoid.rb +10 -3
  2. data/lib/mongoid/associations.rb +133 -97
  3. data/lib/mongoid/associations/belongs_to_related.rb +2 -3
  4. data/lib/mongoid/associations/{belongs_to.rb → embedded_in.rb} +14 -6
  5. data/lib/mongoid/associations/{has_many.rb → embeds_many.rb} +89 -31
  6. data/lib/mongoid/associations/{has_one.rb → embeds_one.rb} +8 -7
  7. data/lib/mongoid/associations/has_many_related.rb +52 -7
  8. data/lib/mongoid/associations/has_one_related.rb +8 -4
  9. data/lib/mongoid/associations/meta_data.rb +2 -1
  10. data/lib/mongoid/associations/options.rb +6 -1
  11. data/lib/mongoid/associations/proxy.rb +14 -21
  12. data/lib/mongoid/attributes.rb +27 -12
  13. data/lib/mongoid/collection.rb +4 -3
  14. data/lib/mongoid/collections.rb +41 -0
  15. data/lib/mongoid/collections/master.rb +3 -2
  16. data/lib/mongoid/collections/slaves.rb +3 -2
  17. data/lib/mongoid/components.rb +21 -19
  18. data/lib/mongoid/concern.rb +31 -0
  19. data/lib/mongoid/config.rb +117 -12
  20. data/lib/mongoid/contexts.rb +1 -1
  21. data/lib/mongoid/contexts/enumerable.rb +1 -1
  22. data/lib/mongoid/contexts/mongo.rb +1 -1
  23. data/lib/mongoid/contexts/paging.rb +10 -2
  24. data/lib/mongoid/criterion/inclusion.rb +17 -0
  25. data/lib/mongoid/criterion/optional.rb +1 -1
  26. data/lib/mongoid/dirty.rb +253 -0
  27. data/lib/mongoid/document.rb +81 -52
  28. data/lib/mongoid/errors.rb +32 -1
  29. data/lib/mongoid/extensions.rb +11 -9
  30. data/lib/mongoid/extensions/big_decimal/conversions.rb +2 -2
  31. data/lib/mongoid/extensions/boolean/conversions.rb +8 -2
  32. data/lib/mongoid/extensions/date/conversions.rb +13 -4
  33. data/lib/mongoid/extensions/datetime/conversions.rb +1 -6
  34. data/lib/mongoid/extensions/float/conversions.rb +5 -1
  35. data/lib/mongoid/extensions/hash/assimilation.rb +12 -3
  36. data/lib/mongoid/extensions/hash/conversions.rb +34 -4
  37. data/lib/mongoid/extensions/integer/conversions.rb +5 -1
  38. data/lib/mongoid/extensions/nil/assimilation.rb +4 -0
  39. data/lib/mongoid/extensions/object/conversions.rb +1 -1
  40. data/lib/mongoid/extensions/string/conversions.rb +1 -1
  41. data/lib/mongoid/extensions/symbol/inflections.rb +1 -1
  42. data/lib/mongoid/extensions/time_conversions.rb +35 -0
  43. data/lib/mongoid/extras.rb +6 -9
  44. data/lib/mongoid/factory.rb +2 -1
  45. data/lib/mongoid/field.rb +9 -2
  46. data/lib/mongoid/fields.rb +1 -0
  47. data/lib/mongoid/identity.rb +3 -3
  48. data/lib/mongoid/indexes.rb +3 -3
  49. data/lib/mongoid/memoization.rb +8 -2
  50. data/lib/mongoid/named_scope.rb +0 -3
  51. data/lib/mongoid/observable.rb +30 -0
  52. data/lib/mongoid/paths.rb +62 -0
  53. data/lib/mongoid/persistence.rb +222 -0
  54. data/lib/mongoid/persistence/command.rb +39 -0
  55. data/lib/mongoid/persistence/insert.rb +50 -0
  56. data/lib/mongoid/persistence/insert_embedded.rb +38 -0
  57. data/lib/mongoid/persistence/remove.rb +39 -0
  58. data/lib/mongoid/persistence/remove_all.rb +37 -0
  59. data/lib/mongoid/persistence/remove_embedded.rb +50 -0
  60. data/lib/mongoid/persistence/update.rb +63 -0
  61. data/lib/mongoid/state.rb +28 -21
  62. data/lib/mongoid/timestamps.rb +5 -8
  63. data/lib/mongoid/version.rb +4 -0
  64. data/lib/mongoid/versioning.rb +6 -7
  65. metadata +81 -300
  66. data/.gitignore +0 -6
  67. data/.watchr +0 -29
  68. data/Rakefile +0 -53
  69. data/VERSION +0 -1
  70. data/caliper.yml +0 -4
  71. data/lib/mongoid/collections/mimic.rb +0 -46
  72. data/lib/mongoid/commands.rb +0 -174
  73. data/lib/mongoid/commands/create.rb +0 -21
  74. data/lib/mongoid/commands/delete.rb +0 -16
  75. data/lib/mongoid/commands/delete_all.rb +0 -23
  76. data/lib/mongoid/commands/deletion.rb +0 -18
  77. data/lib/mongoid/commands/destroy.rb +0 -19
  78. data/lib/mongoid/commands/destroy_all.rb +0 -23
  79. data/lib/mongoid/commands/save.rb +0 -27
  80. data/lib/mongoid/extensions/time/conversions.rb +0 -18
  81. data/mongoid.gemspec +0 -395
  82. data/perf/benchmark.rb +0 -77
  83. data/spec/integration/mongoid/associations_spec.rb +0 -340
  84. data/spec/integration/mongoid/attributes_spec.rb +0 -22
  85. data/spec/integration/mongoid/commands_spec.rb +0 -218
  86. data/spec/integration/mongoid/contexts/enumerable_spec.rb +0 -33
  87. data/spec/integration/mongoid/criteria_spec.rb +0 -272
  88. data/spec/integration/mongoid/document_spec.rb +0 -593
  89. data/spec/integration/mongoid/extensions_spec.rb +0 -26
  90. data/spec/integration/mongoid/finders_spec.rb +0 -119
  91. data/spec/integration/mongoid/inheritance_spec.rb +0 -137
  92. data/spec/integration/mongoid/named_scope_spec.rb +0 -46
  93. data/spec/models/address.rb +0 -39
  94. data/spec/models/animal.rb +0 -6
  95. data/spec/models/callbacks.rb +0 -18
  96. data/spec/models/comment.rb +0 -8
  97. data/spec/models/country_code.rb +0 -6
  98. data/spec/models/employer.rb +0 -5
  99. data/spec/models/game.rb +0 -7
  100. data/spec/models/inheritance.rb +0 -56
  101. data/spec/models/location.rb +0 -5
  102. data/spec/models/mixed_drink.rb +0 -4
  103. data/spec/models/name.rb +0 -13
  104. data/spec/models/namespacing.rb +0 -11
  105. data/spec/models/patient.rb +0 -4
  106. data/spec/models/person.rb +0 -99
  107. data/spec/models/pet.rb +0 -7
  108. data/spec/models/pet_owner.rb +0 -6
  109. data/spec/models/phone.rb +0 -7
  110. data/spec/models/post.rb +0 -15
  111. data/spec/models/translation.rb +0 -5
  112. data/spec/models/vet_visit.rb +0 -5
  113. data/spec/spec.opts +0 -3
  114. data/spec/spec_helper.rb +0 -31
  115. data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +0 -145
  116. data/spec/unit/mongoid/associations/belongs_to_spec.rb +0 -193
  117. data/spec/unit/mongoid/associations/has_many_related_spec.rb +0 -420
  118. data/spec/unit/mongoid/associations/has_many_spec.rb +0 -519
  119. data/spec/unit/mongoid/associations/has_one_related_spec.rb +0 -179
  120. data/spec/unit/mongoid/associations/has_one_spec.rb +0 -282
  121. data/spec/unit/mongoid/associations/meta_data_spec.rb +0 -88
  122. data/spec/unit/mongoid/associations/options_spec.rb +0 -192
  123. data/spec/unit/mongoid/associations_spec.rb +0 -595
  124. data/spec/unit/mongoid/attributes_spec.rb +0 -507
  125. data/spec/unit/mongoid/callbacks_spec.rb +0 -55
  126. data/spec/unit/mongoid/collection_spec.rb +0 -187
  127. data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +0 -75
  128. data/spec/unit/mongoid/collections/master_spec.rb +0 -41
  129. data/spec/unit/mongoid/collections/mimic_spec.rb +0 -43
  130. data/spec/unit/mongoid/collections/slaves_spec.rb +0 -81
  131. data/spec/unit/mongoid/commands/create_spec.rb +0 -30
  132. data/spec/unit/mongoid/commands/delete_all_spec.rb +0 -58
  133. data/spec/unit/mongoid/commands/delete_spec.rb +0 -38
  134. data/spec/unit/mongoid/commands/destroy_all_spec.rb +0 -23
  135. data/spec/unit/mongoid/commands/destroy_spec.rb +0 -50
  136. data/spec/unit/mongoid/commands/save_spec.rb +0 -105
  137. data/spec/unit/mongoid/commands_spec.rb +0 -275
  138. data/spec/unit/mongoid/config_spec.rb +0 -172
  139. data/spec/unit/mongoid/contexts/enumerable_spec.rb +0 -421
  140. data/spec/unit/mongoid/contexts/mongo_spec.rb +0 -682
  141. data/spec/unit/mongoid/contexts_spec.rb +0 -25
  142. data/spec/unit/mongoid/criteria_spec.rb +0 -824
  143. data/spec/unit/mongoid/criterion/complex_spec.rb +0 -19
  144. data/spec/unit/mongoid/criterion/exclusion_spec.rb +0 -91
  145. data/spec/unit/mongoid/criterion/inclusion_spec.rb +0 -219
  146. data/spec/unit/mongoid/criterion/optional_spec.rb +0 -319
  147. data/spec/unit/mongoid/cursor_spec.rb +0 -74
  148. data/spec/unit/mongoid/deprecation_spec.rb +0 -24
  149. data/spec/unit/mongoid/document_spec.rb +0 -952
  150. data/spec/unit/mongoid/errors_spec.rb +0 -103
  151. data/spec/unit/mongoid/extensions/array/accessors_spec.rb +0 -50
  152. data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +0 -24
  153. data/spec/unit/mongoid/extensions/array/conversions_spec.rb +0 -35
  154. data/spec/unit/mongoid/extensions/array/parentization_spec.rb +0 -20
  155. data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +0 -22
  156. data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +0 -22
  157. data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +0 -49
  158. data/spec/unit/mongoid/extensions/date/conversions_spec.rb +0 -102
  159. data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +0 -70
  160. data/spec/unit/mongoid/extensions/float/conversions_spec.rb +0 -61
  161. data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +0 -184
  162. data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +0 -46
  163. data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +0 -21
  164. data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +0 -17
  165. data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +0 -14
  166. data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +0 -61
  167. data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +0 -24
  168. data/spec/unit/mongoid/extensions/object/conversions_spec.rb +0 -57
  169. data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +0 -34
  170. data/spec/unit/mongoid/extensions/string/conversions_spec.rb +0 -17
  171. data/spec/unit/mongoid/extensions/string/inflections_spec.rb +0 -208
  172. data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +0 -91
  173. data/spec/unit/mongoid/extensions/time/conversions_spec.rb +0 -70
  174. data/spec/unit/mongoid/extras_spec.rb +0 -102
  175. data/spec/unit/mongoid/factory_spec.rb +0 -31
  176. data/spec/unit/mongoid/field_spec.rb +0 -143
  177. data/spec/unit/mongoid/fields_spec.rb +0 -181
  178. data/spec/unit/mongoid/finders_spec.rb +0 -404
  179. data/spec/unit/mongoid/identity_spec.rb +0 -109
  180. data/spec/unit/mongoid/indexes_spec.rb +0 -93
  181. data/spec/unit/mongoid/javascript_spec.rb +0 -48
  182. data/spec/unit/mongoid/matchers/all_spec.rb +0 -27
  183. data/spec/unit/mongoid/matchers/default_spec.rb +0 -27
  184. data/spec/unit/mongoid/matchers/exists_spec.rb +0 -56
  185. data/spec/unit/mongoid/matchers/gt_spec.rb +0 -39
  186. data/spec/unit/mongoid/matchers/gte_spec.rb +0 -49
  187. data/spec/unit/mongoid/matchers/in_spec.rb +0 -27
  188. data/spec/unit/mongoid/matchers/lt_spec.rb +0 -39
  189. data/spec/unit/mongoid/matchers/lte_spec.rb +0 -49
  190. data/spec/unit/mongoid/matchers/ne_spec.rb +0 -27
  191. data/spec/unit/mongoid/matchers/nin_spec.rb +0 -27
  192. data/spec/unit/mongoid/matchers/size_spec.rb +0 -27
  193. data/spec/unit/mongoid/matchers_spec.rb +0 -329
  194. data/spec/unit/mongoid/memoization_spec.rb +0 -75
  195. data/spec/unit/mongoid/named_scope_spec.rb +0 -123
  196. data/spec/unit/mongoid/scope_spec.rb +0 -240
  197. data/spec/unit/mongoid/state_spec.rb +0 -83
  198. data/spec/unit/mongoid/timestamps_spec.rb +0 -25
  199. data/spec/unit/mongoid/versioning_spec.rb +0 -41
  200. data/spec/unit/mongoid_spec.rb +0 -46
@@ -1,507 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Attributes do
4
-
5
- describe ".accepts_nested_attributes_for" do
6
-
7
- before do
8
- @person = Person.new
9
- end
10
-
11
- it "adds a setter for the association attributes" do
12
- @person.should respond_to(:addresses_attributes=)
13
- end
14
-
15
- describe "#association_attributes=" do
16
-
17
- context "on a has many association" do
18
-
19
- context "when a reject block supplied" do
20
-
21
- before do
22
- @attributes = {
23
- "0" => { "city" => "San Francisco" }
24
- }
25
- @person.addresses_attributes = @attributes
26
- end
27
-
28
- it "removes the attributes that match" do
29
- @person.addresses.should be_empty
30
- end
31
-
32
- end
33
-
34
- context "when association is empty" do
35
-
36
- before do
37
- @attributes = {
38
- "0" => { "street" => "Folsom", "city" => "San Francisco" }
39
- }
40
- @person.addresses_attributes = @attributes
41
- end
42
-
43
- it "adds a new document to the association" do
44
- address = @person.addresses.first
45
- address.street.should == "Folsom"
46
- address.city.should == "San Francisco"
47
- end
48
-
49
- end
50
-
51
- context "when association is not empty" do
52
-
53
- before do
54
- @person = Person.new
55
- @person.addresses.build(:street => "Broadway", :city => "New York")
56
- @attributes = {
57
- "0" => { "street" => "Folsom", "city" => "San Francisco" }
58
- }
59
- @person.addresses_attributes = @attributes
60
- end
61
-
62
- it "updates the existing attributes on the association" do
63
- @person.addresses.size.should == 2
64
- end
65
-
66
- end
67
-
68
- end
69
-
70
- context "on a has one association" do
71
-
72
- before do
73
- @person = Person.new
74
- @attributes = {
75
- "first_name" => "Fernando", "last_name" => "Torres"
76
- }
77
- @person.name_attributes = @attributes
78
- end
79
-
80
- it "replaces the document on the association" do
81
- name = @person.name
82
- name.first_name.should == "Fernando"
83
- name.last_name.should == "Torres"
84
- end
85
-
86
- end
87
-
88
- end
89
-
90
- end
91
-
92
- describe "#_id" do
93
-
94
- before do
95
- @person = Person.new
96
- end
97
-
98
- it "delegates to #id" do
99
- @person._id.should == @person.id
100
- end
101
-
102
- end
103
-
104
- describe "#_id=" do
105
-
106
- before do
107
- @person = Person.new
108
- end
109
-
110
- it "delegates to #id=" do
111
- @id = Mongo::ObjectID.new.to_s
112
- @person._id = @id
113
- @person.id.should == @id
114
- end
115
-
116
- end
117
-
118
- describe "#method_missing" do
119
-
120
- before do
121
- Mongoid.configure.allow_dynamic_fields = true
122
- @attributes = {
123
- :testing => "Testing"
124
- }
125
- @person = Person.new(@attributes)
126
- end
127
-
128
- context "when an attribute exists" do
129
-
130
- it "allows the getter" do
131
- @person.testing.should == "Testing"
132
- end
133
-
134
- it "allows the setter" do
135
- @person.testing = "Test"
136
- @person.testing.should == "Test"
137
- end
138
-
139
- end
140
-
141
- end
142
-
143
- describe "#process" do
144
-
145
- context "when passing non accessible fields" do
146
-
147
- before do
148
- @person = Person.new(:owner_id => 6)
149
- end
150
-
151
- it "does not set the value" do
152
- @person.owner_id.should be_nil
153
- end
154
- end
155
-
156
- context "when attributes dont have fields defined" do
157
-
158
- before do
159
- @attributes = {
160
- :nofieldstring => "Testing",
161
- :nofieldint => 5,
162
- :employer => Employer.new
163
- }
164
- end
165
-
166
- context "when allowing dynamic fields" do
167
-
168
- before do
169
- Mongoid.configure.allow_dynamic_fields = true
170
- @person = Person.new(@attributes)
171
- end
172
-
173
- context "when attribute is a string" do
174
-
175
- it "adds the string to the attributes" do
176
- @person.attributes[:nofieldstring].should == "Testing"
177
- end
178
-
179
- end
180
-
181
- context "when attribute is not a string" do
182
-
183
- it "adds a cast value to the attributes" do
184
- @person.attributes[:nofieldint].should == 5
185
- end
186
-
187
- end
188
-
189
- end
190
-
191
- context "when not allowing dynamic fields" do
192
-
193
- before do
194
- Mongoid.configure.allow_dynamic_fields = false
195
- Person.fields.delete(:nofieldstring)
196
- @attributes = {
197
- :nofieldstring => "Testing"
198
- }
199
- end
200
-
201
- after do
202
- Mongoid.configure.allow_dynamic_fields = true
203
- end
204
-
205
- it "raises an error" do
206
- lambda { Person.new(@attributes) }.should raise_error
207
- end
208
-
209
- end
210
-
211
- end
212
-
213
- context "when supplied hash has values" do
214
-
215
- before do
216
- @attributes = {
217
- :_id => "1",
218
- :title => "value",
219
- :age => "30",
220
- :terms => "true",
221
- :score => "",
222
- :name => {
223
- :_id => "2", :first_name => "Test", :last_name => "User"
224
- },
225
- :addresses => [
226
- { :_id => "3", :street => "First Street" },
227
- { :_id => "4", :street => "Second Street" }
228
- ]
229
- }
230
- end
231
-
232
- it "returns properly cast attributes" do
233
- attrs = Person.new(@attributes).attributes
234
- attrs[:age].should == 30
235
- attrs[:terms].should == true
236
- attrs[:_id].should == "1"
237
- attrs[:score].should be_nil
238
- end
239
-
240
- end
241
-
242
- context "when associations provided in the attributes" do
243
-
244
- context "when association is a has_one" do
245
-
246
- before do
247
- @name = Name.new(:first_name => "Testy")
248
- @attributes = {
249
- :name => @name
250
- }
251
- @person = Person.new(@attributes)
252
- end
253
-
254
- it "sets the associations" do
255
- @person.name.should == @name
256
- end
257
-
258
- end
259
-
260
- context "when association is a belongs_to" do
261
-
262
- before do
263
- @person = Person.new
264
- @name = Name.new(:first_name => "Tyler", :person => @person)
265
- end
266
-
267
- it "sets the association" do
268
- @name.person.should == @person
269
- end
270
-
271
- end
272
-
273
- end
274
-
275
- context "when non-associations provided in the attributes" do
276
-
277
- before do
278
- @employer = Employer.new
279
- @attributes = { :employer_id => @employer.id, :title => "Sir" }
280
- @person = Person.new(@attributes)
281
- end
282
-
283
- it "calls the setter for the association" do
284
- @person.employer_id.should == "1"
285
- end
286
-
287
- end
288
-
289
- context "when an empty array is provided in the attributes" do
290
-
291
- before do
292
- @attributes = {
293
- :aliases => []
294
- }
295
- @person = Person.new(@attributes)
296
- end
297
-
298
- it "sets the empty array" do
299
- @person.aliases.should == []
300
- end
301
-
302
- end
303
-
304
- context "when an empty hash is provided in the attributes" do
305
-
306
- before do
307
- @attributes = {
308
- :map => {}
309
- }
310
- @person = Person.new(@attributes)
311
- end
312
-
313
- it "sets the empty hash" do
314
- @person.map.should == {}
315
- end
316
-
317
- end
318
-
319
- end
320
-
321
- context "updating when attributes already exist" do
322
-
323
- before do
324
- @person = Person.new(:title => "Sir")
325
- @attributes = { :dob => "2000-01-01" }
326
- end
327
-
328
- it "only overwrites supplied attributes" do
329
- @person.process(@attributes)
330
- @person.title.should == "Sir"
331
- end
332
-
333
- end
334
-
335
- describe "#read_attribute" do
336
-
337
- context "when attribute does not exist" do
338
-
339
- before do
340
- @person = Person.new
341
- end
342
-
343
- it "returns the default value" do
344
- @person.age.should == 100
345
- @person.pets.should == false
346
- end
347
-
348
- end
349
-
350
- context "when attribute is not accessible" do
351
-
352
- before do
353
- @person = Person.new
354
- @person.owner_id = 5
355
- end
356
-
357
- it "returns the value" do
358
- @person.read_attribute(:owner_id).should == 5
359
- end
360
- end
361
-
362
- end
363
-
364
- describe "#remove_attribute" do
365
-
366
- context "when the attribute exists" do
367
-
368
- it "removes the attribute" do
369
- person = Person.new(:title => "Sir")
370
- person.remove_attribute(:title)
371
- person.title.should be_nil
372
- end
373
-
374
- end
375
-
376
- context "when the attribute does not exist" do
377
-
378
- it "does nothing" do
379
- person = Person.new
380
- person.remove_attribute(:title)
381
- person.title.should be_nil
382
- end
383
-
384
- end
385
-
386
- end
387
-
388
- describe "#write_attribute" do
389
-
390
- context "when attribute does not exist" do
391
-
392
- before do
393
- @person = Person.new
394
- end
395
-
396
- it "returns the default value" do
397
- @person.age = nil
398
- @person.age.should == 100
399
- end
400
-
401
- end
402
-
403
- context "when field has a default value" do
404
-
405
- before do
406
- @person = Person.new
407
- end
408
-
409
- it "should allow overwriting of the default value" do
410
- @person.terms = true
411
- @person.terms.should be_true
412
- end
413
-
414
- end
415
-
416
- end
417
-
418
- describe "#attributes=" do
419
- it 'should be a alias of write_attributes' do
420
-
421
- end
422
- end
423
-
424
- [:attributes=, :write_attributes].each do |method|
425
- describe "##{method}" do
426
-
427
- context "typecasting" do
428
-
429
- before do
430
- @person = Person.new
431
- @attributes = { :age => "50" }
432
- end
433
-
434
- it "properly casts values" do
435
- @person.send(method, @attributes)
436
- @person.age.should == 50
437
- end
438
-
439
- it "allows passing of nil" do
440
- @person.send(method, nil)
441
- @person.age.should == 100
442
- end
443
-
444
- end
445
-
446
- context "on a parent document" do
447
-
448
- context "when the parent has a has many through a has one" do
449
-
450
- before do
451
- @owner = PetOwner.new(:title => "Mr")
452
- @pet = Pet.new(:name => "Fido")
453
- @owner.pet = @pet
454
- @vet_visit = VetVisit.new(:date => Date.today)
455
- @pet.vet_visits = [@vet_visit]
456
- end
457
-
458
- it "does not overwrite child attributes if not in the hash" do
459
- @owner.send(method, { :pet => { :name => "Bingo" } })
460
- @owner.pet.name.should == "Bingo"
461
- @owner.pet.vet_visits.size.should == 1
462
- end
463
-
464
- end
465
-
466
- end
467
-
468
- context "on a child document" do
469
-
470
- context "when child is part of a has one" do
471
-
472
- before do
473
- @person = Person.new(:title => "Sir", :age => 30)
474
- @name = Name.new(:first_name => "Test", :last_name => "User")
475
- @person.name = @name
476
- end
477
-
478
- it "sets the child attributes on the parent" do
479
- @name.send(method, :first_name => "Test2", :last_name => "User2")
480
- @person.attributes[:name].should ==
481
- { "_id" => "test-user", "first_name" => "Test2", "last_name" => "User2", "_type" => "Name" }
482
- end
483
-
484
- end
485
-
486
- context "when child is part of a has many" do
487
-
488
- before do
489
- @person = Person.new(:title => "Sir")
490
- @address = Address.new(:street => "Test")
491
- @person.addresses << @address
492
- end
493
-
494
- it "updates the child attributes on the parent" do
495
- @address.send(method, "street" => "Test2")
496
- @person.attributes[:addresses].should ==
497
- [ { "_id" => "test", "street" => "Test2", "_type" => "Address" } ]
498
- end
499
-
500
- end
501
-
502
- end
503
- end
504
-
505
- end
506
-
507
- end