jnunemaker-mongomapper 0.3.1 → 0.3.2

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.
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