mongoid 0.4.5 → 0.4.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -14,21 +14,6 @@ describe Mongoid::Document do
14
14
  @collection = nil
15
15
  end
16
16
 
17
- describe "#aggregate" do
18
-
19
- before do
20
- @reduce = "function(obj, prev) { prev.count++; }"
21
- end
22
-
23
- it "returns documents grouped by the supplied fields" do
24
- results = [{ "title" => "Sir", "count" => 30 }]
25
- @collection.expects(:group).with([:title], nil, {:count => 0}, @reduce).returns(results)
26
- grouped = Person.aggregate([:title], {})
27
- grouped.first["count"].should == 30
28
- end
29
-
30
- end
31
-
32
17
  describe "#all" do
33
18
 
34
19
  before do
@@ -58,34 +43,6 @@ describe Mongoid::Document do
58
43
 
59
44
  end
60
45
 
61
- describe "#association=" do
62
-
63
- before do
64
- @name = Name.new
65
- @person = Person.new
66
- end
67
-
68
- it "parentizes the association" do
69
- @person.name = @name
70
- @name.parent.should == @person
71
- end
72
-
73
- end
74
-
75
- describe "#belongs_to" do
76
-
77
- it "creates a reader for the association" do
78
- address = Address.new
79
- address.should respond_to(:person)
80
- end
81
-
82
- it "creates a writer for the association" do
83
- address = Address.new
84
- address.should respond_to(:person=)
85
- end
86
-
87
- end
88
-
89
46
  describe "#collection" do
90
47
 
91
48
  before do
@@ -221,124 +178,58 @@ describe Mongoid::Document do
221
178
 
222
179
  end
223
180
 
224
- describe "#group_by" do
225
-
226
- before do
227
- @reduce = "function(obj, prev) { prev.group.push(obj); }"
228
- end
229
-
230
- it "returns documents grouped by the supplied fields" do
231
- results = [{ "title" => "Sir", "group" => [{ "title" => "Sir", "age" => 30 }] }]
232
- @collection.expects(:group).with([:title], nil, { :group => [] }, @reduce).returns(results)
233
- grouped = Person.group_by([:title], {})
234
- people = grouped.first["group"]
235
- people.first.should be_a_kind_of(Person)
236
- end
237
-
238
- end
239
-
240
- describe "#has_many" do
181
+ describe "#index" do
241
182
 
242
- it "adds a new Association to the collection" do
243
- person = Person.new
244
- person.addresses.should_not be_nil
245
- end
183
+ context "when unique options are not provided" do
246
184
 
247
- it "creates a reader for the association" do
248
- person = Person.new
249
- person.should respond_to(:addresses)
250
- end
185
+ it "delegates to collection with unique => false" do
186
+ @collection.expects(:create_index).with(:title, :unique => false)
187
+ Person.index :title
188
+ end
251
189
 
252
- it "creates a writer for the association" do
253
- person = Person.new
254
- person.should respond_to(:addresses=)
255
190
  end
256
191
 
257
- context "when setting the association directly" do
258
-
259
- before do
260
- @attributes = { :title => "Sir",
261
- :addresses => [
262
- { :street => "Street 1" },
263
- { :street => "Street 2" } ] }
264
- @person = Person.new(@attributes)
265
- end
192
+ context "when unique option is provided" do
266
193
 
267
- it "sets the attributes for the association" do
268
- address = Address.new(:street => "New Street")
269
- @person.addresses = [address]
270
- @person.addresses.first.street.should == "New Street"
194
+ it "delegates to collection with unique option" do
195
+ @collection.expects(:create_index).with(:title, :unique => true)
196
+ Person.index :title, :unique => true
271
197
  end
272
198
 
273
199
  end
274
200
 
275
201
  end
276
202
 
277
- describe "#has_one" do
203
+ describe "#key" do
278
204
 
279
- it "adds a new Association to the collection" do
280
- person = Person.new
281
- person.name.should_not be_nil
282
- end
283
-
284
- it "creates a reader for the association" do
285
- person = Person.new
286
- person.should respond_to(:name)
287
- end
288
-
289
- it "creates a writer for the association" do
290
- person = Person.new
291
- person.should respond_to(:name=)
292
- end
293
-
294
- context "when setting the association directly" do
205
+ context "when key is single field" do
295
206
 
296
207
  before do
297
- @attributes = { :title => "Sir",
298
- :name => { :first_name => "Test" } }
299
- @person = Person.new(@attributes)
208
+ Address.key :street
209
+ @address = Address.new(:street => "Testing Street Name")
210
+ @address.expects(:collection).returns(@collection)
211
+ @collection.expects(:save)
300
212
  end
301
213
 
