mongodoc 0.1.2 → 0.2.0

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 (47) hide show
  1. data/README.textile +143 -0
  2. data/Rakefile +35 -3
  3. data/VERSION +1 -1
  4. data/examples/simple_document.rb +35 -0
  5. data/examples/simple_object.rb +32 -0
  6. data/features/finders.feature +72 -0
  7. data/features/mongodoc_base.feature +12 -2
  8. data/features/named_scopes.feature +66 -0
  9. data/features/new_record.feature +36 -0
  10. data/features/partial_updates.feature +105 -0
  11. data/features/step_definitions/criteria_steps.rb +4 -41
  12. data/features/step_definitions/document_steps.rb +56 -5
  13. data/features/step_definitions/documents.rb +14 -3
  14. data/features/step_definitions/finder_steps.rb +15 -0
  15. data/features/step_definitions/named_scope_steps.rb +18 -0
  16. data/features/step_definitions/partial_update_steps.rb +32 -0
  17. data/features/step_definitions/query_steps.rb +51 -0
  18. data/features/using_criteria.feature +5 -1
  19. data/lib/mongodoc/attributes.rb +76 -63
  20. data/lib/mongodoc/collection.rb +9 -9
  21. data/lib/mongodoc/criteria.rb +152 -161
  22. data/lib/mongodoc/cursor.rb +7 -5
  23. data/lib/mongodoc/document.rb +95 -31
  24. data/lib/mongodoc/finders.rb +29 -0
  25. data/lib/mongodoc/named_scope.rb +68 -0
  26. data/lib/mongodoc/parent_proxy.rb +15 -6
  27. data/lib/mongodoc/proxy.rb +22 -13
  28. data/lib/mongodoc.rb +3 -3
  29. data/mongodoc.gemspec +42 -14
  30. data/perf/mongodoc_runner.rb +90 -0
  31. data/perf/ruby_driver_runner.rb +64 -0
  32. data/spec/attributes_spec.rb +46 -12
  33. data/spec/collection_spec.rb +23 -23
  34. data/spec/criteria_spec.rb +124 -187
  35. data/spec/cursor_spec.rb +21 -17
  36. data/spec/document_ext.rb +2 -2
  37. data/spec/document_spec.rb +187 -218
  38. data/spec/embedded_save_spec.rb +104 -0
  39. data/spec/finders_spec.rb +81 -0
  40. data/spec/hash_matchers.rb +27 -0
  41. data/spec/named_scope_spec.rb +82 -0
  42. data/spec/new_record_spec.rb +216 -0
  43. data/spec/parent_proxy_spec.rb +8 -6
  44. data/spec/proxy_spec.rb +80 -0
  45. data/spec/spec_helper.rb +2 -0
  46. metadata +35 -7
  47. data/README.rdoc +0 -75
@@ -3,42 +3,67 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
3
3
  describe "MongoDoc::Document" do
4
4
 
5
5
  context "satisfies form_for requirements" do
6
- class FormForTest < MongoDoc::Document
6
+ class FormForTest
7
+ include MongoDoc::Document
8
+
9
+ key :data
7
10
  end
8
-
11
+
9
12
  before do
10
13
  @doc = FormForTest.new
11
14
  @doc._id = '1'
12
15
  end
13
-
16
+
14
17
  it "#id returns the _id" do
15
18
  @doc.id.should == @doc._id
16
19
  end
17
-
20
+
18
21
  it "#to_param returns the _id" do
19
22
  @doc.to_param.should == @doc._id
20
23
  end
21
-
24
+
22
25
  context "#new_record?" do
23
26
  it "is true when the object does not have an _id" do
24
27
  @doc._id = nil
25
28
  @doc.should be_new_record
26
29
  end
27
-
30
+
28
31
  it "is false when the object has an id" do
29
32
  @doc.should_not be_new_record
30
33
  end
31
34
  end
35
+
36
+ context "attributes" do
37
+ it "has an initialize method that takes a hash" do
38
+ data = 'data'
39
+ FormForTest.new(:data => data).data.should == data
40
+ end
41
+
42
+ it "can set attributes from a hash" do
43
+ test = FormForTest.new
44
+ data = 'data'
45
+ test.attributes = {:data => data}
46
+ test.data.should == data
47
+ end
48
+
49
+ it "returns all its attributes" do
50
+ data = 'data'
51
+ test = FormForTest.new(:data => data)
52
+ test.attributes.should == {:data => data}
53
+ end
54
+ end
32
55
  end
