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
@@ -1,32 +1,44 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper.rb"))
2
2
 
3
3
  describe MongoDoc::Criteria do
4
- class CountryCode < MongoDoc::Document
4
+ class CountryCode
5
+ include MongoDoc::Document
6
+
5
7
  key :code
6
8
  end
7
9
 
8
- class Phone < MongoDoc::Document
10
+ class Phone
11
+ include MongoDoc::Document
12
+
9
13
  key :number
10
14
  has_one :country_code
11
15
  end
12
16
 
13
- class Animal < MongoDoc::Document
17
+ class Animal
18
+ include MongoDoc::Document
19
+
14
20
  key :name
15
21
  end
16
22
 
17
- class Address < MongoDoc::Document
23
+ class Address
24
+ include MongoDoc::Document
25
+
18
26
  key :street
19
27
  key :city
20
28
  key :state
21
29
  key :post_code
22
30
  end
23
31
 
24
- class Name < MongoDoc::Document
32
+ class Name
33
+ include MongoDoc::Document
34
+
25
35
  key :first_name
26
36
  key :last_name
27
37
  end
28
38
 
29
- class Person < MongoDoc::Document
39
+ class Person
40
+ include MongoDoc::Document
41
+
30
42
  key :title
31
43
  key :terms
32
44
  key :age
@@ -50,57 +62,30 @@ describe MongoDoc::Criteria do
50
62
  def employer=(emp)
51
63
  self.employer_id = emp.id
52
64
  end
53
-
54
- class << self
55
- def accepted
56
- criteria.where(:terms => true)
57
- end
58
- def knight
59
- criteria.where(:title => "Sir")
60
- end
61
- def old
62
- criteria.where(:age => { "$gt" => 50 })
63
- end
64
- end
65
-
66
65
  end
67
66
 
68
67
  before do
69
68
  @criteria = MongoDoc::Criteria.new(Person)
70
69
  end
71
70
 
72
- describe "#aggregate" do
73
-
74
- context "when klass provided" do
75
-
76
- before do
77
- @reduce = "function(obj, prev) { prev.count++; }"
78
- @collection = mock
79
- Animal.should_receive(:collection).and_return(@collection)
80
- end
81
-
82
- it "calls group on the collection with the aggregate js" do
83
- @collection.should_receive(:group).with([:field1], {}, {:count => 0}, @reduce)
84
- @criteria.select(:field1).aggregate(Animal)
85
- end
86
-
71
+ describe "#all" do
72
+ it "calls collect" do
73
+ @criteria.should_receive(:collect).with(no_args)
74
+ @criteria.all
87
75
  end
76
+ end
88
77
 
89
- context "when klass not provided" do
90
-
91
- before do
92
- @reduce = "function(obj, prev) { prev.count++; }"
93
- @collection = mock
94
- Person.should_receive(:collection).and_return(@collection)
95
- end
96
-
97
- it "calls group on the collection with the aggregate js" do
98
- @collection.should_receive(:group).with([:field1], {}, {:count => 0}, @reduce)
99
- @criteria.select(:field1).aggregate
100
- end
101
-
78
+ describe "#aggregate" do
79
+ before do
80
+ @reduce = "function(obj, prev) { prev.count++; }"
81
+ @collection = mock
82
+ Person.should_receive(:collection).and_return(@collection)
102
83
  end
103
84
 
85
+ it "calls group on the collection with the aggregate js" do
86
+ @collection.should_receive(:group).with([:field1], {}, {:count => 0}, @reduce, true)
87
+ @criteria.only(:field1).aggregate
88
+ end
104
89
  end
105
90
 
106
91
  describe "#every" do
@@ -110,7 +95,7 @@ describe MongoDoc::Criteria do
110
95
  @criteria.selector.should == { :title => { "$all" => ["title1", "title2"] } }
111
96
  end
112
97
 
113
- it "and_return self" do
98
+ it "returns self" do
114
99
  @criteria.every(:title => [ "title1" ]).should == @criteria
115
100
  end
116
101
 
@@ -124,7 +109,7 @@ describe MongoDoc::Criteria do
124
109
  end
125
110
 
126
111
  it "calls each" do