302
- it "sets the attributes for the association" do
303
- name = Name.new(:first_name => "New Name")
304
- @person.name = name
305
- @person.name.first_name.should == "New Name"
214
+ it "adds the callback for primary key generation" do
215
+ @address.save
216
+ @address.id.should == "testing-street-name"
306
217
  end
307
218
 
308
219
  end
309
220
 
310
- end
311
-
312
- describe "#has_timestamps" do
221
+ context "when key is composite" do
313
222
 
314
- before do
315
- @tester = Tester.new
316
- end
317
-
318
- it "adds created_on and last_modified to the document" do
319
- fields = Tester.instance_variable_get(:@fields)
320
- fields[:created_at].should_not be_nil
321
- fields[:last_modified].should_not be_nil
322
- end
323
-
324
- end
325
-
326
- describe "#index" do
327
-
328
- context "when unique options are not provided" do
329
-
330
- it "delegates to collection with unique => false" do
331
- @collection.expects(:create_index).with(:title, :unique => false)
332
- Person.index :title
223
+ before do
224
+ Address.key :street, :zip
225
+ @address = Address.new(:street => "Testing Street Name", :zip => "94123")
226
+ @address.expects(:collection).returns(@collection)
227
+ @collection.expects(:save)
333
228
  end
334
229
 
335
- end
336
-
337
- context "when unique option is provided" do
338
-
339
- it "delegates to collection with unique option" do
340
- @collection.expects(:create_index).with(:title, :unique => true)
341
- Person.index :title, :unique => true
230
+ it "combines all fields" do
231
+ @address.save
232
+ @address.id.should == "testing-street-name-94123"
342
233
  end
343
234
 
344
235
  end
@@ -369,6 +260,35 @@ describe Mongoid::Document do
369
260
 
370
261
  end
371
262
 
263
+ context "with a primary key" do
264
+
265
+ context "when the value for the key exists" do
266
+
267
+ before do
268
+ Address.key :street
269
+ @address = Address.new(:street => "Test")
270
+ end
271
+
272
+ it "sets the primary key" do
273
+ @address.id.should == "test"
274
+ end
275
+
276
+ end
277
+
278
+ context "when the value for the key is nonexistant" do
279
+
280
+ before do
281
+ @address = Address.new(:street => "Test")
282
+ end
283
+
284
+ it "sets the primary key" do
285
+ @address.id.should be_nil
286
+ end
287
+
288
+ end
289
+
290
+ end
291
+
372
292
  end
373
293
 
374
294
  describe "#new_record?" do
@@ -402,32 +322,33 @@ describe Mongoid::Document do
402
322
  describe "#paginate" do
403
323
 
404
324
  before do
405
- @cursor = stub(:count => 100, :collect => [])
325
+ @criteria = stub(:page => 1, :offset => "20")
406
326
  end
407
327
 
408
328
  context "when pagination parameters are passed" do
409
329
 
330
+ before do
331
+ @params = { :conditions => { :test => "Test" }, :page => 2, :per_page => 20 }
332
+ end
333
+
410
334
  it "delegates to will paginate with the results" do
411
- @collection.expects(:find).with({ :test => "Test" }, { :sort => nil, :limit => 20, :skip => 20}).returns(@cursor)
412
- Person.paginate(:conditions => { :test => "Test" }, :page => 2, :per_page => 20)
335
+ Mongoid::Criteria.expects(:translate).with(:all, @params).returns(@criteria)
336
+ @criteria.expects(:execute).with(Person).returns([])
337
+ Person.paginate(@params)
413
338
  end
414
339
 
415
340
  end
416
341
 
417
342
  context "when pagination parameters are not passed" do
418
343
 
419
- it "delegates to will paginate with default values" do
420
- @collection.expects(:find).with({ :test => "Test" }, { :sort => nil, :limit => 20, :skip => 0}).returns(@cursor)
421
- Person.paginate(:conditions => { :test => "Test" })
344
+ before do
345
+ @params = { :conditions => { :test => "Test" }}
422
346
  end
423
347
 
424
- end
425
-
426
- context "when sorting paramters provided" do
427
-
428
- it "adds the sorting parameters in the collection#find" do
429
- @collection.expects(:find).with({ :test => "Test" }, { :sort => { :test => -1}, :limit => 20, :skip => 0}).returns(@cursor)
430
- Person.paginate(:conditions => { :test => "Test" }, :sort => { :test => -1 })
348
+ it "delegates to will paginate with default values" do
349
+ Mongoid::Criteria.expects(:translate).with(:all, @params).returns(@criteria)
350
+ @criteria.expects(:execute).with(Person).returns([])
351
+ Person.paginate(:conditions => { :test => "Test" })
431
352
  end
432
353
 
433
354
  end
@@ -515,6 +436,45 @@ describe Mongoid::Document do
515
436
 