33
56
 
34
57
  context "validations" do
35
- class SimpleValidationTest < MongoDoc::Document
58
+ class SimpleValidationTest
59
+ include MongoDoc::Document
60
+
36
61
  key :data
37
62
  validates_presence_of :data
38
63
  end
39
64
 
40
- it "are part of Base" do
41
- Validatable.should === MongoDoc::Document.new
65
+ it "are included by MongoDoc::Document" do
66
+ Validatable.should === SimpleValidationTest.new
42
67
  end
43
68
 
44
69
  it "valid? fails when a document is invalid" do
@@ -48,29 +73,19 @@ describe "MongoDoc::Document" do
48
73
  end
49
74
  end
50
75
 
51
- context ".criteria" do
52
- class CriteriaTest < MongoDoc::Document
53
- key :data
54
- end
55
-
56
- it "creates a new criteria for the document" do
57
- CriteriaTest.criteria.should be_a_kind_of(MongoDoc::Criteria)
58
- end
59
-
60
- it "sets the criteria klass" do
61
- CriteriaTest.criteria.klass.should == CriteriaTest
62
- end
63
- end
64
-
65
76
  context "saving" do
66
- class SaveRoot < MongoDoc::Document
77
+ class SaveRoot
78
+ include MongoDoc::Document
79
+
67
80
  has_many :save_children
68
81
  end
69
-
70
- class SaveChild < MongoDoc::Document
82
+
83
+ class SaveChild
84
+ include MongoDoc::Document
85
+
71
86
  key :data
72
87
  end
73
-
88
+
74
89
  before do
75
90
  @root = SaveRoot.new
76
91
  @root.stub(:_save)
@@ -84,13 +99,13 @@ describe "MongoDoc::Document" do
84
99
  @root.should_receive(:save).with(validate)
85
100
  @child.save(validate)
86
101
  end
87
-
102
+
88
103
  context "when validating" do
89
104
  it "validates" do
90
105
  @root.should_receive(:valid?)
91
106
  @root.save(true)
92
107
  end
93
-
108
+
94
109
  context "and valid" do
95
110
  it "delegates to _save" do
96
111
  @root.should_receive(:_save).with(false)
@@ -104,21 +119,21 @@ describe "MongoDoc::Document" do
104
119
  @root.save(true).should == id
105
120
  end
106
121
  end
107
-
122
+
108
123
  context "and invalid" do
109
124
  it "does not call _save" do
110
125
  @root.stub(:valid?).and_return(false)
111
126
  @root.should_not_receive(:_save)
112
127
  @root.save(true)
113
128
  end
114
-
129
+
115
130
  it "returns false" do
116
131
  @root.stub(:valid?).and_return(false)
117
132
  @root.save(true).should be_false
118
133
  end
119
134
  end
120
135
  end
121
-
136
+
122
137
  context "when not validating" do
123
138
  it "does not validate" do
124
139
  @root.should_not_receive(:valid?)
@@ -137,18 +152,18 @@ describe "MongoDoc::Document" do
137
152
  end
138
153
  end
139
154
  end
140
-
155
+
141
156
  context "#save!" do
142
157
  it "delegates to the root" do
143
158
  @root.should_receive(:save!)
144
159
  @child.save!
145
160
  end
146
-
161
+
147
162
  it "validates" do
148
163
  @root.should_receive(:valid?).and_return(true)
149
164
  @root.save!
150
165
  end
151
-
166
+
152
167
  it "returns the result of _save if valid" do
153
168
  id = 'id'
154
169
  @root.stub(:valid?).and_return(true)
@@ -164,23 +179,24 @@ describe "MongoDoc::Document" do
164
179
  end
165
180
  end
166
181
  end
167
-
182
+
168
183
  context "#_save" do
169
- class SaveTest < MongoDoc::Document
184
+ class SaveTest
185
+ include MongoDoc::Document
170
186
  end
