mongodoc 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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