127
- @cursor.should_receive(:each).and_return(@cursor)
112
+ @criteria.should_receive(:each).and_return(@criteria)
128
113
  @criteria.collect
129
114
  end
130
115
 
@@ -181,6 +166,12 @@ describe MongoDoc::Criteria do
181
166
  @criteria.each
182
167
  end
183
168
 
169
+ it "has memoized the result of execute" do
170
+ @criteria.stub(:execute).and_return(@cursor)
171
+ @criteria.each
172
+ @criteria.collection.should == @cursor
173
+ end
174
+
184
175
  it "returns self" do
185
176
  @criteria.stub(:execute).and_return(@cursor)
186
177
  @criteria.each.should == @criteria
@@ -188,7 +179,22 @@ describe MongoDoc::Criteria do
188
179
  end
189
180
 
190
181
  context "when a block is given" do
182
+ class CursorStub
183
+ include Enumerable
184
+
185
+ attr_accessor :data
186
+
187
+ def each(*args, &block)
188
+ data.each(*args, &block)
189
+ end
190
+ end
191
+
191
192
  context "when the criteria has not been executed" do
193
+ before do
194
+ @cursor = CursorStub.new
195
+ @cursor.data = [@person]
196
+ end
197
+
192
198
  it "executes the criteria" do
193
199
  @criteria.should_receive(:execute).and_return(@cursor)
194
200
  @criteria.each do |person|
@@ -204,6 +210,15 @@ describe MongoDoc::Criteria do
204
210
  @result.should == @person
205
211
  end
206
212
 
213
+ it "has memoized the cursor iteration" do
214
+ @criteria.stub(:execute).and_return(@cursor)
215
+ @criteria.each do |person|
216
+ @result = person
217
+ end
218
+ @criteria.collection.should == [@person]
219
+ end
220
+
221
+
207
222
  it "returns self" do
208
223
  @criteria.stub(:execute).and_return(@cursor)
209
224
  @criteria.each.should == @criteria
@@ -244,7 +259,7 @@ describe MongoDoc::Criteria do
244
259
  @criteria.selector.should == { :title => { "$ne" => "Bad Title"}, :text => { "$ne" => "Bad Text" } }
245
260
  end
246
261
 
247
- it "and_return self" do
262
+ it "returns self" do
248
263
  @criteria.excludes(:title => "Bad").should == @criteria
249
264
  end
250
265
 
@@ -290,7 +305,7 @@ describe MongoDoc::Criteria do
290
305
  @criteria.options.should == { :skip => 10 }
291
306
  end
292
307
 
293
- it "and_return self" do
308
+ it "returns self" do
294
309
  @criteria.extras({}).should == @criteria
295
310
  end
296
311
 
@@ -303,54 +318,36 @@ describe MongoDoc::Criteria do
303
318
  end
304
319
 
305
320
  describe "#group" do
306
-
307
321
  before do
308
322
  @grouping = [{ "title" => "Sir", "group" => [{ "title" => "Sir", "age" => 30 }] }]
323
+ @reduce = "function(obj, prev) { prev.group.push(obj); }"
324
+ @collection = mock
325
+ Person.should_receive(:collection).and_return(@collection)
309
326
  end
310
327
 
311
- context "when klass provided" do
312
-
313
- before do
314
- @reduce = "function(obj, prev) { prev.group.push(obj); }"
315
- @collection = mock
316
- Animal.should_receive(:collection).and_return(@collection)
317
- end
318
-
319
- it "calls group on the collection with the aggregate js" do
320
- @collection.should_receive(:group).with([:field1], {}, {:group => []}, @reduce).and_return(@grouping)
321
- @criteria.select(:field1).group(Animal)
322
- end
323
-
324
- end
325
-
326
- context "when klass not provided" do
327
-
328
- before do
329
- @reduce = "function(obj, prev) { prev.group.push(obj); }"
330
- @collection = mock
331
- Person.should_receive(:collection).and_return(@collection)
332
- end
333
-
334
- it "calls group on the collection with the aggregate js" do
335
- @collection.should_receive(:group).with([:field1], {}, {:group => []}, @reduce).and_return(@grouping)
336
- @criteria.select(:field1).group
337
- end
338
-
328
+ it "calls group on the collection with the aggregate js" do
329
+ @collection.should_receive(:group).with([:field1], {}, {:group => []}, @reduce, true).and_return(@grouping)
330
+ @criteria.only(:field1).group
339
331
  end