171
-
187
+
172
188
  before do
173
189
  @collection = stub('collection')
174
190
  @doc = SaveTest.new
175
191
  @doc.stub(:_collection).and_return(@collection)
176
192
  end
177
-
193
+
178
194
  it "delegates to the collection save" do
179
195
  safe = true
180
196
  @collection.should_receive(:save)
181
197
  @doc.send(:_save, safe)
182
198
  end
183
-
199
+
184
200
  it "sets the _id of the document" do
185
201
  id = 'id'
186
202
  @collection.stub(:save).and_return(id)
@@ -196,7 +212,9 @@ describe "MongoDoc::Document" do
196
212
  end
197
213
 
198
214
  context "creating" do
199
- class CreateTest < MongoDoc::Document
215
+ class CreateTest
216
+ include MongoDoc::Document
217
+
200
218
  key :data
201
219
  validates_presence_of :data
202
220
  end
@@ -205,21 +223,21 @@ describe "MongoDoc::Document" do
205
223
  @value = 'value'
206
224
  CreateTest.stub(:_create).and_return(true)
207
225
  end
208
-
226
+
209
227
  context ".create" do
210
228
  it "creates a new document" do
211
229
  obj = CreateTest.new
212
230
  CreateTest.should_receive(:new).and_return(obj)
213
231
  CreateTest.create
214
232
  end
215
-
233
+
216
234
  it "delegates to _create with safe => false" do
217
235
  obj = CreateTest.new(:data => @value)
218
236
  CreateTest.stub(:new).and_return(obj)
219
237
  CreateTest.should_receive(:_create).with(obj, false).and_return(true)
220
238
  CreateTest.create(:data => @value)
221
239
  end
222
-
240
+
223
241
  it "sets the passed attributes" do
224
242
  CreateTest.create(:data => @value).data.should == @value
225
243
  end
@@ -227,7 +245,7 @@ describe "MongoDoc::Document" do
227
245
  it "returns a valid document" do
228
246
  CreateTest.should === CreateTest.create(:data => @value)
229
247
  end
230
-
248
+
231
249
  it "validates" do
232
250
  CreateTest.create.errors.should_not be_empty
233
251
  end
@@ -236,21 +254,21 @@ describe "MongoDoc::Document" do
236
254
  CreateTest.should === CreateTest.create
237
255
  end
238
256
  end
239
-
257
+
240
258
  context ".create!" do
241
259
  it "creates a new document" do
242
260
  obj = CreateTest.new
243
261
  CreateTest.should_receive(:new).and_return(obj)
244
262
  CreateTest.create! rescue nil
245
263
  end
246
-
264
+
247
265
  it "delegates to _create with safe => true" do
248
266
  obj = CreateTest.new(:data => @value)
249
267
  CreateTest.stub(:new).and_return(obj)
250
268
  CreateTest.should_receive(:_create).with(obj, true).and_return(true)
251
269
  CreateTest.create!(:data => @value)
252
270
  end
253
-
271
+
254
272
  it "sets the passed attributes" do
255
273
  CreateTest.create!(:data => @value).data.should == @value
256
274
  end
@@ -258,7 +276,7 @@ describe "MongoDoc::Document" do
258
276
  it "returns a valid document" do
259
277
  CreateTest.should === CreateTest.create!(:data => @value)
260
278
  end
261
-
279
+
262
280
  it "raises when invalid" do
263
281
  expect do
264
282
  CreateTest.create!
@@ -268,62 +286,68 @@ describe "MongoDoc::Document" do
268
286
  end
269
287
 
270
288
  context "#_create" do
271
- class CreateTest < MongoDoc::Document
289
+ class CreateTest
290
+ include MongoDoc::Document
272
291
  end
273
-
292
+
274
293
  before do
275
294
  @collection = stub('collection')
276
295
  @collection.stub(:insert)
277
296
  @doc = CreateTest.new
278
297
  CreateTest.stub(:collection).and_return(@collection)
279
298
  end
280
-
299
+
281
300
  it "delegates to the collection insert with safe" do
282
301
  safe = true
283
302
  @collection.should_receive(:insert).with(@doc, hash_including(:safe => safe))
284
303
  CreateTest.send(:_create, @doc, safe)
