jnunemaker-mongomapper 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. data/History +11 -0
  2. data/VERSION +1 -1
  3. data/lib/mongomapper/associations/base.rb +5 -2
  4. data/lib/mongomapper/associations/belongs_to_polymorphic_proxy.rb +1 -2
  5. data/lib/mongomapper/associations/belongs_to_proxy.rb +3 -3
  6. data/lib/mongomapper/associations/many_documents_proxy.rb +85 -0
  7. data/lib/mongomapper/associations/many_embedded_polymorphic_proxy.rb +2 -3
  8. data/lib/mongomapper/associations/many_embedded_proxy.rb +2 -4
  9. data/lib/mongomapper/associations/many_polymorphic_proxy.rb +11 -0
  10. data/lib/mongomapper/associations/many_proxy.rb +1 -50
  11. data/lib/mongomapper/associations/proxy.rb +1 -1
  12. data/lib/mongomapper/document.rb +5 -12
  13. data/lib/mongomapper/embedded_document.rb +21 -2
  14. data/lib/mongomapper/key.rb +2 -1
  15. data/lib/mongomapper/serializers/json_serializer.rb +15 -0
  16. data/lib/mongomapper.rb +17 -10
  17. data/mongomapper.gemspec +17 -4
  18. data/test/functional/associations/test_belongs_to_polymorphic_proxy.rb +39 -0
  19. data/test/functional/associations/test_belongs_to_proxy.rb +35 -0
  20. data/test/functional/associations/test_many_embedded_polymorphic_proxy.rb +131 -0
  21. data/test/functional/associations/test_many_embedded_proxy.rb +106 -0
  22. data/test/functional/associations/test_many_polymorphic_proxy.rb +259 -0
  23. data/test/functional/associations/test_many_proxy.rb +236 -0
  24. data/test/functional/test_associations.rb +22 -467
  25. data/test/functional/test_document.rb +76 -19
  26. data/test/functional/test_pagination.rb +2 -3
  27. data/test/models.rb +16 -0
  28. data/test/test_helper.rb +1 -1
  29. data/test/unit/serializers/test_json_serializer.rb +69 -16
  30. data/test/unit/test_association_base.rb +5 -0
  31. data/test/unit/test_document.rb +14 -4
  32. data/test/unit/test_embedded_document.rb +46 -21
  33. data/test/unit/test_key.rb +5 -0
  34. data/test/unit/test_mongo_id.rb +2 -2
  35. data/test/unit/test_rails_compatibility.rb +3 -3
  36. metadata +16 -3
  37. data/lib/mongomapper/associations/array_proxy.rb +0 -6
@@ -6,480 +6,35 @@ class AssociationsTest < Test::Unit::TestCase
6
6
  clear_all_collections
7
7
  end
8
8
 
9
- context "Modularized Polymorphic Many Embedded" do
10
- should "set associations correctly" do
11
- fleet_attributes = {
12
- "name" => "My Fleet",
13
- "transports" => [
14
- {"_type" => "TrModels::Ambulance", "license_plate" => "GGG123", "icu" => true},
15
- {"_type" => "TrModels::Car", "license_plate" => "ABC123", "model" => "VW Golf", "year" => 2001},
16
- {"_type" => "TrModels::Car", "license_plate" => "DEF123", "model" => "Honda Accord", "year" => 2008},
17
- ]
18
- }
19
-
20
- fleet = TrModels::Fleet.new(fleet_attributes)
21
- fleet.transports.size.should == 3
22
- fleet.transports[0].class.should == TrModels::Ambulance
23
- fleet.transports[0].license_plate.should == "GGG123"
24
- fleet.transports[0].icu.should be_true
25
- fleet.transports[1].class.should == TrModels::Car
26
- fleet.transports[1].license_plate.should == "ABC123"
27
- fleet.transports[1].model.should == "VW Golf"
28
- fleet.transports[1].year.should == 2001
29
- fleet.transports[2].class.should == TrModels::Car
30
- fleet.transports[2].license_plate.should == "DEF123"
31
- fleet.transports[2].model.should == "Honda Accord"
32
- fleet.transports[2].year.should == 2008
33
- fleet.save.should be_true
34
-
35
- from_db = TrModels::Fleet.find(fleet.id)
36
- from_db.transports.size.should == 3
37
- from_db.transports[0].license_plate.should == "GGG123"
38
- from_db.transports[0].icu.should be_true
39
- from_db.transports[1].license_plate.should == "ABC123"
40
- from_db.transports[1].model.should == "VW Golf"
41
- from_db.transports[1].year.should == 2001
42
- from_db.transports[2].license_plate.should == "DEF123"
43
- from_db.transports[2].model.should == "Honda Accord"
44
- from_db.transports[2].year.should == 2008
9
+ should "allow changing class names" do
10
+ class AwesomeUser
11
+ include MongoMapper::Document
12
+ many :posts, :class_name => 'AssociationsTest::AwesomePost', :foreign_key => :creator_id
45
13
  end