340
-
341
332
  end
342
333
 
343
334
  describe "#id" do
344
335
 
345
- it "adds the _id query to the selector" do
346
- id = Mongo::ObjectID.new.to_s
336
+ it "adds the ObjectID as the _id query to the selector" do
337
+ id = Mongo::ObjectID.new
347
338
  @criteria.id(id)
348
339
  @criteria.selector.should == { :_id => id }
349
340
  end
350
341
 
351
- it "and_return self" do
342
+ it "adds the string as the _id query to the selector" do
352
343
  id = Mongo::ObjectID.new.to_s
353
- @criteria.id(id.to_s).should == @criteria
344
+ @criteria.id(id)
345
+ @criteria.selector.should == { :_id => id }
346
+ end
347
+
348
+ it "returns self" do
349
+ id = Mongo::ObjectID.new
350
+ @criteria.id(id).should == @criteria
354
351
  end
355
352
 
356
353
  end
@@ -362,7 +359,7 @@ describe MongoDoc::Criteria do
362
359
  @criteria.selector.should == { :title => { "$in" => ["title1", "title2"] }, :text => { "$in" => ["test"] } }
363
360
  end
364
361
 
365
- it "and_return self" do
362
+ it "returns self" do
366
363
  @criteria.in(:title => ["title1"]).should == @criteria
367
364
  end
368
365
 
@@ -393,7 +390,7 @@ describe MongoDoc::Criteria do
393
390
  @collection.should_receive(:find_one).with(@criteria.selector, { :sort => [[:_id, :desc]] }).and_return(nil)
394
391
  end
395
392
 
396
- it "and_return nil" do
393
+ it "returns nil" do
397
394
  @criteria.last.should be_nil
398
395
  end
399
396
 
@@ -435,82 +432,12 @@ describe MongoDoc::Criteria do
435
432
 
436
433
  end
437
434
 
438
- it "and_return self" do
435
+ it "returns self" do
439
436
  @criteria.limit.should == @criteria
440
437
  end
441
438
 
442
439
  end
443
440
 
444
- describe "#merge" do
445
-
446
- before do
447
- @criteria.where(:title => "Sir", :age => 30).skip(40).limit(20)
448
- end
449
-
450
- context "with another criteria" do
451
-
452
- context "when the other has a selector and options" do
453
-
454
- before do
455
- @other = MongoDoc::Criteria.new(Person)
456
- @other.where(:name => "Chloe").order_by([[:name, :asc]])
457
- @selector = { :title => "Sir", :age => 30, :name => "Chloe" }
458
- @options = { :skip => 40, :limit => 20, :sort => [[:name, :asc]] }
459
- end
460
-
461
- it "merges the selector and options hashes together" do
462
- @criteria.merge(@other)
463
- @criteria.selector.should == @selector
464
- @criteria.options.should == @options
465
- end
466
-
467
- end
468
-
469
- context "when the other has no selector or options" do
470
-
471
- before do
472
- @other = MongoDoc::Criteria.new(Person)
473
- @selector = { :title => "Sir", :age => 30 }
474
- @options = { :skip => 40, :limit => 20 }
475
- end
476
-
477
- it "merges the selector and options hashes together" do
478
- @criteria.merge(@other)
479
- @criteria.selector.should == @selector
480
- @criteria.options.should == @options
481
- end
482
- end
483
-
484
- end
485
-
486
- end
487
-
488
- describe "#method_missing" do
489
-
490
- before do
491
- @criteria.where(:title => "Sir")
492
- end
493
-
494
- it "merges the criteria with the next one" do
495
- @new_criteria = @criteria.accepted
496
- @new_criteria.selector.should == { :title => "Sir", :terms => true }
497
- end
498
-
499
- context "chaining more than one scope" do
500
-
501
- before do
502
- @criteria = Person.accepted.old.knight
503
- end
504
-
505
- it "and_return the final merged criteria" do
506
- @criteria.selector.should ==
507
- { :title => "Sir", :terms => true, :age => { "$gt" => 50 } }
508
- end
509
-
510
- end
511
-
512
- end
513
-
514
441
  describe "#not_in" do
