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
@@ -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