285
304
  end
286
-
305
+
287
306
  it "sets the _id of the document" do
288
307
  id = 'id'
289
308
  @collection.stub(:insert).and_return(id)
290
309
  CreateTest.send(:_create, @doc, false)
291
310
  @doc._id.should == id
292
311
  end
293
-
312
+
294
313
  it "returns the _id" do
295
314
  id = 'id'
296
315
  @collection.stub(:insert).and_return(id)
297
316
  CreateTest.send(:_create, @doc, false).should == id
298
- end
317
+ end
299
318
  end
300
319
 
301
320
  context "updating attributes" do
302
- class UpdateAttributesRoot < MongoDoc::Document
321
+ class UpdateAttributesRoot
322
+ include MongoDoc::Document
323
+
303
324
  has_one :update_attribute_child
304
325
  end
305
-
306
- class UpdateAttributesChild < MongoDoc::Document
326
+
327
+ class UpdateAttributesChild
328
+ include MongoDoc::Document
329
+
307
330
  key :data
308
331
  end
309
-
332
+
310
333
  before do
311
334
  @data = 'data'
312
335
  @doc = UpdateAttributesChild.new
313
336
  UpdateAttributesRoot.new.update_attribute_child = @doc
314
337
  @attrs = {:data => @data}
315
338
  @path_attrs = {'update_attribute_child.data' => @data}
316
- @doc.stub(:_propose_update_attributes)
339
+ @doc.stub(:_naive_update_attributes)
317
340
  end
318
341
 
319
342
  context "#update_attributes" do
343
+
320
344
  it "sets the attributes" do
321
345
  @doc.update_attributes(@attrs)
322
346
  @doc.data.should == @data
323
347
  end
324
348
 
325
349
  it "normalizes the attributes to the parent" do
326
- @doc.should_receive(:path_to_root)
350
+ @doc.should_receive(:_path_to_root)
327
351
  @doc.update_attributes(@attrs)
328
352
  end
329
353
 
@@ -331,26 +355,36 @@ describe "MongoDoc::Document" do
331
355
  @doc.should_receive(:valid?)
332
356
  @doc.update_attributes(@attrs)
333
357
  end
334
-
358
+
335
359
  it "returns false if the object is not valid" do
336
360
  @doc.stub(:valid?).and_return(false)
337
361
  @doc.update_attributes(@attrs).should be_false
338
362
  end
339
-
363
+
340
364
  context "if valid" do
341
- it "delegates to _propose_update_attributes" do
342
- @doc.should_receive(:_propose_update_attributes).with(@doc, @path_attrs, false)
343
- @doc.update_attributes(@attrs)
365
+ context "and strict" do
366
+ it "delegates to _strict_update_attributes" do
367
+ strict_attrs = @attrs.merge(:__strict__ => true)
368
+ @doc.should_receive(:_strict_update_attributes).with(@path_attrs, false)
369
+ @doc.update_attributes(strict_attrs)
370
+ end
344
371
  end
345
372
 
346
- it "returns the result of _propose_update_attributes" do
373
+ context "and naive" do
374
+ it "delegates to _naive_update_attributes" do
375
+ @doc.should_receive(:_naive_update_attributes).with(@path_attrs, false)
376
+ @doc.update_attributes(@attrs)
377
+ end
378
+ end
379
+
380
+ it "returns the result of _naive_update_attributes" do
347
381
  result = 'check'
348
- @doc.stub(:_propose_update_attributes).and_return(result)
382
+ @doc.stub(:_naive_update_attributes).and_return(result)
349
383
  @doc.update_attributes(@attrs).should == result
350
384
  end
351
385
  end
352
386
  end
353
-
387
+
354
388
  context "#update_attributes!" do
355
389
  it "sets the attributes" do
356
390
  @doc.update_attributes!(@attrs)
@@ -358,7 +392,7 @@ describe "MongoDoc::Document" do
358
392
  end
359
393
 
360
394
  it "normalizes the attributes to the parent" do
361
- @doc.should_receive(:path_to_root)
395
+ @doc.should_receive(:_path_to_root)
362
396
  @doc.update_attributes!(@attrs)
363
397
  end
364
398
 