46
14
 
47
- should "default reader to empty array" do
48
- fleet = TrModels::Fleet.new
49
- fleet.transports.should == []
15
+ class AwesomeTag
16
+ include MongoMapper::EmbeddedDocument
17
+ key :name, String
18
+ belongs_to :post, :class_name => 'AssociationsTest::AwesomeUser'
50
19
  end
51
20
 
52
- should "allow adding to association like it was an array" do
53
- fleet = TrModels::Fleet.new
54
- fleet.transports << TrModels::Car.new
55
- fleet.transports.push TrModels::Bus.new
56
- fleet.transports.size.should == 2
21
+ class AwesomePost
22
+ include MongoMapper::Document
23
+ belongs_to :creator, :class_name => 'AssociationsTest::AwesomeUser'
24
+ many :tags, :class_name => 'AssociationsTest::AwesomeTag', :foreign_key => :post_id
57
25
  end
58
26
 
59
- should "store the association" do
60
- fleet = TrModels::Fleet.new
61
- fleet.transports = [TrModels::Car.new("license_plate" => "DCU2013", "model" => "Honda Civic")]
62
- fleet.save.should be_true
27
+ AwesomeUser.collection.clear
28
+ AwesomePost.collection.clear
63
29
 
64
- from_db = TrModels::Fleet.find(fleet.id)
65
- from_db.transports.size.should == 1
66
- from_db.transports[0].license_plate.should == "DCU2013"
67
- end
68
-
69
- should "store different associations" do
70
- fleet = TrModels::Fleet.new
71
- fleet.transports = [
72
- TrModels::Car.new("license_plate" => "ABC1223", "model" => "Honda Civic", "year" => 2003),
73
- TrModels::Bus.new("license_plate" => "XYZ9090", "max_passengers" => 51),
74
- TrModels::Ambulance.new("license_plate" => "HDD3030", "icu" => true)
75
- ]
76
- fleet.save.should be_true
77
-
78
- from_db = TrModels::Fleet.find(fleet.id)
79
- from_db.transports.size.should == 3
80
- from_db.transports[0].license_plate.should == "ABC1223"
81
- from_db.transports[0].model.should == "Honda Civic"
82
- from_db.transports[0].year.should == 2003
83
- from_db.transports[1].license_plate.should == "XYZ9090"
84
- from_db.transports[1].max_passengers.should == 51
85
- from_db.transports[2].license_plate.should == "HDD3030"
86
- from_db.transports[2].icu.should == true
87
- end
88
- end
89
-
90
- context "Polymorphic Many Embedded" do
91
- should "default reader to empty array" do
92
- catalog = Catalog.new
93
- catalog.medias.should == []
94
- end
95
-
96
- should "allow adding to association like it was an array" do
97
- catalog = Catalog.new
98
- catalog.medias << Video.new
99
- catalog.medias.push Video.new
100
- catalog.medias.size.should == 2
101
- end
102
-
103
- should "store the association" do
104
- catalog = Catalog.new
105
- catalog.medias = [Video.new("file" => "video.mpg", "length" => 3600)]
106
- catalog.save.should be_true
107
-
108
- from_db = Catalog.find(catalog.id)
109
- from_db.medias.size.should == 1
110
- from_db.medias[0].file.should == "video.mpg"
111
- end
112
-
113
- should "store different associations" do
114
- catalog = Catalog.new
115
- catalog.medias = [
116
- Video.new("file" => "video.mpg", "length" => 3600),
117
- Music.new("file" => "music.mp3", "bitrate" => "128kbps"),
118
- Image.new("file" => "image.png", "width" => 800, "height" => 600)
119
- ]
120
- catalog.save.should be_true
121
-
122
- from_db = Catalog.find(catalog.id)
123
- from_db.medias.size.should == 3
124
- from_db.medias[0].file.should == "video.mpg"
125
- from_db.medias[0].length.should == 3600
126
- from_db.medias[1].file.should == "music.mp3"
127
- from_db.medias[1].bitrate.should == "128kbps"
128
- from_db.medias[2].file.should == "image.png"
129
- from_db.medias[2].width.should == 800
130
- from_db.medias[2].height.should == 600
131
- end
132
- end
133
-
134
- context "Polymorphic Belongs To" do
135
- should "default to nil" do
136
- status = Status.new
137
- status.target.should be_nil
138
- end
139
-
140
- should "store the association" do
141
- status = Status.new
142
- project = Project.new(:name => "mongomapper")
143
- status.target = project
144
- status.save.should be_true
145
-
146
- from_db = Status.find(status.id)
147
- from_db.target.should_not be_nil
148
- from_db.target_id.should == project.id
149
- from_db.target_type.should == "Project"
150
- from_db.target.name.should == "mongomapper"
151
- end
152
-
153
- should "unset the association" do
154
- status = Status.new
155
- project = Project.new(:name => "mongomapper")
156
- status.target = project
157
- status.save.should be_true
158
-
159
- from_db = Status.find(status.id)
160
- from_db.target = nil
161
- from_db.target_type.should be_nil
162
- from_db.target_id.should be_nil
163
- from_db.target.should be_nil
164
- end
165
- end
166
-
167
- context "Belongs To" do
168
- should "default to nil" do
169
- status = Status.new
170
- status.project.should be_nil
171
- end
172
-
173
- should "store the association" do
174
- status = Status.new
175
- project = Project.new(:name => "mongomapper")
176
- status.project = project
177
- status.save.should be_true
178
-
179
- from_db = Status.find(status.id)
180
- from_db.project.should_not be_nil
181
- from_db.project.name.should == "mongomapper"
182
- end
30
+ user = AwesomeUser.create
31
+ tag1 = AwesomeTag.new(:name => 'awesome')
32
+ tag2 = AwesomeTag.new(:name => 'grand')
33
+ post1 = AwesomePost.create(:creator => user, :tags => [tag1])
34
+ post2 = AwesomePost.create(:creator => user, :tags => [tag2])
35
+ user.posts.should == [post1, post2]
183
36
 
