mongoid 1.2.8 → 1.2.9
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/lib/mongoid.rb +2 -3
- data/lib/mongoid/associations.rb +5 -3
- data/lib/mongoid/associations/belongs_to_related.rb +6 -9
- data/lib/mongoid/associations/has_many.rb +2 -0
- data/lib/mongoid/associations/has_many_related.rb +10 -0
- data/lib/mongoid/attributes.rb +6 -1
- data/lib/mongoid/commands.rb +2 -10
- data/lib/mongoid/components.rb +11 -12
- data/lib/mongoid/contexts/enumerable.rb +21 -11
- data/lib/mongoid/contexts/mongo.rb +40 -1
- data/lib/mongoid/criteria.rb +3 -29
- data/lib/mongoid/criterion/inclusion.rb +2 -1
- data/lib/mongoid/document.rb +5 -6
- data/lib/mongoid/extensions.rb +10 -0
- data/lib/mongoid/extensions/big_decimal/conversions.rb +19 -0
- data/lib/mongoid/extensions/binary/conversions.rb +17 -0
- data/lib/mongoid/{caching.rb → extras.rb} +26 -3
- data/lib/mongoid/field.rb +20 -7
- data/lib/mongoid/finders.rb +10 -80
- data/mongoid.gemspec +15 -13
- data/spec/integration/mongoid/document_spec.rb +1 -1
- data/spec/models/person.rb +1 -0
- data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +4 -0
- data/spec/unit/mongoid/associations/has_many_related_spec.rb +42 -13
- data/spec/unit/mongoid/associations/has_many_spec.rb +12 -7
- data/spec/unit/mongoid/associations_spec.rb +16 -0
- data/spec/unit/mongoid/attributes_spec.rb +23 -0
- data/spec/unit/mongoid/commands/destroy_spec.rb +3 -0
- data/spec/unit/mongoid/commands_spec.rb +4 -11
- data/spec/unit/mongoid/contexts/enumerable_spec.rb +16 -0
- data/spec/unit/mongoid/contexts/mongo_spec.rb +96 -0
- data/spec/unit/mongoid/criteria_spec.rb +11 -4
- data/spec/unit/mongoid/document_spec.rb +11 -0
- data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +22 -0
- data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +22 -0
- data/spec/unit/mongoid/{enslavement_spec.rb → extras_spec.rb} +55 -2
- data/spec/unit/mongoid/field_spec.rb +62 -0
- data/spec/unit/mongoid/finders_spec.rb +36 -0
- metadata +69 -37
- data/HISTORY +0 -342
- data/lib/mongoid/enslavement.rb +0 -38
- data/spec/unit/mongoid/caching_spec.rb +0 -63
@@ -129,14 +129,16 @@ describe Mongoid::Associations::HasMany do
|
|
129
129
|
@document,
|
130
130
|
Mongoid::Associations::Options.new(:name => :addresses)
|
131
131
|
)
|
132
|
-
@address =
|
132
|
+
@address = mock(:parentize => true, :write_attributes => true)
|
133
|
+
Address.expects(:instantiate).returns(@address)
|
134
|
+
@address.expects(:run_callbacks).with(:before_create)
|
135
|
+
@address.expects(:run_callbacks).with(:after_create)
|
133
136
|
end
|
134
137
|
|
135
138
|
it "builds and saves a new object" do
|
136
|
-
|
139
|
+
@address.expects(:save).returns(true)
|
137
140
|
address = @association.create({ :street => "Yet Another" })
|
138
|
-
address.should
|
139
|
-
address.street.should == "Yet Another"
|
141
|
+
address.should == @address
|
140
142
|
end
|
141
143
|
|
142
144
|
end
|
@@ -148,13 +150,16 @@ describe Mongoid::Associations::HasMany do
|
|
148
150
|
@document,
|
149
151
|
Mongoid::Associations::Options.new(:name => :shapes)
|
150
152
|
)
|
153
|
+
@circle = mock(:parentize => true, :write_attributes => true)
|
154
|
+
Circle.expects(:instantiate).returns(@circle)
|
155
|
+
@circle.expects(:run_callbacks).with(:before_create)
|
156
|
+
@circle.expects(:run_callbacks).with(:after_create)
|
151
157
|
end
|
152
158
|
|
153
159
|
it "instantiates a class of that type" do
|
154
|
-
|
160
|
+
@circle.expects(:save).returns(true)
|
155
161
|
circle = @association.create({ :radius => 100 }, Circle)
|
156
|
-
circle.should
|
157
|
-
circle.radius.should == 100
|
162
|
+
circle.should == @circle
|
158
163
|
end
|
159
164
|
|
160
165
|
end
|
@@ -453,6 +453,22 @@ describe Mongoid::Associations do
|
|
453
453
|
|
454
454
|
end
|
455
455
|
|
456
|
+
context "when using object ids" do
|
457
|
+
|
458
|
+
before do
|
459
|
+
Mongoid.use_object_ids = true
|
460
|
+
end
|
461
|
+
|
462
|
+
after do
|
463
|
+
Mongoid.use_object_ids = false
|
464
|
+
end
|
465
|
+
|
466
|
+
it "sets the foreign key as an object id" do
|
467
|
+
Game.expects(:field).with("person_id", :type => Mongo::ObjectID)
|
468
|
+
Game.belongs_to_related :person
|
469
|
+
end
|
470
|
+
end
|
471
|
+
|
456
472
|
end
|
457
473
|
|
458
474
|
describe ".has_one_related" do
|
@@ -142,6 +142,17 @@ describe Mongoid::Attributes do
|
|
142
142
|
|
143
143
|
describe "#process" do
|
144
144
|
|
145
|
+
context "when passing non accessible fields" do
|
146
|
+
|
147
|
+
before do
|
148
|
+
@person = Person.new(:owner_id => 6)
|
149
|
+
end
|
150
|
+
|
151
|
+
it "does not set the value" do
|
152
|
+
@person.owner_id.should be_nil
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
145
156
|
context "when attributes dont have fields defined" do
|
146
157
|
|
147
158
|
before do
|
@@ -336,6 +347,18 @@ describe Mongoid::Attributes do
|
|
336
347
|
|
337
348
|
end
|
338
349
|
|
350
|
+
context "when attribute is not accessible" do
|
351
|
+
|
352
|
+
before do
|
353
|
+
@person = Person.new
|
354
|
+
@person.owner_id = 5
|
355
|
+
end
|
356
|
+
|
357
|
+
it "returns the value" do
|
358
|
+
@person.read_attribute(:owner_id).should == 5
|
359
|
+
end
|
360
|
+
end
|
361
|
+
|
339
362
|
end
|
340
363
|
|
341
364
|
describe "#remove_attribute" do
|
@@ -29,10 +29,13 @@ describe Mongoid::Commands::Destroy do
|
|
29
29
|
@parent = Person.new
|
30
30
|
@address = Address.new(:street => "Genoa Pl")
|
31
31
|
@parent.addresses << @address
|
32
|
+
@collection = mock
|
33
|
+
Person.expects(:collection).returns(@collection)
|
32
34
|
end
|
33
35
|
|
34
36
|
it "removes the document from the parent attributes" do
|
35
37
|
@parent.addresses.should == [@address]
|
38
|
+
@collection.expects(:save).returns(true)
|
36
39
|
Mongoid::Commands::Destroy.execute(@address)
|
37
40
|
@parent.addresses.should be_empty
|
38
41
|
end
|
@@ -86,10 +86,9 @@ describe Mongoid::Commands do
|
|
86
86
|
@person = Person.new
|
87
87
|
end
|
88
88
|
|
89
|
-
it "
|
89
|
+
it "lets the error bubble up" do
|
90
90
|
Mongoid::Commands::Save.expects(:execute).raises(Mongo::OperationFailure.new("Operation Failed"))
|
91
|
-
@person.save
|
92
|
-
@person.errors.on(:mongoid).should == "Operation Failed"
|
91
|
+
lambda { @person.save }.should raise_error
|
93
92
|
end
|
94
93
|
|
95
94
|
end
|
@@ -204,14 +203,8 @@ describe Mongoid::Commands do
|
|
204
203
|
Mongoid::Commands::Save.expects(:execute).raises(Mongo::OperationFailure.new("Operation Failed"))
|
205
204
|
end
|
206
205
|
|
207
|
-
it "
|
208
|
-
|
209
|
-
person.errors.on(:mongoid).should == "Operation Failed"
|
210
|
-
end
|
211
|
-
|
212
|
-
it "keeps the document's new record flag" do
|
213
|
-
person = Person.create
|
214
|
-
person.should be_a_new_record
|
206
|
+
it "lets the error bubble up" do
|
207
|
+
lambda { Person.create }.should raise_error
|
215
208
|
end
|
216
209
|
|
217
210
|
end
|
@@ -145,6 +145,22 @@ describe Mongoid::Contexts::Enumerable do
|
|
145
145
|
|
146
146
|
end
|
147
147
|
|
148
|
+
describe "#iterate" do
|
149
|
+
before do
|
150
|
+
@criteria.where(:street => "Bourke Street")
|
151
|
+
@criteria.documents = @docs
|
152
|
+
@context = Mongoid::Contexts::Enumerable.new(@criteria)
|
153
|
+
end
|
154
|
+
|
155
|
+
it "executes the criteria" do
|
156
|
+
acc = []
|
157
|
+
@context.iterate do |doc|
|
158
|
+
acc << doc
|
159
|
+
end
|
160
|
+
acc.should == [@melbourne]
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
148
164
|
describe "#last" do
|
149
165
|
|
150
166
|
it "returns the last matching in the enumerable" do
|
@@ -27,6 +27,43 @@ describe Mongoid::Contexts::Mongo do
|
|
27
27
|
|
28
28
|
end
|
29
29
|
|
30
|
+
describe "blank?" do
|
31
|
+
|
32
|
+
before do
|
33
|
+
@criteria = Mongoid::Criteria.new(Game)
|
34
|
+
@criteria.where(:test => 'Testing')
|
35
|
+
@context = Mongoid::Contexts::Mongo.new(@criteria)
|
36
|
+
end
|
37
|
+
|
38
|
+
context "when a document exists" do
|
39
|
+
|
40
|
+
before do
|
41
|
+
@doc = mock
|
42
|
+
@collection = mock
|
43
|
+
Game.expects(:collection).returns(@collection)
|
44
|
+
@collection.expects(:find_one).with({ :test => "Testing" }, { :fields => [ :_id ] }).returns(@doc)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "returns false" do
|
48
|
+
@context.blank?.should be_false
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context "when a document does not exist" do
|
53
|
+
|
54
|
+
before do
|
55
|
+
@doc = mock
|
56
|
+
@collection = mock
|
57
|
+
Game.expects(:collection).returns(@collection)
|
58
|
+
@collection.expects(:find_one).with({ :test => "Testing" }, { :fields => [ :_id ] }).returns(nil)
|
59
|
+
end
|
60
|
+
|
61
|
+
it "returns true" do
|
62
|
+
@context.blank?.should be_true
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
30
67
|
describe "#count" do
|
31
68
|
|
32
69
|
before do
|
@@ -214,6 +251,65 @@ describe Mongoid::Contexts::Mongo do
|
|
214
251
|
end
|
215
252
|
end
|
216
253
|
|
254
|
+
describe "#iterate" do
|
255
|
+
before do
|
256
|
+
@criteria = Mongoid::Criteria.new(Person)
|
257
|
+
@context = Mongoid::Contexts::Mongo.new(@criteria)
|
258
|
+
@person = Person.new(:title => "Sir")
|
259
|
+
@cursor = stub('cursor')
|
260
|
+
@cursor.stubs(:each).yields(@person)
|
261
|
+
end
|
262
|
+
|
263
|
+
context "when not caching" do
|
264
|
+
|
265
|
+
it "executes the criteria" do
|
266
|
+
@context.expects(:execute).returns(@cursor)
|
267
|
+
@context.iterate do |person|
|
268
|
+
person.should == @person
|
269
|
+
end
|
270
|
+
|
271
|
+
end
|
272
|
+
|
273
|
+
end
|
274
|
+
|
275
|
+
context "when caching" do
|
276
|
+
before do
|
277
|
+
@criteria.cache
|
278
|
+
end
|
279
|
+
|
280
|
+
it "executes the criteria" do
|
281
|
+
@context.expects(:execute).returns(@cursor)
|
282
|
+
@context.iterate do |person|
|
283
|
+
person.should == @person
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
it "executes only once and it caches the result" do
|
288
|
+
@context.expects(:execute).once.returns(@cursor)
|
289
|
+
@context.iterate do |person|
|
290
|
+
person.should == @person
|
291
|
+
end
|
292
|
+
@context.iterate do |person|
|
293
|
+
person.should == @person
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
it "executes even if there is no block" do
|
298
|
+
@context.expects(:execute).once.returns(@cursor)
|
299
|
+
@context.iterate
|
300
|
+
end
|
301
|
+
|
302
|
+
it "caches even if there is no block" do
|
303
|
+
@context.expects(:execute).once.returns(@cursor)
|
304
|
+
@context.iterate
|
305
|
+
@context.iterate do |person|
|
306
|
+
person.should == @person
|
307
|
+
end
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
end
|
312
|
+
|
217
313
|
describe "#last" do
|
218
314
|
|
219
315
|
before do
|
@@ -127,10 +127,10 @@ describe Mongoid::Criteria do
|
|
127
127
|
@criteria.instance_variable_set(:@context, @context)
|
128
128
|
end
|
129
129
|
|
130
|
-
context "when the
|
130
|
+
context "when the context is blank" do
|
131
131
|
|
132
132
|
before do
|
133
|
-
@context.expects(:
|
133
|
+
@context.expects(:blank?).returns(true)
|
134
134
|
end
|
135
135
|
|
136
136
|
it "returns true" do
|
@@ -138,10 +138,10 @@ describe Mongoid::Criteria do
|
|
138
138
|
end
|
139
139
|
end
|
140
140
|
|
141
|
-
context "when the
|
141
|
+
context "when the context is not blank" do
|
142
142
|
|
143
143
|
before do
|
144
|
-
@context.expects(:
|
144
|
+
@context.expects(:blank?).returns(false)
|
145
145
|
end
|
146
146
|
|
147
147
|
it "returns false" do
|
@@ -274,6 +274,13 @@ describe Mongoid::Criteria do
|
|
274
274
|
@cursor = stub(:count => 10)
|
275
275
|
end
|
276
276
|
|
277
|
+
it "delegates to the context#iterate" do
|
278
|
+
@context = stub('context')
|
279
|
+
@criteria.stubs(:context).returns(@context)
|
280
|
+
@context.expects(:iterate)
|
281
|
+
@criteria.each
|
282
|
+
end
|
283
|
+
|
277
284
|
context "when the criteria has not been executed" do
|
278
285
|
|
279
286
|
before do
|
@@ -499,6 +499,17 @@ describe Mongoid::Document do
|
|
499
499
|
|
500
500
|
end
|
501
501
|
|
502
|
+
describe "#persisted?" do
|
503
|
+
|
504
|
+
before do
|
505
|
+
@person = Person.new
|
506
|
+
end
|
507
|
+
|
508
|
+
it "delegates to new_record?" do
|
509
|
+
@person.persisted?.should be_false
|
510
|
+
end
|
511
|
+
end
|
512
|
+
|
502
513
|
describe "#_parent" do
|
503
514
|
|
504
515
|
before do
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Mongoid::Extensions::BigDecimal::Conversions do
|
4
|
+
|
5
|
+
let(:number) do
|
6
|
+
BigDecimal.new("123456.789")
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "#get" do
|
10
|
+
|
11
|
+
it "converts the string to a big decimal" do
|
12
|
+
BigDecimal.get("123456.789").should == number
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#set" do
|
17
|
+
|
18
|
+
it "converts the big decimal to a string" do
|
19
|
+
BigDecimal.set(number).should == "123456.789"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Mongoid::Extensions::Binary::Conversions do
|
4
|
+
|
5
|
+
let(:bin) do
|
6
|
+
Binary.new
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "#get" do
|
10
|
+
|
11
|
+
it "returns self" do
|
12
|
+
Binary.get(bin).should == bin
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#set" do
|
17
|
+
|
18
|
+
it "returns self" do
|
19
|
+
Binary.set(bin).should == bin
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -1,10 +1,63 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
-
describe Mongoid::
|
3
|
+
describe Mongoid::Extras do
|
4
4
|
|
5
5
|
before do
|
6
6
|
@klass = Class.new do
|
7
|
-
include Mongoid::
|
7
|
+
include Mongoid::Extras
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe ".cache" do
|
12
|
+
|
13
|
+
before do
|
14
|
+
@klass.cache
|
15
|
+
end
|
16
|
+
|
17
|
+
it "sets the cached boolean on the class" do
|
18
|
+
@klass.cached.should be_true
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
describe ".cached" do
|
24
|
+
|
25
|
+
it "defaults to false" do
|
26
|
+
@klass.cached.should be_false
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe ".cached?" do
|
31
|
+
|
32
|
+
context "when the class is cached" do
|
33
|
+
|
34
|
+
before do
|
35
|
+
@klass.cache
|
36
|
+
end
|
37
|
+
|
38
|
+
it "returns true" do
|
39
|
+
@klass.should be_cached
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context "when the class is not cached" do
|
44
|
+
|
45
|
+
it "returns false" do
|
46
|
+
@klass.should_not be_cached
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "#cached?" do
|
53
|
+
|
54
|
+
before do
|
55
|
+
@klass.cache
|
56
|
+
@doc = @klass.new
|
57
|
+
end
|
58
|
+
|
59
|
+
it "returns the class cached? value" do
|
60
|
+
@doc.should be_cached
|
8
61
|
end
|
9
62
|
end
|
10
63
|
|