515
442
 
516
443
  it "adds the exclusion to the selector" do
@@ -518,7 +445,7 @@ describe MongoDoc::Criteria do
518
445
  @criteria.selector.should == { :title => { "$nin" => ["title1", "title2"] }, :text => { "$nin" => ["test"] } }
519
446
  end
520
447
 
521
- it "and_return self" do
448
+ it "returns self" do
522
449
  @criteria.not_in(:title => ["title1"]).should == @criteria
523
450
  end
524
451
 
@@ -532,7 +459,7 @@ describe MongoDoc::Criteria do
532
459
  @criteria.extras({ :per_page => 20, :page => 3 })
533
460
  end
534
461
 
535
- it "and_return the per_page option" do
462
+ it "returns the per_page option" do
536
463
  @criteria.offset.should == 40
537
464
  end
538
465
 
@@ -544,7 +471,7 @@ describe MongoDoc::Criteria do
544
471
  @criteria.extras({ :skip => 20 })
545
472
  end
546
473
 
547
- it "and_return the skip option" do
474
+ it "returns the skip option" do
548
475
  @criteria.offset.should == 20
549
476
  end
550
477
 
@@ -558,7 +485,7 @@ describe MongoDoc::Criteria do
558
485
  @criteria.extras({ :page => 2 })
559
486
  end
560
487
 
561
- it "adds the skip option to the options and and_return it" do
488
+ it "adds the skip option to the options and returns it" do
562
489
  @criteria.offset.should == 20
563
490
  @criteria.options[:skip].should == 20
564
491
  end
@@ -567,7 +494,7 @@ describe MongoDoc::Criteria do
567
494
 
568
495
  context "when page option does not exist" do
569
496
 
570
- it "and_return nil" do
497
+ it "returns nil" do
571
498
  @criteria.offset.should be_nil
572
499
  @criteria.options[:skip].should be_nil
573
500
  end
@@ -621,7 +548,7 @@ describe MongoDoc::Criteria do
621
548
 
622
549
  end
623
550
 
624
- it "and_return self" do
551
+ it "returns self" do
625
552
  @criteria.order_by.should == @criteria
626
553
  end
627
554
 
@@ -635,7 +562,7 @@ describe MongoDoc::Criteria do
635
562
  @criteria.extras({ :page => 5 })
636
563
  end
637
564
 
638
- it "and_return the page option" do
565
+ it "returns the page option" do
639
566
  @criteria.page.should == 5
640
567
  end
641
568
 
@@ -656,7 +583,7 @@ describe MongoDoc::Criteria do
656
583
  before do
657
584
  @collection = mock
658
585
  Person.should_receive(:collection).and_return(@collection)
659
- @criteria.select.where(:_id => "1").skip(60).limit(20)
586
+ @criteria.where(:_id => "1").skip(60).limit(20)
660
587
  @cursor = mock('cursor', :count => 20, :to_a => [])
661
588
  @collection.should_receive(:find).with({:_id => "1"}, :skip => 60, :limit => 20).and_return(@cursor)
662
589
  @results = @criteria.paginate
@@ -677,7 +604,7 @@ describe MongoDoc::Criteria do
677
604
  @criteria.extras({ :per_page => 10 })
678
605
  end
679
606
 
680
- it "and_return the per_page option" do
607
+ it "returns the per_page option" do
681
608
  @criteria.per_page.should == 10
682
609
  end
683
610
 
@@ -693,17 +620,17 @@ describe MongoDoc::Criteria do
693
620
 
694
621
  end
695
622
 
696
- describe "#select" do
623
+ describe "#only" do
697
624
 
698
625
  context "when args are provided" do
699
626
 
700
627
  it "adds the options for limiting by fields" do
701
- @criteria.select(:title, :text)
628
+ @criteria.only(:title, :text)
702
629
  @criteria.options.should == { :fields => [ :title, :text ] }
703
630
  end
704
631
 
705
- it "and_return self" do
706
- @criteria.select.should == @criteria
632
+ it "returns self" do
633
+ @criteria.only.should == @criteria
707
634
  end
708
635
 
709
636
  end