184
- should "unset the association" do
185
- status = Status.new
186
- project = Project.new(:name => "mongomapper")
187
- status.project = project
188
- status.save.should be_true
189
-
190
- from_db = Status.find(status.id)
191
- from_db.project = nil
192
- from_db.project.should be_nil
193
- end
194
- end
195
-
196
- context "Many documents" do
197
- should "default reader to empty array" do
198
- project = Project.new
199
- project.statuses.should == []
200
- end
201
-
202
- should "allow adding to association like it was an array" do
203
- project = Project.new
204
- project.statuses << Status.new
205
- project.statuses.push Status.new
206
- project.statuses.size.should == 2
207
- end
208
-
209
- should "store the association" do
210
- project = Project.new
211
- project.statuses = [Status.new("name" => "ready")]
212
- project.save.should be_true
213
-
214
- from_db = Project.find(project.id)
215
- from_db.statuses.size.should == 1
216
- from_db.statuses[0].name.should == "ready"
217
- end
218
-
219
- context "Finding scoped to association" do
220
- setup do
221
- @project1 = Project.new(:name => 'Project 1')
222
- @brand_new = Status.create(:name => 'New')
223
- @complete = Status.create(:name => 'Complete')
224
- @project1.statuses = [@brand_new, @complete]
225
- @project1.save
226
-
227
- @project2 = Project.create(:name => 'Project 2')
228
- @in_progress = Status.create(:name => 'In Progress')
229
- @archived = Status.create(:name => 'Archived')
230
- @another_complete = Status.create(:name => 'Complete')
231
- @project2.statuses = [@in_progress, @archived, @another_complete]
232
- @project2.save
233
- end
234
-
235
- context "with :all" do
236
- should "work" do
237
- @project1.statuses.find(:all).should == [@brand_new, @complete]
238
- end
239
-
240
- should "work with conditions" do
241
- statuses = @project1.statuses.find(:all, :conditions => {'name' => 'Complete'})
242
- statuses.should == [@complete]
243
- end
244
-
245
- should "work with order" do
246
- statuses = @project1.statuses.find(:all, :order => 'name asc')
247
- statuses.should == [@complete, @brand_new]
248
- end
249
- end
250
-
251
- context "with #all" do
252
- should "work" do
253
- @project1.statuses.all.should == [@brand_new, @complete]
254
- end
255
-
256
- should "work with conditions" do
257
- statuses = @project1.statuses.all(:conditions => {'name' => 'Complete'})
258
- statuses.should == [@complete]
259
- end
260
-
261
- should "work with order" do
262
- statuses = @project1.statuses.all(:order => 'name asc')
263
- statuses.should == [@complete, @brand_new]
264
- end
265
- end
266
-
267
- context "with :first" do
268
- should "work" do
269
- @project1.statuses.find(:first).should == @brand_new
270
- end
271
-
272
- should "work with conditions" do
273
- status = @project1.statuses.find(:first, :conditions => {:name => 'Complete'})
274
- status.should == @complete
275
- end
276
- end
277
-
278
- context "with #first" do
279
- should "work" do
280
- @project1.statuses.first.should == @brand_new
281
- end
282
-
283
- should "work with conditions" do
284
- status = @project1.statuses.first(:conditions => {:name => 'Complete'})
285
- status.should == @complete
286
- end
287
- end
288
-
289
- context "with :last" do
290
- should "work" do
291
- @project1.statuses.find(:last).should == @complete
292
- end
293
-
294
- should "work with conditions" do
295
- status = @project1.statuses.find(:last, :conditions => {:name => 'New'})
296
- status.should == @brand_new
297
- end
298
- end
299
-
300
- context "with #last" do
301
- should "work" do
302
- @project1.statuses.last.should == @complete
303
- end
304
-
305
- should "work with conditions" do
306
- status = @project1.statuses.last(:conditions => {:name => 'New'})
307
- status.should == @brand_new
308
- end
309
- end
310
-
311
- context "with one id" do
312
- should "work for id in association" do
313
- @project1.statuses.find(@complete.id).should == @complete
314
- end
315
-
316
- should "not work for id not in association" do
317
- lambda {
318
- @project1.statuses.find(@archived.id)
319
- }.should raise_error(MongoMapper::DocumentNotFound)
320
- end
321
- end
322
-
323
- context "with multiple ids" do
324
- should "work for ids in association" do
325
- statuses = @project1.statuses.find(@brand_new.id, @complete.id)
326
- statuses.should == [@brand_new, @complete]
327
- end
328
-
329
- should "not work for ids not in association" do
330
- lambda {
331
- @project1.statuses.find(@brand_new.id, @complete.id, @archived.id)
332
- }.should raise_error(MongoMapper::DocumentNotFound)
333
- end
334
- end
335
-
336
- context "with #paginate" do
337
- setup do
338
- @statuses = @project2.statuses.paginate(:per_page => 2, :page => 1)
339
- end
340
-
341
- should "return total pages" do
342
- @statuses.total_pages.should == 2
343
- end
344
-
345
- should "return total entries" do
346
- @statuses.total_entries.should == 3
347
- end
348
-
349
- should "return the subject" do
350
- @statuses.should == [@in_progress, @archived]
351
- end
352
- end
353
- end
354
- end
355
-
356
- context "Many embedded documents" do
357
- should "allow adding to association like it was an array" do
358
- project = Project.new
359
- project.addresses << Address.new
360
- project.addresses.push Address.new
361
- project.addresses.size.should == 2
362
- end
363
-
364
- should "be embedded in document on save" do
365
- sb = Address.new(:city => 'South Bend', :state => 'IN')
366
- chi = Address.new(:city => 'Chicago', :state => 'IL')
367
- project = Project.new
368
- project.addresses << sb
369
- project.addresses << chi
370
- project.save
371
-
372
- from_db = Project.find(project.id)
373
- from_db.addresses.size.should == 2
374
- from_db.addresses[0].should == sb
375
- from_db.addresses[1].should == chi
376
- end
377
-
378
- should "allow embedding arbitrarily deep" do
379
- @document = Class.new do
380
- include MongoMapper::Document
381
- key :person, Person
382
- end
383
- @document.collection.clear
384
-
385
- meg = Person.new(:name => "Meg")
386
- meg.child = Person.new(:name => "Steve")
387
- meg.child.child = Person.new(:name => "Linda")
388
-
389
- doc = @document.new(:person => meg)
390
- doc.save
391
-
392
- from_db = @document.find(doc.id)
393
- from_db.person.name.should == 'Meg'
394
- from_db.person.child.name.should == 'Steve'
395
- from_db.person.child.child.name.should == 'Linda'
396
- end
397
-
398
- should "allow assignment of 'many' embedded documents using a hash" do
399
- person_attributes = {
400
- "name" => "Mr. Pet Lover",
401
- "pets" => [
402
- {"name" => "Jimmy", "species" => "Cocker Spainel"},
403
- {"name" => "Sasha", "species" => "Siberian Husky"},
404
- ]
405
- }
406
-
407
- pet_lover = RealPerson.new(person_attributes)
408
- pet_lover.name.should == "Mr. Pet Lover"
409
- pet_lover.pets[0].name.should == "Jimmy"
410
- pet_lover.pets[0].species.should == "Cocker Spainel"
411
- pet_lover.pets[1].name.should == "Sasha"
412
- pet_lover.pets[1].species.should == "Siberian Husky"
413
- pet_lover.save.should be_true
414
-
415
- from_db = RealPerson.find(pet_lover.id)
416
- from_db.name.should == "Mr. Pet Lover"
417
- from_db.pets[0].name.should == "Jimmy"
418
- from_db.pets[0].species.should == "Cocker Spainel"
419
- from_db.pets[1].name.should == "Sasha"
420
- from_db.pets[1].species.should == "Siberian Husky"
421
- end
422
-
423
- should "allow saving embedded documents in 'many' embedded documents" do
424
- @document = Class.new do
425
- include MongoMapper::Document
426
- many :people
427
- end
428
- @document.collection.clear
429
-
430
- meg = Person.new(:name => "Meg")
431
- sparky = Pet.new(:name => "Sparky", :species => "Dog")
432
- koda = Pet.new(:name => "Koda", :species => "Dog")
433
-
434
- doc = @document.new
435
-
436
- meg.pets << sparky
437
- meg.pets << koda
438
-
439
- doc.people << meg
440
- doc.save
441
-
442
- from_db = @document.find(doc.id)
443
- from_db.people.first.name.should == "Meg"
444
- from_db.people.first.pets.should_not == []
445
- from_db.people.first.pets.first.name.should == "Sparky"
446
- from_db.people.first.pets.first.species.should == "Dog"
447
- from_db.people.first.pets[1].name.should == "Koda"
448
- from_db.people.first.pets[1].species.should == "Dog"
449
- end
450
- end
451
-
452
- context "Changing association class names" do
453
- should "work for many and belongs to" do
454
- class AwesomeUser
455
- include MongoMapper::Document
456
- many :posts, :class_name => 'AssociationsTest::AwesomePost', :foreign_key => :creator_id
457
- end
458
-
459
- class AwesomeTag
460
- include MongoMapper::EmbeddedDocument
461
- key :name, String
462
- belongs_to :post, :class_name => 'AssociationsTest::AwesomeUser'
463
- end
464
-
465
- class AwesomePost
466
- include MongoMapper::Document
467
- belongs_to :creator, :class_name => 'AssociationsTest::AwesomeUser'
468
- many :tags, :class_name => 'AssociationsTest::AwesomeTag', :foreign_key => :post_id
469
- end
470
-
471
- AwesomeUser.collection.clear
472
- AwesomePost.collection.clear
473
-
474
- user = AwesomeUser.create
475
- tag1 = AwesomeTag.new(:name => 'awesome')
476
- tag2 = AwesomeTag.new(:name => 'grand')
477
- post1 = AwesomePost.create(:creator => user, :tags => [tag1])
478
- post2 = AwesomePost.create(:creator => user, :tags => [tag2])
479
- user.posts.should == [post1, post2]
480
-
481
- post1_from_db = AwesomePost.find(post1.id)
482
- post1_from_db.tags.should == [tag1]
483
- end
37
+ post1_from_db = AwesomePost.find(post1.id)
38
+ post1_from_db.tags.should == [tag1]
484
39
  end