@@ -375,186 +409,120 @@ describe "MongoDoc::Document" do
375
409
  end
376
410
 
377
411
  context "if valid" do
378
- it "delegates to _propose_update_attributes with safe == true" do
379
- @doc.should_receive(:_propose_update_attributes).with(@doc, @path_attrs, true)
380
- @doc.update_attributes!(@attrs)
412
+ context "and strict" do
413
+ it "delegates to _strict_update_attributes with safe == true" do
414
+ strict_attrs = @attrs.merge(:__strict__ => true)
415
+ @doc.should_receive(:_strict_update_attributes).with(@path_attrs, true)
416
+ @doc.update_attributes!(strict_attrs)
417
+ end
418
+ end
419
+
420
+ context "and naive" do
421
+ it "delegates to _naive_update_attributes with safe == true" do
422
+ @doc.should_receive(:_naive_update_attributes).with(@path_attrs, true)
423
+ @doc.update_attributes!(@attrs)
424
+ end
381
425
  end
382
-
383
- it "returns the result of _propose_update_attributes" do
426
+
427
+ it "returns the result of _naive_update_attributes" do
384
428
  result = 'check'
385
- @doc.stub(:_propose_update_attributes).and_return(result)
429
+ @doc.stub(:_naive_update_attributes).and_return(result)
386
430
  @doc.update_attributes!(@attrs).should == result
387
431
  end
388
432
  end
389
433
  end
390
434
  end
391
-
392
- context "#_propose_update_attributes" do
393
- class ProposeUpdateAttributes < MongoDoc::Document
394
- end
395
435
 
396
- before do
397
- @attrs = {:data => 1}
398
- @safe = true
436
+ context "#_naive_update_attributes" do
437
+ class NaiveUpdateAttributes
438
+ include MongoDoc::Document
399
439
  end
400
-
401
- context "when not a child" do
402
- before do
403
- @obj = ProposeUpdateAttributes.new
404
- end
405
-
406
- it "delegates to _update_attributes when not a child" do
407
- @obj.should_receive(:_update_attributes).with(@attrs, @safe)
408
- @obj.send(:_propose_update_attributes, @obj, @attrs, @safe)
409
- end
410
-
411
- it "returns the results of _update_attributes" do
412
- result = 'check'
413
- @obj.stub(:_update_attributes).and_return(result)
414
- @obj.send(:_propose_update_attributes, @obj, @attrs, @safe).should == result
415
- end
416
- end
417
-
418
- context "when a child" do
419
- before do
420
- @obj = ProposeUpdateAttributes.new
421
- @parent = stub('parent')
422
- @obj._parent = @parent
423
- end
424
-
425
- it "delegates to the parent when a child" do
426
- @parent.should_receive(:_propose_update_attributes).with(@obj, @attrs, @safe)
427
- @obj.send(:_propose_update_attributes, @obj, @attrs, @safe)
428
- end
429
-
430
- it "returns the results of the parent's _propose_update_attributes" do
431
- result = 'check'
432
- @parent.stub(:_propose_update_attributes).and_return(result)
433
- @obj.send(:_propose_update_attributes, @obj, @attrs, @safe).should == result
434
- end
435
- end
436
- end
437
440
 
438
- context "#_update_attributes" do
439
- class UpdateAttributes < MongoDoc::Document
440
- end
441
-
442
441
  before do
443
- @collection = stub('collection')
444
- @collection.stub(:update)
445
- @doc = UpdateAttributes.new
442
+ @id = 'id'
443
+ @attrs = {:data => 'data'}
444
+ @safe = false
445
+ @doc = NaiveUpdateAttributes.new
446
446
  @doc.stub(:_id).and_return(@id)
447
- UpdateAttributes.stub(:collection).and_return(@collection)
448
- @attrs = {:data => 'value'}
449
- end
450
-
451
- it "uses the set modifier for the attributes" do
452
- safe = true
453
- MongoDoc::Query.should_receive(:set_modifier).with(@attrs)
447
+ @collection = stub('collection')
454
448
  @collection.stub(:update)
455
- @doc.send(:_update_attributes, @attrs, safe)
449
+ @doc.stub(:_collection).and_return(@collection)
456
450
  end