@@ -711,7 +638,7 @@ describe MongoDoc::Criteria do
711
638
  context "when no args provided" do
712
639
 
713
640
  it "does not add the field option" do
714
- @criteria.select
641
+ @criteria.only
715
642
  @criteria.options[:fields].should be_nil
716
643
  end
717
644
 
@@ -739,7 +666,7 @@ describe MongoDoc::Criteria do
739
666
 
740
667
  end
741
668
 
742
- it "and_return self" do
669
+ it "returns self" do
743
670
  @criteria.skip.should == @criteria
744
671
  end
745
672
 
@@ -753,12 +680,12 @@ describe MongoDoc::Criteria do
753
680
  @id = Mongo::ObjectID.new.to_s
754
681
  @document = stub
755
682
  @criteria = mock
756
- MongoDoc::Criteria.should_receive(:new).and_return(@criteria)
757
- @criteria.should_receive(:id).with(@id).and_return(@criteria)
758
- @criteria.should_receive(:one).and_return(@document)
759
683
  end
760
684
 
761
685
  it "creates a criteria for a string" do
686
+ MongoDoc::Criteria.should_receive(:new).and_return(@criteria)
687
+ @criteria.should_receive(:id).with(@id).and_return(@criteria)
688
+ @criteria.should_receive(:one).and_return(@document)
762
689
  MongoDoc::Criteria.translate(Person, @id)
763
690
  end
764
691
 
@@ -772,11 +699,11 @@ describe MongoDoc::Criteria do
772
699
  @criteria = MongoDoc::Criteria.translate(Person, :conditions => { :title => "Test" })
773
700
  end
774
701
 
775
- it "and_return a criteria with a selector from the conditions" do
702
+ it "returns a criteria with a selector from the conditions" do
776
703
  @criteria.selector.should == { :title => "Test" }
777
704
  end
778
705
 
779
- it "and_return a criteria with klass Person" do
706
+ it "returns a criteria with klass Person" do
780
707
  @criteria.klass.should == Person
781
708
  end
782
709
 
@@ -788,11 +715,11 @@ describe MongoDoc::Criteria do
788
715
  @criteria = MongoDoc::Criteria.translate(Person, :conditions => { :title => "Test" })
789
716
  end
790
717
 
791
- it "and_return a criteria with a selector from the conditions" do
718
+ it "returns a criteria with a selector from the conditions" do
792
719
  @criteria.selector.should == { :title => "Test" }
793
720
  end
794
721
 
795
- it "and_return a criteria with klass Person" do
722
+ it "returns a criteria with klass Person" do
796
723
  @criteria.klass.should == Person
797
724
  end
798
725
 
@@ -804,11 +731,11 @@ describe MongoDoc::Criteria do
804
731
  @criteria = MongoDoc::Criteria.translate(Person, :conditions => { :title => "Test" })
805
732
  end
806
733
 
807
- it "and_return a criteria with a selector from the conditions" do
734
+ it "returns a criteria with a selector from the conditions" do
808
735
  @criteria.selector.should == { :title => "Test" }
809
736
  end
810
737
 
811
- it "and_return a criteria with klass Person" do
738
+ it "returns a criteria with klass Person" do
812
739
  @criteria.klass.should == Person
813
740
  end
814
741
  end
@@ -823,11 +750,8 @@ describe MongoDoc::Criteria do
823
750
  @criteria.selector.should == { :title => "Test" }
824
751
  @criteria.options.should == { :skip => 10 }
825
752
  end
826
-
827
753
  end
828
-
829
754
  end
830
-
831
755
  end
832
756
 
833
757
  describe "#where" do
@@ -837,10 +761,23 @@ describe MongoDoc::Criteria do
837
761
  @criteria.selector.should == { :title => "Title", :text => "Text" }
838
762
  end
839
763
 
840
- it "and_return self" do
764
+ it "accepts a js where clause" do
765
+ @criteria.where("this.a > 3")
766
+ @criteria.selector.should == { '$where' => "this.a > 3" }
767
+ end
768
+
769
+ it "and return self" do
841
770
  @criteria.where.should == @criteria
842
771
  end
843
772
 