485
40
  end
@@ -1,10 +1,5 @@
1
1
  require 'test_helper'
2
-
3
- class Address
4
- include MongoMapper::EmbeddedDocument
5
- key :city, String
6
- key :state, String
7
- end
2
+ require 'models'
8
3
 
9
4
  class DocumentTest < Test::Unit::TestCase
10
5
  def setup
@@ -25,11 +20,43 @@ class DocumentTest < Test::Unit::TestCase
25
20
  setup do
26
21
  @document.key :tags, Array
27
22
  end
28
-
29
- should "work" do
23
+
24
+ should "give correct default" do
30
25
  doc = @document.new
31
26
  doc.tags.should == []
27
+ end
28
+
29
+ should "work with assignment" do
30
+ doc = @document.new
32
31
  doc.tags = %w(foo bar)
32
+ doc.tags.should == %w(foo bar)
33
+ end
34
+
35
+ should "work with assignment after saving" do
36
+ doc = @document.new
37
+ doc.tags = %w(foo bar)
38
+ doc.save
39
+ doc.tags.should == %w(foo bar)
40
+ @document.find(doc.id).tags.should == %w(foo bar)
41
+ end
42
+
43
+ should "work with assignment then <<" do
44
+ doc = @document.new
45
+ doc.tags = []
46
+ doc.tags << "foo"
47
+ doc.tags.should == ["foo"]
48
+ end
49
+
50
+ should "work with <<" do
51
+ doc = @document.new
52
+ doc.tags << "foo"
53
+ doc.tags.should == ["foo"]
54
+ end
55
+
56
+ should_eventually "work with << then save" do
57
+ doc = @document.new
58
+ doc.tags << "foo"
59
+ doc.tags << "bar"
33
60
  doc.save