516
437
  end
517
438
 
439
+ describe "#write_attributes" do
440
+
441
+ context "on a child document" do
442
+
443
+ context "when child is part of a has one" do
444
+
445
+ before do
446
+ @person = Person.new(:title => "Sir", :age => 30)
447
+ @name = Name.new(:first_name => "Test", :last_name => "User")
448
+ @person.name = @name
449
+ end
450
+
451
+ it "sets the child attributes on the parent" do
452
+ @name.write_attributes(:first_name => "Test2", :last_name => "User2")
453
+ @person.attributes[:name].should ==
454
+ { :first_name => "Test2", :last_name => "User2" }
455
+ end
456
+
457
+ end
458
+
459
+ context "when child is part of a has many" do
460
+
461
+ before do
462
+ @person = Person.new(:title => "Sir")
463
+ @address = Address.new(:street => "Test")
464
+ @person.addresses << @address
465
+ end
466
+
467
+ it "updates the child attributes on the parent" do
468
+ @address.write_attributes(:street => "Test2")
469
+ @person.attributes[:addresses].should == [{ :street => "Test2" }]
470
+ end
471
+
472
+ end
473
+
474
+ end
475
+
476
+ end
477
+
518
478
  context "validations" do
519
479
 
520
480
  context "when defining using macros" do
@@ -11,10 +11,12 @@ describe Mongoid::Extensions::Array::Parentization do
11
11
  end
12
12
 
13
13
  it "sets the parent on each element" do
14
+ @child.expects(:add_observer).with(@parent)
14
15
  @child.expects(:parent=).with(@parent)
15
- @array.parentize(@parent)
16
+ @child.expects(:association_name=).with(:child)
17
+ @array.parentize(@parent, :child)
16
18
  end
17
19
 
18
20
  end
19
21
 
20
- end
22
+ end
@@ -0,0 +1,87 @@
1
+ require File.join(File.dirname(__FILE__), "/../../../../spec_helper.rb")
2
+
3
+ describe Mongoid::Extensions::Hash::Accessors do
4
+
5
+ describe "#insert" do
6
+
7
+ before do
8
+ @hash = {
9
+ :_id => 1,
10
+ :title => "value",
11
+ :name => {
12
+ :_id => 2, :first_name => "Test", :last_name => "User"
13
+ },
14
+ :addresses => [
15
+ { :_id => 3, :street => "First Street" },
16
+ { :_id => 4, :street => "Second Street" }
17
+ ]
18
+ }
19
+ end
20
+
21
+ context "when writing a single attribute" do
22
+
23
+ context "when attribute exists" do
24
+
25
+ before do
26
+ @new = { :_id => 2, :first_name => "Test2", :last_name => "User2" }
27
+ end
28
+
29
+ it "updates the existing attribute" do
30
+ @hash.insert(:name, @new)
31
+ @hash[:name].should == @new
32
+ end
33
+
34
+ end
35
+
36
+ context "when attribute does not exist" do
37
+
38
+ before do
39
+ @hash.delete(:name)
40
+ @new = { :_id => 2, :first_name => "Test2", :last_name => "User2" }
41
+ end
42
+
43
+ it "updates the existing attribute" do
44
+ @hash.insert(:name, @new)
45
+ @hash[:name].should == @new
46
+ end
47
+
48
+ end
49
+
50
+ end
51
+
52
+ context "when writing to an array of attributes" do
53
+
54
+ context "when matching attribute exists" do
55
+
56
+ before do
57
+ @new = { :_id => 3, :street => "New Street" }
58
+ end
59
+
60
+ it "updates the matching attributes" do
61
+ @hash.insert(:addresses, @new)
62
+ @hash[:addresses].should include({:street => "New Street", :_id => 3})
63
+ end
64
+
65
+ end
66
+
67
+ context "when matching attribute does not exist" do
68
+
69
+ before do
70
+ @new = { :street => "New Street" }
71
+ end
72
+
73
+ it "updates the matching attributes" do
74
+ @hash.insert(:addresses, @new)
75
+ @hash[:addresses].should == [
76
+ { :_id => 3, :street => "First Street" },
77
+ { :_id => 4, :street => "Second Street" },
78
+ { :street => "New Street" }
79
+ ]
80
+ end
81
+ end
82
+
83
+ end
84
+
85
+ end
86
+
87
+ end
@@ -10,10 +10,10 @@ describe Mongoid::Extensions::Object::Parentization do
10
10
  end
11
11
 
12
12
  it "sets the parent on each element" do
13
- @child.parentize(@parent)
13
+ @child.parentize(@parent, :child)
14
14
  @child.parent.should == @parent
15
15
  end
16
16
 
17
17
  end
18
18
 
19
- end
19
+ end