mongoid 0.10.6 → 0.11.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.
- data/Rakefile +3 -3
- data/VERSION +1 -1
- data/lib/mongoid.rb +2 -2
- data/lib/mongoid/associations.rb +1 -1
- data/lib/mongoid/associations/belongs_to.rb +1 -1
- data/lib/mongoid/associations/has_many.rb +8 -6
- data/lib/mongoid/associations/has_one.rb +6 -5
- data/lib/mongoid/commands.rb +94 -41
- data/lib/mongoid/commands/delete_all.rb +2 -3
- data/lib/mongoid/commands/deletion.rb +1 -1
- data/lib/mongoid/commands/destroy_all.rb +2 -0
- data/lib/mongoid/commands/save.rb +1 -1
- data/lib/mongoid/criteria.rb +1 -1
- data/lib/mongoid/document.rb +43 -32
- data/lib/mongoid/extensions.rb +3 -3
- data/lib/mongoid/extensions/hash/assimilation.rb +2 -3
- data/lib/mongoid/extensions/string/inflections.rb +1 -0
- data/mongoid.gemspec +13 -9
- data/perf/benchmark.rb +8 -4
- data/spec/integration/mongoid/commands_spec.rb +103 -0
- data/spec/integration/mongoid/document_spec.rb +13 -1
- data/spec/integration/mongoid/inheritance_spec.rb +105 -0
- data/spec/spec_helper.rb +24 -2
- data/spec/unit/mongoid/associations/belongs_to_spec.rb +3 -3
- data/spec/unit/mongoid/associations/has_many_spec.rb +92 -31
- data/spec/unit/mongoid/associations/has_one_spec.rb +57 -4
- data/spec/unit/mongoid/associations_spec.rb +4 -4
- data/spec/unit/mongoid/attributes_spec.rb +2 -2
- data/spec/unit/mongoid/commands/delete_all_spec.rb +4 -3
- data/spec/unit/mongoid/commands/delete_spec.rb +1 -1
- data/spec/unit/mongoid/commands/destroy_all_spec.rb +3 -2
- data/spec/unit/mongoid/commands/destroy_spec.rb +1 -1
- data/spec/unit/mongoid/commands/save_spec.rb +3 -3
- data/spec/unit/mongoid/commands_spec.rb +6 -6
- data/spec/unit/mongoid/criteria_spec.rb +45 -36
- data/spec/unit/mongoid/document_spec.rb +198 -29
- data/spec/unit/mongoid/extensions/array/conversions_spec.rb +2 -2
- data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +33 -8
- data/spec/unit/mongoid/extensions/object/conversions_spec.rb +2 -2
- data/spec/unit/mongoid/finders_spec.rb +1 -1
- data/spec/unit/mongoid/timestamps_spec.rb +1 -1
- metadata +9 -5
@@ -19,7 +19,7 @@ describe Mongoid::Criteria do
|
|
19
19
|
|
20
20
|
before do
|
21
21
|
Person.expects(:collection).returns(@collection)
|
22
|
-
@collection.expects(:find).with({ :title => "Sir" }, {}).returns(@cursor)
|
22
|
+
@collection.expects(:find).with({ :title => "Sir", :_type => "Person" }, {}).returns(@cursor)
|
23
23
|
end
|
24
24
|
|
25
25
|
it "executes the criteria and returns the element at the index" do
|
@@ -42,7 +42,7 @@ describe Mongoid::Criteria do
|
|
42
42
|
end
|
43
43
|
|
44
44
|
it "calls group on the collection with the aggregate js" do
|
45
|
-
@collection.expects(:group).with([:field1], {}, {:count => 0}, @reduce)
|
45
|
+
@collection.expects(:group).with([:field1], {:_type => "Person"}, {:count => 0}, @reduce)
|
46
46
|
@criteria.only(:field1).aggregate
|
47
47
|
end
|
48
48
|
|
@@ -57,7 +57,7 @@ describe Mongoid::Criteria do
|
|
57
57
|
end
|
58
58
|
|
59
59
|
it "calls group on the collection with the aggregate js" do
|
60
|
-
@collection.expects(:group).with([:field1], {}, {:count => 0}, @reduce)
|
60
|
+
@collection.expects(:group).with([:field1], {:_type => "Person"}, {:count => 0}, @reduce)
|
61
61
|
@criteria.only(:field1).aggregate(Person)
|
62
62
|
end
|
63
63
|
|
@@ -69,7 +69,7 @@ describe Mongoid::Criteria do
|
|
69
69
|
|
70
70
|
it "adds the $all query to the selector" do
|
71
71
|
@criteria.all(:title => ["title1", "title2"])
|
72
|
-
@criteria.selector.should == { :title => { "$all" => ["title1", "title2"] } }
|
72
|
+
@criteria.selector.should == { :_type => "Person", :title => { "$all" => ["title1", "title2"] } }
|
73
73
|
end
|
74
74
|
|
75
75
|
it "returns self" do
|
@@ -84,7 +84,7 @@ describe Mongoid::Criteria do
|
|
84
84
|
|
85
85
|
it "adds the clause to the selector" do
|
86
86
|
@criteria.and(:title => "Title", :text => "Text")
|
87
|
-
@criteria.selector.should == { :title => "Title", :text => "Text" }
|
87
|
+
@criteria.selector.should == { :_type => "Person", :title => "Title", :text => "Text" }
|
88
88
|
end
|
89
89
|
|
90
90
|
end
|
@@ -93,7 +93,7 @@ describe Mongoid::Criteria do
|
|
93
93
|
|
94
94
|
it "adds the $where clause to the selector" do
|
95
95
|
@criteria.and("this.date < new Date()")
|
96
|
-
@criteria.selector.should == { "$where" => "this.date < new Date()" }
|
96
|
+
@criteria.selector.should == { :_type => "Person", "$where" => "this.date < new Date()" }
|
97
97
|
end
|
98
98
|
|
99
99
|
end
|
@@ -172,7 +172,7 @@ describe Mongoid::Criteria do
|
|
172
172
|
|
173
173
|
before do
|
174
174
|
@criteria = Mongoid::Criteria.new(Person)
|
175
|
-
@selector = { :test => "Testing" }
|
175
|
+
@selector = { :_type => "Person", :test => "Testing" }
|
176
176
|
@criteria.where(@selector)
|
177
177
|
@collection = mock
|
178
178
|
@cursor = mock
|
@@ -202,7 +202,7 @@ describe Mongoid::Criteria do
|
|
202
202
|
|
203
203
|
before do
|
204
204
|
Person.expects(:collection).returns(@collection)
|
205
|
-
@collection.expects(:find).with({ :title => "Sir" }, {}).returns(@cursor)
|
205
|
+
@collection.expects(:find).with({ :_type => "Person", :title => "Sir" }, {}).returns(@cursor)
|
206
206
|
end
|
207
207
|
|
208
208
|
it "executes the criteria" do
|
@@ -217,7 +217,7 @@ describe Mongoid::Criteria do
|
|
217
217
|
|
218
218
|
before do
|
219
219
|
Person.expects(:collection).returns(@collection)
|
220
|
-
@collection.expects(:find).with({ :title => "Sir" }, {}).returns(@cursor)
|
220
|
+
@collection.expects(:find).with({ :_type => "Person", :title => "Sir" }, {}).returns(@cursor)
|
221
221
|
end
|
222
222
|
|
223
223
|
it "calls each on the existing results" do
|
@@ -277,7 +277,7 @@ describe Mongoid::Criteria do
|
|
277
277
|
|
278
278
|
it "adds the $ne query to the selector" do
|
279
279
|
@criteria.excludes(:title => "Bad Title", :text => "Bad Text")
|
280
|
-
@criteria.selector.should == { :title => { "$ne" => "Bad Title"}, :text => { "$ne" => "Bad Text" } }
|
280
|
+
@criteria.selector.should == { :_type => "Person", :title => { "$ne" => "Bad Title"}, :text => { "$ne" => "Bad Text" } }
|
281
281
|
end
|
282
282
|
|
283
283
|
it "returns self" do
|
@@ -348,7 +348,7 @@ describe Mongoid::Criteria do
|
|
348
348
|
end
|
349
349
|
|
350
350
|
it "calls group on the collection with the aggregate js" do
|
351
|
-
@collection.expects(:group).with([:field1], {}, {:group => []}, @reduce).returns(@grouping)
|
351
|
+
@collection.expects(:group).with([:field1], {:_type => "Person"}, {:group => []}, @reduce).returns(@grouping)
|
352
352
|
@criteria.only(:field1).group
|
353
353
|
end
|
354
354
|
|
@@ -363,7 +363,7 @@ describe Mongoid::Criteria do
|
|
363
363
|
end
|
364
364
|
|
365
365
|
it "calls group on the collection with the aggregate js" do
|
366
|
-
@collection.expects(:group).with([:field1], {}, {:group => []}, @reduce).returns(@grouping)
|
366
|
+
@collection.expects(:group).with([:field1], {:_type => "Person"}, {:group => []}, @reduce).returns(@grouping)
|
367
367
|
@criteria.only(:field1).group
|
368
368
|
end
|
369
369
|
|
@@ -376,7 +376,7 @@ describe Mongoid::Criteria do
|
|
376
376
|
it "adds the _id query to the selector" do
|
377
377
|
id = Mongo::ObjectID.new.to_s
|
378
378
|
@criteria.id(id)
|
379
|
-
@criteria.selector.should == { :_id => id }
|
379
|
+
@criteria.selector.should == { :_type => "Person", :_id => id }
|
380
380
|
end
|
381
381
|
|
382
382
|
it "returns self" do
|
@@ -390,7 +390,7 @@ describe Mongoid::Criteria do
|
|
390
390
|
|
391
391
|
it "adds the $in clause to the selector" do
|
392
392
|
@criteria.in(:title => ["title1", "title2"], :text => ["test"])
|
393
|
-
@criteria.selector.should == { :title => { "$in" => ["title1", "title2"] }, :text => { "$in" => ["test"] } }
|
393
|
+
@criteria.selector.should == { :_type => "Person", :title => { "$in" => ["title1", "title2"] }, :text => { "$in" => ["test"] } }
|
394
394
|
end
|
395
395
|
|
396
396
|
it "returns self" do
|
@@ -399,6 +399,15 @@ describe Mongoid::Criteria do
|
|
399
399
|
|
400
400
|
end
|
401
401
|
|
402
|
+
describe "#initialize" do
|
403
|
+
|
404
|
+
it "sets the _type value on the selector" do
|
405
|
+
criteria = Mongoid::Criteria.new(Person)
|
406
|
+
criteria.selector.should == { :_type => "Person" }
|
407
|
+
end
|
408
|
+
|
409
|
+
end
|
410
|
+
|
402
411
|
describe "#last" do
|
403
412
|
|
404
413
|
context "when documents exist" do
|
@@ -488,7 +497,7 @@ describe Mongoid::Criteria do
|
|
488
497
|
before do
|
489
498
|
@other = Mongoid::Criteria.new(Person)
|
490
499
|
@other.where(:name => "Chloe").order_by([[:name, :asc]])
|
491
|
-
@selector = { :title => "Sir", :age => 30, :name => "Chloe" }
|
500
|
+
@selector = { :_type => "Person", :title => "Sir", :age => 30, :name => "Chloe" }
|
492
501
|
@options = { :skip => 40, :limit => 20, :sort => [[:name, :asc]] }
|
493
502
|
end
|
494
503
|
|
@@ -504,7 +513,7 @@ describe Mongoid::Criteria do
|
|
504
513
|
|
505
514
|
before do
|
506
515
|
@other = Mongoid::Criteria.new(Person)
|
507
|
-
@selector = { :title => "Sir", :age => 30 }
|
516
|
+
@selector = { :_type => "Person", :title => "Sir", :age => 30 }
|
508
517
|
@options = { :skip => 40, :limit => 20 }
|
509
518
|
end
|
510
519
|
|
@@ -528,7 +537,7 @@ describe Mongoid::Criteria do
|
|
528
537
|
|
529
538
|
it "merges the criteria with the next one" do
|
530
539
|
@new_criteria = @criteria.accepted
|
531
|
-
@new_criteria.selector.should == { :title => "Sir", :terms => true }
|
540
|
+
@new_criteria.selector.should == { :_type => "Person", :title => "Sir", :terms => true }
|
532
541
|
end
|
533
542
|
|
534
543
|
context "chaining more than one scope" do
|
@@ -539,7 +548,7 @@ describe Mongoid::Criteria do
|
|
539
548
|
|
540
549
|
it "returns the final merged criteria" do
|
541
550
|
@criteria.selector.should ==
|
542
|
-
{ :title => "Sir", :terms => true, :age => { "$gt" => 50 } }
|
551
|
+
{ :_type => "Person", :title => "Sir", :terms => true, :age => { "$gt" => 50 } }
|
543
552
|
end
|
544
553
|
|
545
554
|
end
|
@@ -578,7 +587,7 @@ describe Mongoid::Criteria do
|
|
578
587
|
|
579
588
|
it "adds the exclusion to the selector" do
|
580
589
|
@criteria.not_in(:title => ["title1", "title2"], :text => ["test"])
|
581
|
-
@criteria.selector.should == { :title => { "$nin" => ["title1", "title2"] }, :text => { "$nin" => ["test"] } }
|
590
|
+
@criteria.selector.should == { :_type => "Person", :title => { "$nin" => ["title1", "title2"] }, :text => { "$nin" => ["test"] } }
|
582
591
|
end
|
583
592
|
|
584
593
|
it "returns self" do
|
@@ -730,7 +739,7 @@ describe Mongoid::Criteria do
|
|
730
739
|
@collection = mock
|
731
740
|
Person.expects(:collection).returns(@collection)
|
732
741
|
@criteria = Person.where(:_id => "1").skip(60).limit(20)
|
733
|
-
@collection.expects(:find).with({:_id => "1"}, :skip => 60, :limit => 20).returns([])
|
742
|
+
@collection.expects(:find).with({:_type => "Person", :_id => "1"}, :skip => 60, :limit => 20).returns([])
|
734
743
|
@results = @criteria.paginate
|
735
744
|
end
|
736
745
|
|
@@ -858,7 +867,7 @@ describe Mongoid::Criteria do
|
|
858
867
|
end
|
859
868
|
|
860
869
|
it "returns a criteria with a selector from the conditions" do
|
861
|
-
@criteria.selector.should == { :title => "Test" }
|
870
|
+
@criteria.selector.should == { :_type => "Person", :title => "Test" }
|
862
871
|
end
|
863
872
|
|
864
873
|
it "returns a criteria with klass Person" do
|
@@ -874,7 +883,7 @@ describe Mongoid::Criteria do
|
|
874
883
|
end
|
875
884
|
|
876
885
|
it "returns a criteria with a selector from the conditions" do
|
877
|
-
@criteria.selector.should == { :title => "Test" }
|
886
|
+
@criteria.selector.should == { :_type => "Person", :title => "Test" }
|
878
887
|
end
|
879
888
|
|
880
889
|
it "returns a criteria with klass Person" do
|
@@ -890,7 +899,7 @@ describe Mongoid::Criteria do
|
|
890
899
|
end
|
891
900
|
|
892
901
|
it "returns a criteria with a selector from the conditions" do
|
893
|
-
@criteria.selector.should == { :title => "Test" }
|
902
|
+
@criteria.selector.should == { :_type => "Person", :title => "Test" }
|
894
903
|
end
|
895
904
|
|
896
905
|
it "returns a criteria with klass Person" do
|
@@ -905,7 +914,7 @@ describe Mongoid::Criteria do
|
|
905
914
|
end
|
906
915
|
|
907
916
|
it "adds the criteria and the options" do
|
908
|
-
@criteria.selector.should == { :title => "Test" }
|
917
|
+
@criteria.selector.should == { :_type => "Person", :title => "Test" }
|
909
918
|
@criteria.options.should == { :skip => 10 }
|
910
919
|
end
|
911
920
|
|
@@ -923,7 +932,7 @@ describe Mongoid::Criteria do
|
|
923
932
|
|
924
933
|
it "adds the clause to the selector" do
|
925
934
|
@criteria.where(:title => "Title", :text => "Text")
|
926
|
-
@criteria.selector.should == { :title => "Title", :text => "Text" }
|
935
|
+
@criteria.selector.should == { :_type => "Person", :title => "Title", :text => "Text" }
|
927
936
|
end
|
928
937
|
|
929
938
|
end
|
@@ -934,7 +943,7 @@ describe Mongoid::Criteria do
|
|
934
943
|
|
935
944
|
it "returns those matching an all clause" do
|
936
945
|
@criteria.where(:title.all => ["Sir"])
|
937
|
-
@criteria.selector.should == { :title => { "$all" => ["Sir"] } }
|
946
|
+
@criteria.selector.should == { :_type => "Person", :title => { "$all" => ["Sir"] } }
|
938
947
|
end
|
939
948
|
|
940
949
|
end
|
@@ -943,7 +952,7 @@ describe Mongoid::Criteria do
|
|
943
952
|
|
944
953
|
it "returns those matching an exists clause" do
|
945
954
|
@criteria.where(:title.exists => true)
|
946
|
-
@criteria.selector.should == { :title => { "$exists" => true } }
|
955
|
+
@criteria.selector.should == { :_type => "Person", :title => { "$exists" => true } }
|
947
956
|
end
|
948
957
|
|
949
958
|
end
|
@@ -952,7 +961,7 @@ describe Mongoid::Criteria do
|
|
952
961
|
|
953
962
|
it "returns those matching a gt clause" do
|
954
963
|
@criteria.where(:age.gt => 30)
|
955
|
-
@criteria.selector.should == { :age => { "$gt" => 30 } }
|
964
|
+
@criteria.selector.should == { :_type => "Person", :age => { "$gt" => 30 } }
|
956
965
|
end
|
957
966
|
|
958
967
|
end
|
@@ -961,7 +970,7 @@ describe Mongoid::Criteria do
|
|
961
970
|
|
962
971
|
it "returns those matching a gte clause" do
|
963
972
|
@criteria.where(:age.gte => 33)
|
964
|
-
@criteria.selector.should == { :age => { "$gte" => 33 } }
|
973
|
+
@criteria.selector.should == { :_type => "Person", :age => { "$gte" => 33 } }
|
965
974
|
end
|
966
975
|
|
967
976
|
end
|
@@ -970,7 +979,7 @@ describe Mongoid::Criteria do
|
|
970
979
|
|
971
980
|
it "returns those matching an in clause" do
|
972
981
|
@criteria.where(:title.in => ["Sir", "Madam"])
|
973
|
-
@criteria.selector.should == { :title => { "$in" => ["Sir", "Madam"] } }
|
982
|
+
@criteria.selector.should == { :_type => "Person", :title => { "$in" => ["Sir", "Madam"] } }
|
974
983
|
end
|
975
984
|
|
976
985
|
end
|
@@ -979,7 +988,7 @@ describe Mongoid::Criteria do
|
|
979
988
|
|
980
989
|
it "returns those matching a lt clause" do
|
981
990
|
@criteria.where(:age.lt => 34)
|
982
|
-
@criteria.selector.should == { :age => { "$lt" => 34 } }
|
991
|
+
@criteria.selector.should == { :_type => "Person", :age => { "$lt" => 34 } }
|
983
992
|
end
|
984
993
|
|
985
994
|
end
|
@@ -988,7 +997,7 @@ describe Mongoid::Criteria do
|
|
988
997
|
|
989
998
|
it "returns those matching a lte clause" do
|
990
999
|
@criteria.where(:age.lte => 33)
|
991
|
-
@criteria.selector.should == { :age => { "$lte" => 33 } }
|
1000
|
+
@criteria.selector.should == { :_type => "Person", :age => { "$lte" => 33 } }
|
992
1001
|
end
|
993
1002
|
|
994
1003
|
end
|
@@ -997,7 +1006,7 @@ describe Mongoid::Criteria do
|
|
997
1006
|
|
998
1007
|
it "returns those matching a ne clause" do
|
999
1008
|
@criteria.where(:age.ne => 50)
|
1000
|
-
@criteria.selector.should == { :age => { "$ne" => 50 } }
|
1009
|
+
@criteria.selector.should == { :_type => "Person", :age => { "$ne" => 50 } }
|
1001
1010
|
end
|
1002
1011
|
|
1003
1012
|
end
|
@@ -1006,7 +1015,7 @@ describe Mongoid::Criteria do
|
|
1006
1015
|
|
1007
1016
|
it "returns those matching a nin clause" do
|
1008
1017
|
@criteria.where(:title.nin => ["Esquire", "Congressman"])
|
1009
|
-
@criteria.selector.should == { :title => { "$nin" => ["Esquire", "Congressman"] } }
|
1018
|
+
@criteria.selector.should == { :_type => "Person", :title => { "$nin" => ["Esquire", "Congressman"] } }
|
1010
1019
|
end
|
1011
1020
|
|
1012
1021
|
end
|
@@ -1015,7 +1024,7 @@ describe Mongoid::Criteria do
|
|
1015
1024
|
|
1016
1025
|
it "returns those matching a size clause" do
|
1017
1026
|
@criteria.where(:aliases.size => 2)
|
1018
|
-
@criteria.selector.should == { :aliases => { "$size" => 2 } }
|
1027
|
+
@criteria.selector.should == { :_type => "Person", :aliases => { "$size" => 2 } }
|
1019
1028
|
end
|
1020
1029
|
|
1021
1030
|
end
|
@@ -1028,7 +1037,7 @@ describe Mongoid::Criteria do
|
|
1028
1037
|
|
1029
1038
|
it "adds the $where clause to the selector" do
|
1030
1039
|
@criteria.where("this.date < new Date()")
|
1031
|
-
@criteria.selector.should == { "$where" => "this.date < new Date()" }
|
1040
|
+
@criteria.selector.should == { :_type => "Person", "$where" => "this.date < new Date()" }
|
1032
1041
|
end
|
1033
1042
|
|
1034
1043
|
end
|
@@ -4,14 +4,16 @@ describe Mongoid::Document do
|
|
4
4
|
|
5
5
|
before do
|
6
6
|
@collection = stub(:name => "people")
|
7
|
-
@
|
7
|
+
@canvas_collection = stub(:name => "canvases")
|
8
|
+
@database = mock
|
8
9
|
Mongoid.stubs(:database).returns(@database)
|
10
|
+
@database.stubs(:collection).with("people").returns(@collection)
|
11
|
+
@database.stubs(:collection).with("canvases").returns(@canvas_collection)
|
9
12
|
end
|
10
13
|
|
11
14
|
after do
|
12
|
-
Person.
|
13
|
-
|
14
|
-
@collection = nil
|
15
|
+
Person._collection = nil
|
16
|
+
Canvas._collection = nil
|
15
17
|
end
|
16
18
|
|
17
19
|
describe "#==" do
|
@@ -54,6 +56,14 @@ describe Mongoid::Document do
|
|
54
56
|
|
55
57
|
end
|
56
58
|
|
59
|
+
context "when comapring parent to its subclass" do
|
60
|
+
|
61
|
+
it "returns false" do
|
62
|
+
Canvas.new.should_not == Firefox.new
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
57
67
|
end
|
58
68
|
|
59
69
|
describe "#alias_method_chain" do
|
@@ -126,15 +136,28 @@ describe Mongoid::Document do
|
|
126
136
|
|
127
137
|
end
|
128
138
|
|
129
|
-
describe ".collection_name" do
|
139
|
+
describe ".collection_name=" do
|
140
|
+
|
141
|
+
context "on a parent class" do
|
142
|
+
|
143
|
+
it "sets the collection name on the document class" do
|
144
|
+
Patient.collection_name = "pats"
|
145
|
+
Patient.collection_name.should == "pats"
|
146
|
+
end
|
130
147
|
|
131
|
-
before do
|
132
|
-
@coll = stub(:name => "population")
|
133
148
|
end
|
134
149
|
|
135
|
-
|
136
|
-
|
137
|
-
|
150
|
+
context "on a subclass" do
|
151
|
+
|
152
|
+
after do
|
153
|
+
Canvas.collection_name = "canvases"
|
154
|
+
end
|
155
|
+
|
156
|
+
it "sets the collection name for the entire hierarchy" do
|
157
|
+
Firefox.collection_name = "browsers"
|
158
|
+
Canvas.collection_name.should == "browsers"
|
159
|
+
end
|
160
|
+
|
138
161
|
end
|
139
162
|
|
140
163
|
end
|
@@ -149,12 +172,28 @@ describe Mongoid::Document do
|
|
149
172
|
|
150
173
|
describe "#defaults" do
|
151
174
|
|
152
|
-
|
153
|
-
|
175
|
+
context "on parent classes" do
|
176
|
+
|
177
|
+
before do
|
178
|
+
@shape = Shape.new
|
179
|
+
end
|
180
|
+
|
181
|
+
it "does not return subclass defaults" do
|
182
|
+
@shape.defaults.should == { "x" => 0, "y" => 0 }
|
183
|
+
end
|
184
|
+
|
154
185
|
end
|
155
186
|
|
156
|
-
|
157
|
-
|
187
|
+
context "on subclasses" do
|
188
|
+
|
189
|
+
before do
|
190
|
+
@circle = Circle.new
|
191
|
+
end
|
192
|
+
|
193
|
+
it "has the parent and child defaults" do
|
194
|
+
@circle.defaults.should == { "x" => 0, "y" => 0, "radius" => 0 }
|
195
|
+
end
|
196
|
+
|
158
197
|
end
|
159
198
|
|
160
199
|
end
|
@@ -199,6 +238,15 @@ describe Mongoid::Document do
|
|
199
238
|
|
200
239
|
end
|
201
240
|
|
241
|
+
context "when a subclass is embedded" do
|
242
|
+
|
243
|
+
it "returns true" do
|
244
|
+
circle = Circle.new
|
245
|
+
circle.should be_embedded
|
246
|
+
end
|
247
|
+
|
248
|
+
end
|
249
|
+
|
202
250
|
end
|
203
251
|
|
204
252
|
describe ".field" do
|
@@ -232,7 +280,8 @@ describe Mongoid::Document do
|
|
232
280
|
|
233
281
|
it "allows proper access to the object" do
|
234
282
|
@person.mixed_drink.should == @drink
|
235
|
-
@person.attributes[:mixed_drink].except(:_id).should ==
|
283
|
+
@person.attributes[:mixed_drink].except(:_id).except(:_type).should ==
|
284
|
+
{ "name" => "Jack and Coke" }
|
236
285
|
end
|
237
286
|
|
238
287
|
end
|
@@ -275,6 +324,38 @@ describe Mongoid::Document do
|
|
275
324
|
|
276
325
|
end
|
277
326
|
|
327
|
+
describe "#fields" do
|
328
|
+
|
329
|
+
context "on parent classes" do
|
330
|
+
|
331
|
+
before do
|
332
|
+
@shape = Shape.new
|
333
|
+
end
|
334
|
+
|
335
|
+
it "does not return subclass fields" do
|
336
|
+
@shape.fields.keys.should include("x")
|
337
|
+
@shape.fields.keys.should include("y")
|
338
|
+
@shape.fields.keys.should_not include("radius")
|
339
|
+
end
|
340
|
+
|
341
|
+
end
|
342
|
+
|
343
|
+
context "on subclasses" do
|
344
|
+
|
345
|
+
before do
|
346
|
+
@circle = Circle.new
|
347
|
+
end
|
348
|
+
|
349
|
+
it "has the parent and child fields" do
|
350
|
+
@circle.fields.keys.should include("x")
|
351
|
+
@circle.fields.keys.should include("y")
|
352
|
+
@circle.fields.keys.should include("radius")
|
353
|
+
end
|
354
|
+
|
355
|
+
end
|
356
|
+
|
357
|
+
end
|
358
|
+
|
278
359
|
describe ".human_name" do
|
279
360
|
|
280
361
|
it "returns the class name underscored and humanized" do
|
@@ -315,12 +396,21 @@ describe Mongoid::Document do
|
|
315
396
|
|
316
397
|
end
|
317
398
|
|
399
|
+
context "when indexing a subclass" do
|
400
|
+
|
401
|
+
it "sets the index on the root class collection" do
|
402
|
+
@canvas_collection.expects(:create_index).with(:name, true)
|
403
|
+
Firefox.index :name, :unique => true
|
404
|
+
end
|
405
|
+
|
406
|
+
end
|
407
|
+
|
318
408
|
end
|
319
409
|
|
320
410
|
describe ".instantiate" do
|
321
411
|
|
322
412
|
before do
|
323
|
-
@attributes = { :_id => "1", :title => "Sir", :age => 30 }
|
413
|
+
@attributes = { :_id => "1", :_type => "Person", :title => "Sir", :age => 30 }
|
324
414
|
@person = Person.new(@attributes)
|
325
415
|
end
|
326
416
|
|
@@ -364,6 +454,18 @@ describe Mongoid::Document do
|
|
364
454
|
|
365
455
|
end
|
366
456
|
|
457
|
+
context "when key is on a subclass" do
|
458
|
+
|
459
|
+
before do
|
460
|
+
Firefox.key :name
|
461
|
+
end
|
462
|
+
|
463
|
+
it "sets the key for the entire hierarchy" do
|
464
|
+
Canvas.primary_key.should == [:name]
|
465
|
+
end
|
466
|
+
|
467
|
+
end
|
468
|
+
|
367
469
|
end
|
368
470
|
|
369
471
|
describe "#new" do
|
@@ -434,6 +536,14 @@ describe Mongoid::Document do
|
|
434
536
|
|
435
537
|
end
|
436
538
|
|
539
|
+
context "without a type specified" do
|
540
|
+
|
541
|
+
it "sets the type" do
|
542
|
+
Person.new._type.should == "Person"
|
543
|
+
end
|
544
|
+
|
545
|
+
end
|
546
|
+
|
437
547
|
end
|
438
548
|
|
439
549
|
describe "#new_record?" do
|
@@ -464,7 +574,7 @@ describe Mongoid::Document do
|
|
464
574
|
|
465
575
|
end
|
466
576
|
|
467
|
-
describe "#
|
577
|
+
describe "#_parent" do
|
468
578
|
|
469
579
|
before do
|
470
580
|
@attributes = { :title => "Sir",
|
@@ -477,7 +587,7 @@ describe Mongoid::Document do
|
|
477
587
|
context "when document is embedded" do
|
478
588
|
|
479
589
|
it "returns the parent document" do
|
480
|
-
@person.addresses.first.
|
590
|
+
@person.addresses.first._parent.should == @person
|
481
591
|
end
|
482
592
|
|
483
593
|
end
|
@@ -485,7 +595,7 @@ describe Mongoid::Document do
|
|
485
595
|
context "when document is root" do
|
486
596
|
|
487
597
|
it "returns nil" do
|
488
|
-
@person.
|
598
|
+
@person._parent.should be_nil
|
489
599
|
end
|
490
600
|
|
491
601
|
end
|
@@ -501,7 +611,7 @@ describe Mongoid::Document do
|
|
501
611
|
|
502
612
|
it "sets the parent on each element" do
|
503
613
|
@child.parentize(@parent, :child)
|
504
|
-
@child.
|
614
|
+
@child._parent.should == @parent
|
505
615
|
end
|
506
616
|
|
507
617
|
end
|
@@ -555,7 +665,7 @@ describe Mongoid::Document do
|
|
555
665
|
|
556
666
|
end
|
557
667
|
|
558
|
-
describe "#
|
668
|
+
describe "#_root" do
|
559
669
|
|
560
670
|
before do
|
561
671
|
@person = Person.new(:title => "Mr")
|
@@ -568,7 +678,7 @@ describe Mongoid::Document do
|
|
568
678
|
context "when document is the root" do
|
569
679
|
|
570
680
|
it "returns self" do
|
571
|
-
@person.
|
681
|
+
@person._root.should == @person
|
572
682
|
end
|
573
683
|
|
574
684
|
end
|
@@ -576,7 +686,7 @@ describe Mongoid::Document do
|
|
576
686
|
context "when document is embedded one level" do
|
577
687
|
|
578
688
|
it "returns the parent" do
|
579
|
-
@phone_number.
|
689
|
+
@phone_number._root.should == @person
|
580
690
|
end
|
581
691
|
|
582
692
|
end
|
@@ -584,7 +694,39 @@ describe Mongoid::Document do
|
|
584
694
|
context "when document is embedded multiple levels" do
|
585
695
|
|
586
696
|
it "returns the top level parent" do
|
587
|
-
@country_code.
|
697
|
+
@country_code._root.should == @person
|
698
|
+
end
|
699
|
+
|
700
|
+
end
|
701
|
+
|
702
|
+
end
|
703
|
+
|
704
|
+
describe ".store_in" do
|
705
|
+
|
706
|
+
context "on a parent class" do
|
707
|
+
|
708
|
+
before do
|
709
|
+
Patient.store_in :population
|
710
|
+
end
|
711
|
+
|
712
|
+
it "sets the collection name for the document" do
|
713
|
+
Patient.collection_name.should == "population"
|
714
|
+
end
|
715
|
+
|
716
|
+
end
|
717
|
+
|
718
|
+
context "on a subclass" do
|
719
|
+
|
720
|
+
before do
|
721
|
+
Firefox.store_in :browsers
|
722
|
+
end
|
723
|
+
|
724
|
+
after do
|
725
|
+
Firefox.store_in :canvases
|
726
|
+
end
|
727
|
+
|
728
|
+
it "changes the collection name for the entire hierarchy" do
|
729
|
+
Canvas.collection_name.should == "browsers"
|
588
730
|
end
|
589
731
|
|
590
732
|
end
|
@@ -733,10 +875,14 @@ describe Mongoid::Document do
|
|
733
875
|
|
734
876
|
before do
|
735
877
|
@person = Person.new
|
878
|
+
@canvas = Canvas.new
|
879
|
+
@firefox = Firefox.new
|
736
880
|
end
|
737
881
|
|
738
882
|
after do
|
739
883
|
Person.validations.clear
|
884
|
+
Canvas.validations.clear
|
885
|
+
Firefox.validations.clear
|
740
886
|
end
|
741
887
|
|
742
888
|
describe "#validates_acceptance_of" do
|
@@ -843,12 +989,35 @@ describe Mongoid::Document do
|
|
843
989
|
|
844
990
|
describe "#validates_presence_of" do
|
845
991
|
|
846
|
-
|
847
|
-
|
848
|
-
|
992
|
+
context "on a parent class" do
|
993
|
+
|
994
|
+
it "fails if the field is nil on the parent" do
|
995
|
+
Person.class_eval do
|
996
|
+
validates_presence_of :title
|
997
|
+
end
|
998
|
+
@person.valid?.should be_false
|
999
|
+
@person.errors.on(:title).should_not be_nil
|
849
1000
|
end
|
850
|
-
|
851
|
-
|
1001
|
+
|
1002
|
+
it "fails if the field is nil on a subclass" do
|
1003
|
+
Canvas.class_eval do
|
1004
|
+
validates_presence_of :name
|
1005
|
+
end
|
1006
|
+
@firefox.valid?.should be_false
|
1007
|
+
@firefox.errors.on(:name).should_not be_nil
|
1008
|
+
end
|
1009
|
+
|
1010
|
+
end
|
1011
|
+
|
1012
|
+
context "on a subclass" do
|
1013
|
+
|
1014
|
+
it "parent class does not get subclass validations" do
|
1015
|
+
Firefox.class_eval do
|
1016
|
+
validates_presence_of :name
|
1017
|
+
end
|
1018
|
+
@canvas.valid?.should be_true
|
1019
|
+
end
|
1020
|
+
|
852
1021
|
end
|
853
1022
|
|
854
1023
|
end
|