34
61
  doc.tags.should == %w(foo bar)
35
62
  @document.find(doc.id).tags.should == %w(foo bar)
@@ -40,12 +67,31 @@ class DocumentTest < Test::Unit::TestCase
40
67
  setup do
41
68
  @document.key :foo, Hash
42
69
  end
43
-
70
+
71
+ should "give correct default" do
72
+ doc = @document.new
73
+ doc.foo.should == {}
74
+ end
75
+
76
+ should "work with []=" do
77
+ doc = @document.new
78
+ doc.foo["quux"] = "bar"
79
+ doc.foo["quux"].should == "bar"
80
+ doc.foo.should == { "quux" => "bar" }
81
+ end
82
+
44
83
  should "work with indifferent access" do
84
+ doc = @document.new
85
+ doc.foo = {:baz => 'bar'}
86
+ doc.foo[:baz].should == 'bar'
87
+ doc.foo['baz'].should == 'bar'
88
+ end
89
+
90
+ should "work with indifferent access after save" do
45
91
  doc = @document.new
46
92
  doc.foo = {:baz => 'bar'}
47
93
  doc.save
48
-
94
+
49
95
  doc = @document.find(doc.id)
50
96
  doc.foo[:baz].should == 'bar'
51
97
  doc.foo['baz'].should == 'bar'
