mongoid 1.2.6 → 1.2.7
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/VERSION +1 -1
- data/lib/mongoid.rb +1 -0
- data/lib/mongoid/associations.rb +1 -1
- data/lib/mongoid/attributes.rb +1 -0
- data/lib/mongoid/collection.rb +1 -1
- data/lib/mongoid/commands.rb +1 -1
- data/lib/mongoid/commands/delete_all.rb +2 -1
- data/lib/mongoid/commands/destroy_all.rb +1 -1
- data/lib/mongoid/components.rb +1 -0
- data/lib/mongoid/config.rb +3 -1
- data/lib/mongoid/contexts.rb +21 -0
- data/lib/mongoid/contexts/enumerable.rb +15 -12
- data/lib/mongoid/contexts/ids.rb +25 -0
- data/lib/mongoid/contexts/mongo.rb +25 -23
- data/lib/mongoid/contexts/paging.rb +2 -2
- data/lib/mongoid/criteria.rb +5 -43
- data/lib/mongoid/document.rb +1 -0
- data/lib/mongoid/enslavement.rb +38 -0
- data/lib/mongoid/fields.rb +5 -2
- data/lib/mongoid/identity.rb +7 -1
- data/lib/mongoid/named_scope.rb +2 -0
- data/mongoid.gemspec +8 -2
- data/spec/integration/mongoid/commands_spec.rb +2 -2
- data/spec/integration/mongoid/contexts/enumerable_spec.rb +13 -0
- data/spec/integration/mongoid/criteria_spec.rb +2 -2
- data/spec/integration/mongoid/document_spec.rb +5 -1
- data/spec/integration/mongoid/finders_spec.rb +85 -28
- data/spec/models/person.rb +1 -0
- data/spec/unit/mongoid/associations_spec.rb +12 -0
- data/spec/unit/mongoid/attributes_spec.rb +60 -51
- data/spec/unit/mongoid/collection_spec.rb +30 -0
- data/spec/unit/mongoid/commands/delete_all_spec.rb +3 -3
- data/spec/unit/mongoid/commands_spec.rb +16 -0
- data/spec/unit/mongoid/config_spec.rb +7 -0
- data/spec/unit/mongoid/contexts/enumerable_spec.rb +151 -11
- data/spec/unit/mongoid/contexts/mongo_spec.rb +168 -42
- data/spec/unit/mongoid/contexts_spec.rb +25 -0
- data/spec/unit/mongoid/criteria_spec.rb +49 -75
- data/spec/unit/mongoid/criterion/exclusion_spec.rb +3 -13
- data/spec/unit/mongoid/criterion/inclusion_spec.rb +17 -19
- data/spec/unit/mongoid/criterion/optional_spec.rb +25 -8
- data/spec/unit/mongoid/document_spec.rb +4 -0
- data/spec/unit/mongoid/enslavement_spec.rb +63 -0
- data/spec/unit/mongoid/extensions/array/conversions_spec.rb +2 -2
- data/spec/unit/mongoid/extensions/object/conversions_spec.rb +2 -2
- data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +1 -1
- data/spec/unit/mongoid/fields_spec.rb +10 -0
- data/spec/unit/mongoid/finders_spec.rb +1 -1
- data/spec/unit/mongoid/identity_spec.rb +23 -3
- data/spec/unit/mongoid/named_scope_spec.rb +15 -2
- data/spec/unit/mongoid/scope_spec.rb +1 -1
- metadata +8 -2
@@ -40,6 +40,36 @@ describe Mongoid::Collection do
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
+
describe "#directed" do
|
44
|
+
|
45
|
+
before do
|
46
|
+
slaves.expects(:empty?).returns(false)
|
47
|
+
end
|
48
|
+
|
49
|
+
context "when an enslave option is not passed" do
|
50
|
+
|
51
|
+
before do
|
52
|
+
Person.enslave
|
53
|
+
end
|
54
|
+
|
55
|
+
after do
|
56
|
+
Person.enslaved = false
|
57
|
+
end
|
58
|
+
|
59
|
+
it "uses the default" do
|
60
|
+
collection.directed.should == slaves
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context "when an enslave option is passed" do
|
65
|
+
|
66
|
+
it "overwrites the default" do
|
67
|
+
collection.directed(:enslave => true).should == slaves
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
43
73
|
describe "#find" do
|
44
74
|
|
45
75
|
before do
|
@@ -19,7 +19,7 @@ describe Mongoid::Commands::DeleteAll do
|
|
19
19
|
|
20
20
|
it "deletes each document that the criteria finds" do
|
21
21
|
@klass.expects(:collection).returns(@collection)
|
22
|
-
@collection.expects(:remove).with(@conditions[:conditions].merge(:_type => "Person"))
|
22
|
+
@collection.expects(:remove).with(@conditions[:conditions].merge(:_type => "Person"), :safe => true)
|
23
23
|
Mongoid::Commands::DeleteAll.execute(@klass, @conditions)
|
24
24
|
end
|
25
25
|
|
@@ -33,7 +33,7 @@ describe Mongoid::Commands::DeleteAll do
|
|
33
33
|
|
34
34
|
it "drops the collection" do
|
35
35
|
@klass.expects(:collection).returns(@collection)
|
36
|
-
@collection.expects(:remove).with(:_type => "Person")
|
36
|
+
@collection.expects(:remove).with({ :_type => "Person" }, { :safe => true })
|
37
37
|
Mongoid::Commands::DeleteAll.execute(@klass)
|
38
38
|
end
|
39
39
|
|
@@ -47,7 +47,7 @@ describe Mongoid::Commands::DeleteAll do
|
|
47
47
|
|
48
48
|
it "drops the collection" do
|
49
49
|
@klass.expects(:collection).returns(@collection)
|
50
|
-
@collection.expects(:remove).with(:_type => "Person")
|
50
|
+
@collection.expects(:remove).with({ :_type => "Person" }, { :safe => true })
|
51
51
|
Mongoid::Commands::DeleteAll.execute(@klass, {})
|
52
52
|
end
|
53
53
|
|
@@ -37,6 +37,22 @@ describe Mongoid::Commands do
|
|
37
37
|
@person = Person.new
|
38
38
|
end
|
39
39
|
|
40
|
+
context "when validation fails" do
|
41
|
+
|
42
|
+
it "it raises an error" do
|
43
|
+
Mongoid::Commands::Save.expects(:execute).with(@person, true).returns(false)
|
44
|
+
@person.save.should be_false
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should run callback before_create and no after_create" do
|
48
|
+
@person.expects(:run_callbacks).with(:before_create)
|
49
|
+
Mongoid::Commands::Save.expects(:execute).with(@person, true).returns(false)
|
50
|
+
@person.expects(:run_callbacks).with(:after_create).never
|
51
|
+
@person.save.should be_false
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
40
56
|
it "delegates to the save command" do
|
41
57
|
Mongoid::Commands::Save.expects(:execute).with(@person, true).returns(true)
|
42
58
|
@person.save
|
@@ -8,9 +8,10 @@ describe Mongoid::Contexts::Enumerable do
|
|
8
8
|
@melbourne = Address.new(:number => 20, :street => "Bourke Street")
|
9
9
|
@new_york = Address.new(:number => 20, :street => "Broadway")
|
10
10
|
@docs = [ @london, @shanghai, @melbourne, @new_york ]
|
11
|
-
@
|
12
|
-
@
|
13
|
-
@
|
11
|
+
@criteria = Mongoid::Criteria.new(Address)
|
12
|
+
@criteria.documents = @docs
|
13
|
+
@criteria.where(:street => "Bourke Street").only(:number)
|
14
|
+
@context = Mongoid::Contexts::Enumerable.new(@criteria)
|
14
15
|
end
|
15
16
|
|
16
17
|
describe "#aggregate" do
|
@@ -40,6 +41,11 @@ describe Mongoid::Contexts::Enumerable do
|
|
40
41
|
|
41
42
|
describe "#execute" do
|
42
43
|
|
44
|
+
before do
|
45
|
+
@criteria = Mongoid::Criteria.new(Address)
|
46
|
+
@criteria.documents = @docs
|
47
|
+
end
|
48
|
+
|
43
49
|
it "returns the matching documents from the array" do
|
44
50
|
@context.execute.should == [ @melbourne ]
|
45
51
|
end
|
@@ -47,7 +53,8 @@ describe Mongoid::Contexts::Enumerable do
|
|
47
53
|
context "when selector is empty" do
|
48
54
|
|
49
55
|
before do
|
50
|
-
@
|
56
|
+
@criteria.only(:number)
|
57
|
+
@context = Mongoid::Contexts::Enumerable.new(@criteria)
|
51
58
|
end
|
52
59
|
|
53
60
|
it "returns all the documents" do
|
@@ -58,8 +65,8 @@ describe Mongoid::Contexts::Enumerable do
|
|
58
65
|
context "when skip and limit are in the options" do
|
59
66
|
|
60
67
|
before do
|
61
|
-
@
|
62
|
-
@context = Mongoid::Contexts::Enumerable.new(
|
68
|
+
@criteria.skip(2).limit(2)
|
69
|
+
@context = Mongoid::Contexts::Enumerable.new(@criteria)
|
63
70
|
end
|
64
71
|
|
65
72
|
it "properly narrows down the matching results" do
|
@@ -67,6 +74,19 @@ describe Mongoid::Contexts::Enumerable do
|
|
67
74
|
end
|
68
75
|
end
|
69
76
|
|
77
|
+
context "when limit is set without skip in the options" do
|
78
|
+
|
79
|
+
before do
|
80
|
+
@criteria.limit(2)
|
81
|
+
@context = Mongoid::Contexts::Enumerable.new(@criteria)
|
82
|
+
end
|
83
|
+
|
84
|
+
it "properly narrows down the matching results" do
|
85
|
+
@context.execute.size.should == 2
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
70
90
|
end
|
71
91
|
|
72
92
|
describe "#first" do
|
@@ -105,7 +125,10 @@ describe Mongoid::Contexts::Enumerable do
|
|
105
125
|
let(:documents) { [stub] }
|
106
126
|
|
107
127
|
before do
|
108
|
-
@
|
128
|
+
@criteria = Mongoid::Criteria.new(Address)
|
129
|
+
@criteria.documents = documents
|
130
|
+
@criteria.where(selector).skip(20)
|
131
|
+
@context = Mongoid::Contexts::Enumerable.new(@criteria)
|
109
132
|
end
|
110
133
|
|
111
134
|
it "sets the selector" do
|
@@ -160,7 +183,8 @@ describe Mongoid::Contexts::Enumerable do
|
|
160
183
|
|
161
184
|
before do
|
162
185
|
@criteria = Mongoid::Criteria.new(Person).extras({ :page => 5 })
|
163
|
-
@
|
186
|
+
@criteria.documents = []
|
187
|
+
@context = Mongoid::Contexts::Enumerable.new(@criteria)
|
164
188
|
end
|
165
189
|
|
166
190
|
it "returns the page option" do
|
@@ -173,7 +197,8 @@ describe Mongoid::Contexts::Enumerable do
|
|
173
197
|
|
174
198
|
before do
|
175
199
|
@criteria = Mongoid::Criteria.new(Person)
|
176
|
-
@
|
200
|
+
@criteria.documents = []
|
201
|
+
@context = Mongoid::Contexts::Enumerable.new(@criteria)
|
177
202
|
end
|
178
203
|
|
179
204
|
it "returns 1" do
|
@@ -188,7 +213,7 @@ describe Mongoid::Contexts::Enumerable do
|
|
188
213
|
|
189
214
|
before do
|
190
215
|
@criteria = Person.criteria.skip(2).limit(2)
|
191
|
-
@context = Mongoid::Contexts::Enumerable.new(
|
216
|
+
@context = Mongoid::Contexts::Enumerable.new(@criteria)
|
192
217
|
@results = @context.paginate
|
193
218
|
end
|
194
219
|
|
@@ -212,7 +237,9 @@ describe Mongoid::Contexts::Enumerable do
|
|
212
237
|
context "when a limit option does not exist" do
|
213
238
|
|
214
239
|
before do
|
215
|
-
@
|
240
|
+
@criteria = Person.criteria.limit(50)
|
241
|
+
@criteria.documents = []
|
242
|
+
@context = Mongoid::Contexts::Enumerable.new(@criteria)
|
216
243
|
end
|
217
244
|
|
218
245
|
it "returns the limit" do
|
@@ -231,4 +258,117 @@ describe Mongoid::Contexts::Enumerable do
|
|
231
258
|
|
232
259
|
end
|
233
260
|
|
261
|
+
context "#id_criteria" do
|
262
|
+
|
263
|
+
let(:criteria) do
|
264
|
+
criteria = Mongoid::Criteria.new(Address)
|
265
|
+
criteria.documents = []
|
266
|
+
criteria
|
267
|
+
end
|
268
|
+
let(:context) { criteria.context }
|
269
|
+
|
270
|
+
context "with a single argument" do
|
271
|
+
|
272
|
+
let(:id) { Mongo::ObjectID.new.to_s }
|
273
|
+
|
274
|
+
before do
|
275
|
+
criteria.expects(:id).with(id).returns(criteria)
|
276
|
+
end
|
277
|
+
|
278
|
+
context "when the document is found" do
|
279
|
+
|
280
|
+
let(:document) { stub }
|
281
|
+
|
282
|
+
it "returns a matching document" do
|
283
|
+
context.expects(:one).returns(document)
|
284
|
+
document.expects(:blank? => false)
|
285
|
+
context.id_criteria(id).should == document
|
286
|
+
end
|
287
|
+
|
288
|
+
end
|
289
|
+
|
290
|
+
context "when the document is not found" do
|
291
|
+
|
292
|
+
it "raises an error" do
|
293
|
+
context.expects(:one).returns(nil)
|
294
|
+
lambda { context.id_criteria(id) }.should raise_error
|
295
|
+
end
|
296
|
+
|
297
|
+
end
|
298
|
+
|
299
|
+
end
|
300
|
+
|
301
|
+
context "multiple arguments" do
|
302
|
+
|
303
|
+
context "when an array of ids" do
|
304
|
+
|
305
|
+
let(:ids) do
|
306
|
+
(0..2).inject([]) { |ary, i| ary << Mongo::ObjectID.new.to_s }
|
307
|
+
end
|
308
|
+
|
309
|
+
context "when documents are found" do
|
310
|
+
|
311
|
+
let(:docs) do
|
312
|
+
(0..2).inject([]) { |ary, i| ary << stub }
|
313
|
+
end
|
314
|
+
|
315
|
+
before do
|
316
|
+
criteria.expects(:id).with(ids).returns(criteria)
|
317
|
+
end
|
318
|
+
|
319
|
+
it "returns matching documents" do
|
320
|
+
context.expects(:execute).returns(docs)
|
321
|
+
context.id_criteria(ids).should == docs
|
322
|
+
end
|
323
|
+
|
324
|
+
end
|
325
|
+
|
326
|
+
context "when documents are not found" do
|
327
|
+
|
328
|
+
it "raises an error" do
|
329
|
+
context.expects(:execute).returns([])
|
330
|
+
lambda { context.id_criteria(ids) }.should raise_error
|
331
|
+
end
|
332
|
+
|
333
|
+
end
|
334
|
+
|
335
|
+
end
|
336
|
+
|
337
|
+
context "when an array of object ids" do
|
338
|
+
|
339
|
+
let(:ids) do
|
340
|
+
(0..2).inject([]) { |ary, i| ary << Mongo::ObjectID.new }
|
341
|
+
end
|
342
|
+
|
343
|
+
context "when documents are found" do
|
344
|
+
|
345
|
+
let(:docs) do
|
346
|
+
(0..2).inject([]) { |ary, i| ary << stub }
|
347
|
+
end
|
348
|
+
|
349
|
+
before do
|
350
|
+
criteria.expects(:id).with(ids).returns(criteria)
|
351
|
+
end
|
352
|
+
|
353
|
+
it "returns matching documents" do
|
354
|
+
context.expects(:execute).returns(docs)
|
355
|
+
context.id_criteria(ids).should == docs
|
356
|
+
end
|
357
|
+
|
358
|
+
end
|
359
|
+
|
360
|
+
context "when documents are not found" do
|
361
|
+
|
362
|
+
it "raises an error" do
|
363
|
+
context.expects(:execute).returns([])
|
364
|
+
lambda { context.id_criteria(ids) }.should raise_error
|
365
|
+
end
|
366
|
+
|
367
|
+
end
|
368
|
+
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
372
|
+
end
|
373
|
+
|
234
374
|
end
|
@@ -5,9 +5,9 @@ describe Mongoid::Contexts::Mongo do
|
|
5
5
|
describe "#aggregate" do
|
6
6
|
|
7
7
|
before do
|
8
|
-
@
|
9
|
-
@
|
10
|
-
@context = Mongoid::Contexts::Mongo.new(@
|
8
|
+
@criteria = Mongoid::Criteria.new(Person)
|
9
|
+
@criteria.only(:field1)
|
10
|
+
@context = Mongoid::Contexts::Mongo.new(@criteria)
|
11
11
|
end
|
12
12
|
|
13
13
|
context "when klass not provided" do
|
@@ -19,7 +19,7 @@ describe Mongoid::Contexts::Mongo do
|
|
19
19
|
end
|
20
20
|
|
21
21
|
it "calls group on the collection with the aggregate js" do
|
22
|
-
@collection.expects(:group).with([:field1], {}, {:count => 0}, @reduce, true)
|
22
|
+
@collection.expects(:group).with([:field1], {:_type => {'$in' => ['Doctor', 'Person']}}, {:count => 0}, @reduce, true)
|
23
23
|
@context.aggregate
|
24
24
|
end
|
25
25
|
|
@@ -30,9 +30,9 @@ describe Mongoid::Contexts::Mongo do
|
|
30
30
|
describe "#count" do
|
31
31
|
|
32
32
|
before do
|
33
|
-
@
|
34
|
-
@
|
35
|
-
@context = Mongoid::Contexts::Mongo.new(@
|
33
|
+
@criteria = Mongoid::Criteria.new(Person)
|
34
|
+
@criteria.where(:test => 'Testing')
|
35
|
+
@context = Mongoid::Contexts::Mongo.new(@criteria)
|
36
36
|
end
|
37
37
|
|
38
38
|
context "when criteria has not been executed" do
|
@@ -56,7 +56,7 @@ describe Mongoid::Contexts::Mongo do
|
|
56
56
|
end
|
57
57
|
|
58
58
|
it "returns the count from the cursor without creating the documents" do
|
59
|
-
@collection.expects(:find).with(@selector, {}).returns(@cursor)
|
59
|
+
@collection.expects(:find).with(@criteria.selector, {}).returns(@cursor)
|
60
60
|
@cursor.expects(:count).returns(10)
|
61
61
|
@context.count.should == 10
|
62
62
|
end
|
@@ -74,7 +74,9 @@ describe Mongoid::Contexts::Mongo do
|
|
74
74
|
@cursor = stub(:count => 500)
|
75
75
|
@collection = mock
|
76
76
|
@klass = stub(:collection => @collection, :hereditary => false, :instantiate => @person)
|
77
|
-
@
|
77
|
+
@criteria = Mongoid::Criteria.new(@klass)
|
78
|
+
@criteria.where(selector).skip(20)
|
79
|
+
@context = Mongoid::Contexts::Mongo.new(@criteria)
|
78
80
|
end
|
79
81
|
|
80
82
|
it "calls find on the collection" do
|
@@ -97,7 +99,7 @@ describe Mongoid::Contexts::Mongo do
|
|
97
99
|
context "when _type not in the field list" do
|
98
100
|
|
99
101
|
before do
|
100
|
-
|
102
|
+
@criteria.only(:title)
|
101
103
|
@expected_options = { :skip => 20, :fields => [ :title, :_type ] }
|
102
104
|
end
|
103
105
|
|
@@ -115,10 +117,10 @@ describe Mongoid::Contexts::Mongo do
|
|
115
117
|
describe "#group" do
|
116
118
|
|
117
119
|
before do
|
118
|
-
@
|
119
|
-
@
|
120
|
+
@criteria = Mongoid::Criteria.new(Person)
|
121
|
+
@criteria.only(:field1)
|
120
122
|
@grouping = [{ "title" => "Sir", "group" => [{ "title" => "Sir", "age" => 30, "_type" => "Person" }] }]
|
121
|
-
@context = Mongoid::Contexts::Mongo.new(@
|
123
|
+
@context = Mongoid::Contexts::Mongo.new(@criteria)
|
122
124
|
end
|
123
125
|
|
124
126
|
context "when klass provided" do
|
@@ -130,7 +132,13 @@ describe Mongoid::Contexts::Mongo do
|
|
130
132
|
end
|
131
133
|
|
132
134
|
it "calls group on the collection with the aggregate js" do
|
133
|
-
@collection.expects(:group).with(
|
135
|
+
@collection.expects(:group).with(
|
136
|
+
[:field1],
|
137
|
+
{:_type => { "$in" => ["Doctor", "Person"] }},
|
138
|
+
{:group => []},
|
139
|
+
@reduce,
|
140
|
+
true
|
141
|
+
).returns(@grouping)
|
134
142
|
@context.group
|
135
143
|
end
|
136
144
|
|
@@ -145,11 +153,13 @@ describe Mongoid::Contexts::Mongo do
|
|
145
153
|
let(:klass) { Person }
|
146
154
|
|
147
155
|
before do
|
148
|
-
@
|
156
|
+
@criteria = Mongoid::Criteria.new(klass)
|
157
|
+
@criteria.where(selector).skip(20)
|
158
|
+
@context = Mongoid::Contexts::Mongo.new(@criteria)
|
149
159
|
end
|
150
160
|
|
151
161
|
it "sets the selector" do
|
152
|
-
@context.selector.should == selector
|
162
|
+
@context.selector.should == @criteria.selector
|
153
163
|
end
|
154
164
|
|
155
165
|
it "sets the options" do
|
@@ -160,6 +170,9 @@ describe Mongoid::Contexts::Mongo do
|
|
160
170
|
@context.klass.should == klass
|
161
171
|
end
|
162
172
|
|
173
|
+
it "set the selector to query across the _type of the Criteria's klass when it is hereditary" do
|
174
|
+
@context.selector[:_type].should == {'$in' => Person._types}
|
175
|
+
end
|
163
176
|
end
|
164
177
|
|
165
178
|
describe "#last" do
|
@@ -172,10 +185,10 @@ describe Mongoid::Contexts::Mongo do
|
|
172
185
|
context "when documents exist" do
|
173
186
|
|
174
187
|
before do
|
175
|
-
@
|
176
|
-
@
|
177
|
-
@context = Mongoid::Contexts::Mongo.new(@
|
178
|
-
@collection.expects(:find_one).with(
|
188
|
+
@criteria = Mongoid::Criteria.new(Person)
|
189
|
+
@criteria.order_by([[:title, :asc]])
|
190
|
+
@context = Mongoid::Contexts::Mongo.new(@criteria)
|
191
|
+
@collection.expects(:find_one).with({:_type => {'$in' => ['Doctor', 'Person']}}, { :sort => [[:title, :desc]] }).returns(
|
179
192
|
{ "title" => "Sir", "_type" => "Person" }
|
180
193
|
)
|
181
194
|
end
|
@@ -189,10 +202,10 @@ describe Mongoid::Contexts::Mongo do
|
|
189
202
|
context "when no documents exist" do
|
190
203
|
|
191
204
|
before do
|
192
|
-
@
|
193
|
-
@
|
194
|
-
@context = Mongoid::Contexts::Mongo.new(@
|
195
|
-
@collection.expects(:find_one).with(
|
205
|
+
@criteria = Mongoid::Criteria.new(Person)
|
206
|
+
@criteria.order_by([[:_id, :asc]])
|
207
|
+
@context = Mongoid::Contexts::Mongo.new(@criteria)
|
208
|
+
@collection.expects(:find_one).with({:_type => {'$in' => ['Doctor', 'Person']}}, { :sort => [[:_id, :desc]] }).returns(nil)
|
196
209
|
end
|
197
210
|
|
198
211
|
it "returns nil" do
|
@@ -204,10 +217,10 @@ describe Mongoid::Contexts::Mongo do
|
|
204
217
|
context "when no sorting options provided" do
|
205
218
|
|
206
219
|
before do
|
207
|
-
@
|
208
|
-
@
|
209
|
-
@context = Mongoid::Contexts::Mongo.new(@
|
210
|
-
@collection.expects(:find_one).with(
|
220
|
+
@criteria = Mongoid::Criteria.new(Person)
|
221
|
+
@criteria.order_by([[:_id, :asc]])
|
222
|
+
@context = Mongoid::Contexts::Mongo.new(@criteria)
|
223
|
+
@collection.expects(:find_one).with({:_type => {'$in' => ['Doctor', 'Person']}}, { :sort => [[:_id, :desc]] }).returns(
|
211
224
|
{ "title" => "Sir", "_type" => "Person" }
|
212
225
|
)
|
213
226
|
end
|
@@ -226,13 +239,14 @@ describe Mongoid::Contexts::Mongo do
|
|
226
239
|
@reduce = Mongoid::Contexts::Mongo::MAX_REDUCE.gsub("[field]", "age")
|
227
240
|
@collection = mock
|
228
241
|
Person.expects(:collection).returns(@collection)
|
229
|
-
@
|
242
|
+
@criteria = Mongoid::Criteria.new(Person)
|
243
|
+
@context = Mongoid::Contexts::Mongo.new(@criteria)
|
230
244
|
end
|
231
245
|
|
232
246
|
it "calls group on the collection with the aggregate js" do
|
233
247
|
@collection.expects(:group).with(
|
234
248
|
nil,
|
235
|
-
{},
|
249
|
+
{:_type => {'$in' => ['Doctor', 'Person']}},
|
236
250
|
{:max => "start"},
|
237
251
|
@reduce,
|
238
252
|
true
|
@@ -248,13 +262,14 @@ describe Mongoid::Contexts::Mongo do
|
|
248
262
|
@reduce = Mongoid::Contexts::Mongo::MIN_REDUCE.gsub("[field]", "age")
|
249
263
|
@collection = mock
|
250
264
|
Person.expects(:collection).returns(@collection)
|
251
|
-
@
|
265
|
+
@criteria = Mongoid::Criteria.new(Person)
|
266
|
+
@context = Mongoid::Contexts::Mongo.new(@criteria)
|
252
267
|
end
|
253
268
|
|
254
269
|
it "calls group on the collection with the aggregate js" do
|
255
270
|
@collection.expects(:group).with(
|
256
271
|
nil,
|
257
|
-
{},
|
272
|
+
{:_type => {'$in' => ['Doctor', 'Person']}},
|
258
273
|
{:min => "start"},
|
259
274
|
@reduce,
|
260
275
|
true
|
@@ -269,10 +284,10 @@ describe Mongoid::Contexts::Mongo do
|
|
269
284
|
context "when documents exist" do
|
270
285
|
|
271
286
|
before do
|
272
|
-
@collection = mock
|
273
287
|
Person.expects(:collection).returns(@collection)
|
274
|
-
@
|
275
|
-
@
|
288
|
+
@criteria = Mongoid::Criteria.new(Person)
|
289
|
+
@context = Mongoid::Contexts::Mongo.new(@criteria)
|
290
|
+
@collection.expects(:find_one).with({:_type => {'$in' => ['Doctor', 'Person']}}, {}).returns(
|
276
291
|
{ "title"=> "Sir", "_type" => "Person" }
|
277
292
|
)
|
278
293
|
end
|
@@ -288,8 +303,9 @@ describe Mongoid::Contexts::Mongo do
|
|
288
303
|
before do
|
289
304
|
@collection = mock
|
290
305
|
Person.expects(:collection).returns(@collection)
|
291
|
-
@
|
292
|
-
@
|
306
|
+
@criteria = Mongoid::Criteria.new(Person)
|
307
|
+
@context = Mongoid::Contexts::Mongo.new(@criteria)
|
308
|
+
@collection.expects(:find_one).with({:_type => {'$in' => ['Doctor', 'Person']}}, {}).returns(nil)
|
293
309
|
end
|
294
310
|
|
295
311
|
it "returns nil" do
|
@@ -306,7 +322,7 @@ describe Mongoid::Contexts::Mongo do
|
|
306
322
|
|
307
323
|
before do
|
308
324
|
@criteria = Mongoid::Criteria.new(Person).extras({ :page => 5 })
|
309
|
-
@context = Mongoid::Contexts::Mongo.new(
|
325
|
+
@context = Mongoid::Contexts::Mongo.new(@criteria)
|
310
326
|
end
|
311
327
|
|
312
328
|
it "returns the page option" do
|
@@ -319,7 +335,7 @@ describe Mongoid::Contexts::Mongo do
|
|
319
335
|
|
320
336
|
before do
|
321
337
|
@criteria = Mongoid::Criteria.new(Person)
|
322
|
-
@context = Mongoid::Contexts::Mongo.new(
|
338
|
+
@context = Mongoid::Contexts::Mongo.new(@criteria)
|
323
339
|
end
|
324
340
|
|
325
341
|
it "returns 1" do
|
@@ -336,7 +352,7 @@ describe Mongoid::Contexts::Mongo do
|
|
336
352
|
@collection = mock
|
337
353
|
Person.expects(:collection).returns(@collection)
|
338
354
|
@criteria = Person.where(:_id => "1").skip(60).limit(20)
|
339
|
-
@context = Mongoid::Contexts::Mongo.new(@criteria
|
355
|
+
@context = Mongoid::Contexts::Mongo.new(@criteria)
|
340
356
|
@collection.expects(:find).with(
|
341
357
|
{:_type => { "$in" => ["Doctor", "Person"] }, :_id => "1"}, :skip => 60, :limit => 20
|
342
358
|
).returns([])
|
@@ -357,14 +373,15 @@ describe Mongoid::Contexts::Mongo do
|
|
357
373
|
before do
|
358
374
|
@reduce = Mongoid::Contexts::Mongo::SUM_REDUCE.gsub("[field]", "age")
|
359
375
|
@collection = mock
|
360
|
-
@
|
376
|
+
@criteria = Mongoid::Criteria.new(Person)
|
377
|
+
@context = Mongoid::Contexts::Mongo.new(@criteria)
|
361
378
|
Person.expects(:collection).returns(@collection)
|
362
379
|
end
|
363
380
|
|
364
381
|
it "calls group on the collection with the aggregate js" do
|
365
382
|
@collection.expects(:group).with(
|
366
383
|
nil,
|
367
|
-
{},
|
384
|
+
{:_type => {'$in' => ['Doctor', 'Person']}},
|
368
385
|
{:sum => "start"},
|
369
386
|
@reduce,
|
370
387
|
true
|
@@ -376,4 +393,113 @@ describe Mongoid::Contexts::Mongo do
|
|
376
393
|
|
377
394
|
end
|
378
395
|
|
396
|
+
context "#id_criteria" do
|
397
|
+
|
398
|
+
let(:criteria) { Mongoid::Criteria.new(Person) }
|
399
|
+
let(:context) { criteria.context }
|
400
|
+
|
401
|
+
context "with a single argument" do
|
402
|
+
|
403
|
+
let(:id) { Mongo::ObjectID.new.to_s }
|
404
|
+
|
405
|
+
before do
|
406
|
+
criteria.expects(:id).with(id).returns(criteria)
|
407
|
+
end
|
408
|
+
|
409
|
+
context "when the document is found" do
|
410
|
+
|
411
|
+
let(:document) { stub }
|
412
|
+
|
413
|
+
it "returns a matching document" do
|
414
|
+
context.expects(:one).returns(document)
|
415
|
+
document.expects(:blank? => false)
|
416
|
+
context.id_criteria(id).should == document
|
417
|
+
end
|
418
|
+
|
419
|
+
end
|
420
|
+
|
421
|
+
context "when the document is not found" do
|
422
|
+
|
423
|
+
it "raises an error" do
|
424
|
+
context.expects(:one).returns(nil)
|
425
|
+
lambda { context.id_criteria(id) }.should raise_error
|
426
|
+
end
|
427
|
+
|
428
|
+
end
|
429
|
+
|
430
|
+
end
|
431
|
+
|
432
|
+
context "multiple arguments" do
|
433
|
+
|
434
|
+
context "when an array of ids" do
|
435
|
+
|
436
|
+
let(:ids) do
|
437
|
+
(0..2).inject([]) { |ary, i| ary << Mongo::ObjectID.new.to_s }
|
438
|
+
end
|
439
|
+
|
440
|
+
context "when documents are found" do
|
441
|
+
|
442
|
+
let(:docs) do
|
443
|
+
(0..2).inject([]) { |ary, i| ary << stub }
|
444
|
+
end
|
445
|
+
|
446
|
+
before do
|
447
|
+
criteria.expects(:id).with(ids).returns(criteria)
|
448
|
+
end
|
449
|
+
|
450
|
+
it "returns matching documents" do
|
451
|
+
context.expects(:execute).returns(docs)
|
452
|
+
context.id_criteria(ids).should == docs
|
453
|
+
end
|
454
|
+
|
455
|
+
end
|
456
|
+
|
457
|
+
context "when documents are not found" do
|
458
|
+
|
459
|
+
it "raises an error" do
|
460
|
+
context.expects(:execute).returns([])
|
461
|
+
lambda { context.id_criteria(ids) }.should raise_error
|
462
|
+
end
|
463
|
+
|
464
|
+
end
|
465
|
+
|
466
|
+
end
|
467
|
+
|
468
|
+
context "when an array of object ids" do
|
469
|
+
|
470
|
+
let(:ids) do
|
471
|
+
(0..2).inject([]) { |ary, i| ary << Mongo::ObjectID.new }
|
472
|
+
end
|
473
|
+
|
474
|
+
context "when documents are found" do
|
475
|
+
|
476
|
+
let(:docs) do
|
477
|
+
(0..2).inject([]) { |ary, i| ary << stub }
|
478
|
+
end
|
479
|
+
|
480
|
+
before do
|
481
|
+
criteria.expects(:id).with(ids).returns(criteria)
|
482
|
+
end
|
483
|
+
|
484
|
+
it "returns matching documents" do
|
485
|
+
context.expects(:execute).returns(docs)
|
486
|
+
context.id_criteria(ids).should == docs
|
487
|
+
end
|
488
|
+
|
489
|
+
end
|
490
|
+
|
491
|
+
context "when documents are not found" do
|
492
|
+
|
493
|
+
it "raises an error" do
|
494
|
+
context.expects(:execute).returns([])
|
495
|
+
lambda { context.id_criteria(ids) }.should raise_error
|
496
|
+
end
|
497
|
+
|
498
|
+
end
|
499
|
+
|
500
|
+
end
|
501
|
+
end
|
502
|
+
|
503
|
+
end
|
504
|
+
|
379
505
|
end
|