457
451
 
458
- it "delegates to the collection update with safe" do
459
- safe = true
460
- @collection.should_receive(:update).with({'_id' => @id}, MongoDoc::Query.set_modifier(@attrs), {:safe => safe})
461
- @doc.send(:_update_attributes, @attrs, safe)
452
+ it "calls update on the collection without a root" do
453
+ @collection.should_receive(:update).with({'_id' => @id}, MongoDoc::Query.set_modifier(@attrs), {:safe => @safe})
454
+ @doc.send(:_naive_update_attributes, @attrs, @safe)
462
455
  end
463
456
 
464
- it "returns the result" do
465
- result = 'check'
466
- @collection.stub(:update).and_return(result)
467
- @doc.send(:_update_attributes, @attrs, true)
468
- end
469
- end
470
-
471
- context "from a nested document" do
472
- class NestedDocsRoot < MongoDoc::Document
473
- has_many :nested_children
457
+ it "with a root, calls _naive_update_attributes on the root" do
458
+ root = NaiveUpdateAttributes.new
459
+ @doc.stub(:_root).and_return(root)
460
+ root.should_receive(:_naive_update_attributes).with(@attrs, @safe)
461
+ @doc.send(:_naive_update_attributes, @attrs, @safe)
474
462
  end
463
+ end
475
464
 
476
- class NestedChild < MongoDoc::Document
477
- has_one :leaf
465
+ context "#_strict_update_attributes" do
466
+ class StrictUpdateAttributes
467
+ include MongoDoc::Document
478
468
  end
479
469
 
480
- class LeafDoc < MongoDoc::Document
481
- key :data
470
+ before do
471
+ @id = 'id'
472
+ @attrs = {:data => 'data'}
473
+ @selector = {'selector' => 'selector'}
474
+ @safe = false
475
+ @doc = StrictUpdateAttributes.new
476
+ @doc.stub(:_id).and_return(@id)
477
+ @collection = stub('collection')
478
+ @collection.stub(:update)
479
+ @doc.stub(:_collection).and_return(@collection)
482
480
  end
483
481
 
484
- context "#save" do
485
- before do
486
- @leaf = LeafDoc.new
487
- @root = NestedDocsRoot.new(:nested_children => [NestedChild.new(:leaf => @leaf)])
488
- end
489
-
490
- it "calls the root document's save" do
491
- @root.should_receive(:save).with(true)
492
- @leaf.save
493
- end
494
-
495
- it "(with bang!) calls the root documents save!" do
496
- @root.should_receive(:save!)
497
- @leaf.save!
482
+ context "without a root" do
483
+ it "calls update on the collection" do
484
+ @collection.should_receive(:update).with({'_id' => @id}.merge(@selector), MongoDoc::Query.set_modifier(@attrs), :safe => @safe)
485
+ @doc.send(:_strict_update_attributes, @attrs, @safe, @selector)
498
486
  end
499
487
  end
500
488
 
501
- context "with no has_many, update_attributes" do
489
+ context "with a root" do
502
490
  before do
503
- @leaf = LeafDoc.new
504
- @root = NestedChild.new(:leaf => @leaf)
491
+ @root = StrictUpdateAttributes.new
492
+ @root.stub(:_collection).and_return(@collection)
493
+ @doc.stub(:_root).and_return(@root)
494
+ @doc.stub(:_selector_path_to_root).and_return({'path._id' => @id})
505
495
  end
506
496
 
507
- it "calls the root document's _update_attributes with a full attribute path and not safe" do
508
- @root.should_receive(:_update_attributes).with({'leaf.data' => 'data'}, false)
509
- @leaf.update_attributes(:data => 'data')
497
+ it "calls _selector_path_to_root on our id" do
498
+ @doc.should_receive(:_selector_path_to_root).with('_id' => @id).and_return({'path._id' => @id})
499
+ @doc.send(:_strict_update_attributes, @attrs, @safe)
510
500
  end
511
501
 