@@ -109,7 +155,6 @@ class DocumentTest < Test::Unit::TestCase
109
155
  end
110
156
  end
111
157
 
112
-
113
158
  context "Creating multiple documents" do
114
159
  setup do
115
160
  @doc_instances = @document.create([
@@ -208,7 +253,7 @@ class DocumentTest < Test::Unit::TestCase
208
253
  end
209
254
 
210
255
  should "raise error if id is illegal" do
211
- lambda { @document.find(1) }.should raise_error(MongoMapper::DocumentNotFound)
256
+ lambda { @document.find(1) }.should raise_error(MongoMapper::IllegalID)
212
257
  end
213
258
  end
214
259
 
@@ -224,7 +269,7 @@ class DocumentTest < Test::Unit::TestCase
224
269
 
225
270
  context "with :all" do
226
271
  should "find all documents" do
227
- @document.find(:all).should == [@doc1, @doc2, @doc3]
272
+ @document.find(:all, :order => 'first_name').should == [@doc1, @doc3, @doc2]
228
273
  end
229
274
 
230
275
  should "be able to add conditions" do
@@ -234,20 +279,20 @@ class DocumentTest < Test::Unit::TestCase
234
279
 
235
280
  context "with #all" do
236
281
  should "find all documents based on criteria" do
237
- @document.all.should == [@doc1, @doc2, @doc3]
282
+ @document.all(:order => 'first_name').should == [@doc1, @doc3, @doc2]
238
283
  @document.all(:conditions => {:last_name => 'Nunemaker'}).should == [@doc1, @doc3]
239
284
  end
240
285
  end
241
286
 
242
287
  context "with :first" do
243
288
  should "find first document" do
244
- @document.find(:first).should == @doc1
289
+ @document.find(:first, :order => 'first_name').should == @doc1
245
290
  end
246
291
  end
247
292
 
248
293
  context "with #first" do
249
294
  should "find first document based on criteria" do
250
- @document.first.should == @doc1
295
+ @document.first(:order => 'first_name').should == @doc1
251
296
  @document.first(:conditions => {:age => 28}).should == @doc2
252
297
  end
253
298
  end
@@ -569,12 +614,12 @@ class DocumentTest < Test::Unit::TestCase
569
614
  @document.count.should == 1
570
615
  end
571
616
 
572
- should_eventually "update attributes" do
617
+ should "update attributes" do
573
618
  @doc.first_name.should == 'Johnny'
574
619
  @doc.age.should == 30
575
620
  end
576
621
 
577
- should_eventually "update attributes in the database" do
622
+ should "update attributes in the database" do
578
623
  from_db = @document.find(@doc.id)
579
624
  from_db.first_name.should == 'Johnny'
580
625
  from_db.age.should == 30
@@ -623,7 +668,7 @@ class DocumentTest < Test::Unit::TestCase
623
668
  doc.updated_at.should_not be(nil)
624
669
  end
625
670
 
626
- should "set updated_at on update but leave created_at alone" do
671
+ should "set updated_at on field update but leave created_at alone" do
627
672
  doc = @document.create(:first_name => 'John', :age => 27)
628
673
  old_created_at = doc.created_at
629
674
  old_updated_at = doc.updated_at
@@ -632,5 +677,17 @@ class DocumentTest < Test::Unit::TestCase
632
677
  doc.created_at.should == old_created_at
633
678
  doc.updated_at.should_not == old_updated_at
634
679
  end
680
+
681
+ should "set updated_at on document update but leave created_at alone" do
682
+ doc = @document.create(:first_name => 'John', :age => 27)
683
+ old_created_at = doc.created_at
684
+ old_updated_at = doc.updated_at
685
+ sleep 1 # this annoys me
686
+ @document.update(doc._id, { :first_name => 'Johnny' })
687
+
688
+ from_db = @document.find(doc.id)
689
+ from_db.created_at.to_i.should == old_created_at.to_i
690
+ from_db.updated_at.to_i.should_not == old_updated_at.to_i
691
+ end
635
692
  end
636
693
  end
@@ -30,10 +30,9 @@ class PaginationTest < Test::Unit::TestCase
30
30
  end
31
31
 
32
32
  should "return the items" do
33
- result = @document.paginate(:per_page => 2, :page => 1)
33
+ result = @document.paginate(:per_page => 2, :page => 1, :order => 'first_name')
34
34
  result.size.should == 2
35
- result.subject.should == [@doc1, @doc2]
36
- result.should == [@doc1, @doc2]
35
+ result.should == [@doc1, @doc3]
37
36
  end
38
37
 
39
38
  should "accept conditions" do