844
- end
773
+ it "#and is an alias for where" do
774
+ @criteria.and(:title => "Title", :text => "Text")
775
+ @criteria.selector.should == { :title => "Title", :text => "Text" }
776
+ end
845
777
 
778
+ it "#conditions is an alias for where" do
779
+ @criteria.conditions(:title => "Title", :text => "Text")
780
+ @criteria.selector.should == { :title => "Title", :text => "Text" }
781
+ end
782
+ end
846
783
  end
data/spec/cursor_spec.rb CHANGED
@@ -6,10 +6,14 @@ describe "MongoDoc::Cursor" do
6
6
  @cursor = MongoDoc::Cursor.new(@mongo_cursor)
7
7
  end
8
8
 
9
+ it "is Enumerable" do
10
+ Enumerable.should === @cursor
11
+ end
12
+
9
13
  it ".new wraps a Mongo::Cursor" do
10
14
  @cursor._cursor.should == @mongo_cursor
11
15
  end
12
-
16
+
13
17
  context "with the underlying cursor" do
14
18
  %w(close closed? count explain limit query_options_hash query_opts skip sort).each do |delegated_method|
15
19
  it "delegates #{delegated_method} to the Mongo::Cursor" do
@@ -18,7 +22,7 @@ describe "MongoDoc::Cursor" do
18
22
  end
19
23
  end
20
24
  end
21
-
25
+
22
26
  context "#each" do
23
27
  it "delegates to the cursor" do
24
28
  @mongo_cursor.should_receive(:each)
@@ -31,7 +35,7 @@ describe "MongoDoc::Cursor" do
31
35
  MongoDoc::BSON.should_receive(:decode).with(bson)
32
36
  @cursor.each {}
33
37
  end
34
-
38
+
35
39
  it "calls the block with the decoded return" do
36
40
  result = stub('bson')
37
41
  @cursor.stub(:_cursor).and_return([result])
@@ -40,42 +44,42 @@ describe "MongoDoc::Cursor" do
40
44
  @obj.should == result
41
45
  end
42
46
  end
43
-
44
- context "#next_object" do
47
+
48
+ context "#next_document" do
45
49
  it "delegates to the cursor" do
46
- @mongo_cursor.should_receive(:next_object)
47
- @cursor.next_object
50
+ @mongo_cursor.should_receive(:next_document)
51
+ @cursor.next_document
48
52
  end
49
-
53
+
50
54
  it "decodes the return from the delegate" do
51
55
  bson = stub('bson')
52
- @mongo_cursor.stub(:next_object).and_return(bson)
56
+ @mongo_cursor.stub(:next_document).and_return(bson)
53
57
  MongoDoc::BSON.should_receive(:decode).with(bson)
54
- @cursor.next_object
58
+ @cursor.next_document
55
59
  end
56
-
60
+
57
61
  it "returns nil if the delegate returns nil" do
58
- @mongo_cursor.stub(:next_object)
59
- @cursor.next_object.should be_nil
62
+ @mongo_cursor.stub(:next_document)
63
+ @cursor.next_document.should be_nil
60
64
  end
61
65
  end
62
-
66
+
63
67
  context "#to_a" do
64
68
  it "delegates to the cursor" do
65
69
  @mongo_cursor.should_receive(:to_a)
66
70
  @cursor.to_a
67
71
  end
68
-
72
+
69
73
  it "decodes the return from the delegate" do
70
74
  array = stub('array')
71
75
  @mongo_cursor.stub(:to_a).and_return(array)
72
76
  MongoDoc::BSON.should_receive(:decode).with(array)
73
77
  @cursor.to_a
74
78
  end
75
-
79
+
76
80
  it "returns [] if the delegate returns []" do
77
81
  @mongo_cursor.stub(:to_a).and_return([])
78
82
  @cursor.to_a.should == []
79
83
  end
80
84
  end
81
- end
85
+ end
data/spec/document_ext.rb CHANGED
@@ -1,9 +1,9 @@
1
1
  module MongoDoc
2
- class Document
2
+ module Document
3
3
  def errors_on(attribute)
4
4
  self.valid?
5
5
  [self.errors.on(attribute)].flatten.compact
6
6
  end
7
7
  alias :error_on :errors_on
8
8
  end
9
- end
9
+ end