512
- it "(with bang!) calls the root document's _update_attributes with a full attribute path and safe" do
513
- @root.should_receive(:_update_attributes).with({'leaf.data' => 'data'}, true)
514
- @leaf.update_attributes!(:data => 'data')
502
+ it "calls _strict_update_attributes on the root with our selector" do
503
+ @root.should_receive(:_strict_update_attributes).with(@attrs, @safe, 'path._id' => @id)
504
+ @doc.send(:_strict_update_attributes, @attrs, @safe)
515
505
  end
516
506
  end
517
-
518
- context "with has_many, update_attributes" do
519
- before do
520
- @leaf = LeafDoc.new
521
- NestedDocsRoot.new(:nested_children => [NestedChild.new(:leaf => @leaf)])
522
- end
523
-
524
- it "returns false" do
525
- @leaf.update_attributes(:data => 'data').should be_false
526
- end
527
-
528
- it "sets an error on base" do
529
- @leaf.update_attributes(:data => 'data')
530
- @leaf.errors[:base].should_not be_nil
531
- end
532
-
533
- it "(with bang!) returns false" do
534
- @leaf.update_attributes!(:data => 'data').should be_false
535
- end
536
-
537
- it "(with bang!) sets an error on base" do
538
- @leaf.update_attributes(:data => 'data')
539
- @leaf.errors[:base].should_not be_nil
540
- end
541
- end
542
-
543
507
  end
544
508
 
545
509
  describe "bson" do
546
- class BSONTest < MongoDoc::Document
510
+ class BSONTest
511
+ include MongoDoc::Document
512
+
547
513
  key :other
548
514
  end
549
515
 
550
516
  class BSONDerived < BSONTest
517
+ include MongoDoc::Document
518
+
551
519
  key :derived
552
520
  end
553
-
521
+
554
522
  class OtherObject
555
523
  attr_accessor :value
556
524
  end
557
-
525
+
558
526
  before do
559
527
  @value = 'value'
560
528
  @other = OtherObject.new
@@ -565,7 +533,7 @@ describe "MongoDoc::Document" do
565
533
  it "encodes the class for the object" do
566
534
  @doc.to_bson[MongoDoc::BSON::CLASS_KEY].should == BSONTest.name
567
535
  end
568
-
536
+
569
537
  it "renders a json representation of the object" do
570
538
  @doc.to_bson.should be_bson_eql({MongoDoc::BSON::CLASS_KEY => BSONTest.name, "other" => {MongoDoc::BSON::CLASS_KEY => OtherObject.name, "value" => @value}})
571
539
  end
@@ -594,11 +562,15 @@ describe "MongoDoc::Document" do
594
562
 
595
563
  context "associations" do
596
564
  context "has_one" do
597
- class TestHasOneBsonDoc < MongoDoc::Document
565
+ class TestHasOneBsonDoc
566
+ include MongoDoc::Document
567
+
598
568
  has_one :subdoc
599
569
  end
600
570
 
601
- class SubHasOneBsonDoc < MongoDoc::Document
571
+ class SubHasOneBsonDoc
572
+ include MongoDoc::Document
573
+
602
574
  key :attr
603
575
  end
604
576
 
@@ -621,11 +593,14 @@ describe "MongoDoc::Document" do
621
593
 
622
594
  context "has_many" do
623
595
 
624
- class SubHasManyBsonDoc < MongoDoc::Document
596
+ class SubHasManyBsonDoc
597
+ include MongoDoc::Document
598
+
625
599
  key :attr
626
600
  end
627
601
 
628
- class TestHasManyBsonDoc < MongoDoc::Document
602
+ class TestHasManyBsonDoc
603
+ include MongoDoc::Document
629
604
  has_many :subdoc, :class_name => 'SubHasManyBsonDoc'
630
605
  end
631
606
 
@@ -654,14 +629,8 @@ describe "MongoDoc::Document" do
654
629
  end
655
630
 
656
631
  context "misc class methods" do
657
- class ClassMethods < MongoDoc::Document
658
- end
659
-
660
- it ".count calls the collection count" do
661
- collection = stub('collection')
662
- ClassMethods.stub(:collection).and_return(collection)
663
- collection.should_receive(:count).and_return(1)
664
- ClassMethods.count
632
+ class ClassMethods
633
+ include MongoDoc::Document
665
634
  end
666
635
 
667
636
  it ".collection_name returns the name of the collection for this class" do