mongo_mapper 0.5.8 → 0.6.0

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 (47) hide show
  1. data/Rakefile +4 -4
  2. data/VERSION +1 -1
  3. data/bin/mmconsole +10 -5
  4. data/lib/mongo_mapper.rb +28 -5
  5. data/lib/mongo_mapper/associations.rb +113 -12
  6. data/lib/mongo_mapper/associations/base.rb +24 -9
  7. data/lib/mongo_mapper/associations/belongs_to_polymorphic_proxy.rb +1 -1
  8. data/lib/mongo_mapper/associations/belongs_to_proxy.rb +1 -1
  9. data/lib/mongo_mapper/associations/many_documents_as_proxy.rb +2 -2
  10. data/lib/mongo_mapper/associations/many_documents_proxy.rb +7 -2
  11. data/lib/mongo_mapper/associations/many_embedded_proxy.rb +22 -36
  12. data/lib/mongo_mapper/associations/proxy.rb +11 -6
  13. data/lib/mongo_mapper/document.rb +37 -21
  14. data/lib/mongo_mapper/embedded_document.rb +32 -18
  15. data/lib/mongo_mapper/finder_options.rb +19 -12
  16. data/lib/mongo_mapper/rails_compatibility/document.rb +4 -0
  17. data/lib/mongo_mapper/rails_compatibility/embedded_document.rb +4 -0
  18. data/lib/mongo_mapper/support.rb +18 -46
  19. data/lib/mongo_mapper/types.rb +64 -0
  20. data/lib/mongo_mapper/validations.rb +13 -43
  21. data/mongo_mapper.gemspec +13 -10
  22. data/test/functional/associations/test_belongs_to_polymorphic_proxy.rb +10 -10
  23. data/test/functional/associations/test_belongs_to_proxy.rb +29 -30
  24. data/test/functional/associations/test_many_documents_as_proxy.rb +13 -12
  25. data/test/functional/associations/test_many_embedded_polymorphic_proxy.rb +34 -34
  26. data/test/functional/associations/test_many_embedded_proxy.rb +69 -74
  27. data/test/functional/associations/test_many_polymorphic_proxy.rb +10 -10
  28. data/test/functional/associations/test_many_proxy.rb +14 -15
  29. data/test/functional/test_associations.rb +4 -4
  30. data/test/functional/test_binary.rb +1 -1
  31. data/test/functional/test_dirty.rb +6 -6
  32. data/test/functional/test_document.rb +76 -69
  33. data/test/functional/test_embedded_document.rb +15 -14
  34. data/test/functional/test_pagination.rb +9 -1
  35. data/test/functional/test_string_id_compatibility.rb +72 -0
  36. data/test/functional/test_validations.rb +56 -7
  37. data/test/models.rb +7 -7
  38. data/test/test_helper.rb +2 -5
  39. data/test/unit/test_association_base.rb +6 -1
  40. data/test/unit/test_document.rb +22 -13
  41. data/test/unit/test_embedded_document.rb +47 -5
  42. data/test/unit/test_finder_options.rb +22 -3
  43. data/test/unit/test_mongo_mapper.rb +65 -0
  44. data/test/unit/test_rails_compatibility.rb +14 -0
  45. data/test/unit/test_support.rb +45 -0
  46. metadata +9 -6
  47. data/test/unit/test_mongomapper.rb +0 -28
@@ -17,13 +17,6 @@ class ManyEmbeddedProxyTest < Test::Unit::TestCase
17
17
  project.addresses.push Address.new
18
18
  project.addresses.size.should == 2
19
19
  end
20
-
21
- should "allow finding :all embedded documents" do
22
- project = Project.new
23
- project.addresses << Address.new
24
- project.addresses << Address.new
25
- project.save
26
- end
27
20
 
28
21
  should "be embedded in document on save" do
29
22
  sb = Address.new(:city => 'South Bend', :state => 'IN')
@@ -33,10 +26,10 @@ class ManyEmbeddedProxyTest < Test::Unit::TestCase
33
26
  project.addresses << chi
34
27
  project.save
35
28
 
36
- from_db = Project.find(project.id)
37
- from_db.addresses.size.should == 2
38
- from_db.addresses[0].should == sb
39
- from_db.addresses[1].should == chi
29
+ project = project.reload
30
+ project.addresses.size.should == 2
31
+ project.addresses[0].should == sb
32
+ project.addresses[1].should == chi
40
33
  end
41
34
 
42
35
  should "allow embedding arbitrarily deep" do
@@ -54,10 +47,10 @@ class ManyEmbeddedProxyTest < Test::Unit::TestCase
54
47
  doc = @document.new(:person => meg)
55
48
  doc.save
56
49
 
57
- from_db = @document.find(doc.id)
58
- from_db.person.name.should == 'Meg'
59
- from_db.person.child.name.should == 'Steve'
60
- from_db.person.child.child.name.should == 'Linda'
50
+ doc = doc.reload
51
+ doc.person.name.should == 'Meg'
52
+ doc.person.child.name.should == 'Steve'
53
+ doc.person.child.child.name.should == 'Linda'
61
54
  end
62
55
 
63
56
  should "allow assignment of 'many' embedded documents using a hash" do
@@ -77,12 +70,12 @@ class ManyEmbeddedProxyTest < Test::Unit::TestCase
77
70
  pet_lover.pets[1].species.should == "Siberian Husky"
78
71
  pet_lover.save.should be_true
79
72
 
80
- from_db = RealPerson.find(pet_lover.id)
81
- from_db.name.should == "Mr. Pet Lover"
82
- from_db.pets[0].name.should == "Jimmy"
83
- from_db.pets[0].species.should == "Cocker Spainel"
84
- from_db.pets[1].name.should == "Sasha"
85
- from_db.pets[1].species.should == "Siberian Husky"
73
+ pet_lover = pet_lover.reload
74
+ pet_lover.name.should == "Mr. Pet Lover"
75
+ pet_lover.pets[0].name.should == "Jimmy"
76
+ pet_lover.pets[0].species.should == "Cocker Spainel"
77
+ pet_lover.pets[1].name.should == "Sasha"
78
+ pet_lover.pets[1].species.should == "Siberian Husky"
86
79
  end
87
80
 
88
81
  context "embedding many embedded documents" do
@@ -108,13 +101,13 @@ class ManyEmbeddedProxyTest < Test::Unit::TestCase
108
101
  doc.people << meg
109
102
  doc.save
110
103
 
111
- from_db = @document.find(doc.id)
112
- from_db.people.first.name.should == "Meg"
113
- from_db.people.first.pets.should_not == []
114
- from_db.people.first.pets.first.name.should == "Sparky"
115
- from_db.people.first.pets.first.species.should == "Dog"
116
- from_db.people.first.pets[1].name.should == "Koda"
117
- from_db.people.first.pets[1].species.should == "Dog"
104
+ doc = doc.reload
105
+ doc.people.first.name.should == "Meg"
106
+ doc.people.first.pets.should_not == []
107
+ doc.people.first.pets.first.name.should == "Sparky"
108
+ doc.people.first.pets.first.species.should == "Dog"
109
+ doc.people.first.pets[1].name.should == "Koda"
110
+ doc.people.first.pets[1].species.should == "Dog"
118
111
  end
119
112
 
120
113
  should "create a reference to the root document for all embedded documents before save" do
@@ -130,70 +123,72 @@ class ManyEmbeddedProxyTest < Test::Unit::TestCase
130
123
  doc.people.first.pets.first._root_document.should == doc
131
124
  end
132
125
 
133
- should "create properly-named reference to parent document when building off association proxy" do
134
- person = RealPerson.new
135
- pet = person.pets.build
136
- person.should == pet.real_person
137
- end
138
-
139
-
140
126
  should "create a reference to the root document for all embedded documents" do
141
- meg = Person.new(:name => "Meg")
142
127
  sparky = Pet.new(:name => "Sparky", :species => "Dog")
143
-
128
+ meg = Person.new(:name => "Meg", :pets => [sparky])
144
129
  doc = @document.new
145
-
146
- meg.pets << sparky
147
-
148
130
  doc.people << meg
149
131
  doc.save
150
132
 
151
- from_db = @document.find(doc.id)
152
- from_db.people.first._root_document.should == doc
153
- from_db.people.first.pets.first._root_document.should == doc
133
+ doc = doc.reload
134
+ doc.people.first._root_document.should == doc
135
+ doc.people.first.pets.first._root_document.should == doc
154
136
  end
155
137
  end
156
138
 
157
- should "allow retrieval via find(:all)" do
158
- meg = Person.new(:name => "Meg")
159
- sparky = Pet.new(:name => "Sparky", :species => "Dog")
160
-
161
- meg.pets << sparky
162
-
163
- meg.pets.find(:all).should include(sparky)
164
- end
165
-
166
- should "allow retrieval via find(id)" do
167
- meg = Person.new(:name => "Meg")
139
+ should "allow finding by id" do
168
140
  sparky = Pet.new(:name => "Sparky", :species => "Dog")
169
-
170
- meg.pets << sparky
171
-
172
- meg.pets.find(sparky.id).should == sparky
141
+ meg = Person.new(:name => "Meg", :pets => [sparky])
142
+ meg.pets.find(sparky._id).should == sparky
173
143
  end
174
144
 
175
145
  context "extending the association" do
146
+ setup do
147
+ @address_class = Class.new do
148
+ include MongoMapper::EmbeddedDocument
149
+ key :address, String
150
+ key :city, String
151
+ key :state, String
152
+ key :zip, Integer
153
+ end
154
+
155
+ @project_class = Class.new do
156
+ include MongoMapper::Document
157
+ key :name, String
158
+ end
159
+
160
+ @project_class.collection.remove
161
+ end
162
+
176
163
  should "work using a block passed to many" do
177
- project = Project.new(:name => "Some Project")
178
- addr1 = Address.new(:address => "Gate-3 Lankershim Blvd.", :city => "Universal City", :state => "CA", :zip => "91608")
179
- addr2 = Address.new(:address => "3000 W. Alameda Ave.", :city => "Burbank", :state => "CA", :zip => "91523")
180
- addr3 = Address.new(:address => "111 Some Ln", :city => "Nashville", :state => "TN", :zip => "37211")
181
- project.addresses = [addr1, addr2, addr3]
182
- project.save
164
+ @project_class.many :addresses, :class => @address_class do
165
+ def find_all_by_state(state)
166
+ find_all { |a| a.state == state }
167
+ end
168
+ end
169
+
170
+ addr1 = @address_class.new(:address => "Gate-3 Lankershim Blvd.", :city => "Universal City", :state => "CA", :zip => "91608")
171
+ addr2 = @address_class.new(:address => "3000 W. Alameda Ave.", :city => "Burbank", :state => "CA", :zip => "91523")
172
+ addr3 = @address_class.new(:address => "111 Some Ln", :city => "Nashville", :state => "TN", :zip => "37211")
173
+ project = @project_class.create(:name => "Some Project", :addresses => [addr1, addr2, addr3])
174
+
183
175
  project.addresses.find_all_by_state("CA").should == [addr1, addr2]
184
176
  end
185
177
 
186
178
  should "work using many's :extend option" do
187
- project = Project.new(:name => "Some Project")
188
- person1 = Person.new(:name => "Steve")
189
- person2 = Person.new(:name => "Betty")
190
- person3 = Person.new(:name => "Cynthia")
191
-
192
- project.people << person1
193
- project.people << person2
194
- project.people << person3
195
- project.save
196
- project.people.find_by_name("Steve").should == person1
179
+ module FindByCity
180
+ def find_by_city(city)
181
+ find_all { |a| a.city == city }
182
+ end
183
+ end
184
+ @project_class.many :addresses, :class => @address_class, :extend => FindByCity
185
+
186
+ addr1 = @address_class.new(:address => "Gate-3 Lankershim Blvd.", :city => "Universal City", :state => "CA", :zip => "91608")
187
+ addr2 = @address_class.new(:address => "3000 W. Alameda Ave.", :city => "Burbank", :state => "CA", :zip => "91523")
188
+ addr3 = @address_class.new(:address => "111 Some Ln", :city => "Nashville", :state => "TN", :zip => "37211")
189
+ project = @project_class.create(:name => "Some Project", :addresses => [addr1, addr2, addr3])
190
+
191
+ project.addresses.find_by_city('Burbank').should == [addr2]
197
192
  end
198
193
  end
199
194
  end
@@ -34,8 +34,8 @@ class ManyPolymorphicProxyTest < Test::Unit::TestCase
34
34
  ]
35
35
  }.should change { Message.count }.by(3)
36
36
 
37
- from_db = Room.find(room.id)
38
- messages = from_db.messages.all :order => "position"
37
+ room = room.reload
38
+ messages = room.messages.all :order => "position"
39
39
  messages.size.should == 3
40
40
  messages[0].body.should == 'John entered room'
41
41
  messages[1].body.should == 'Heyyyoooo!'
@@ -48,8 +48,8 @@ class ManyPolymorphicProxyTest < Test::Unit::TestCase
48
48
  room.messages.push Exit.new(:body => 'John entered the room', :position => 2)
49
49
  room.messages.concat Chat.new(:body => 'Holla!' , :position => 3)
50
50
 
51
- from_db = Room.find(room.id)
52
- messages = from_db.messages.all :order => "position"
51
+ room = room.reload
52
+ messages = room.messages.all :order => "position"
53
53
  messages[0]._type.should == 'Enter'
54
54
  messages[1]._type.should == 'Exit'
55
55
  messages[2]._type.should == 'Chat'
@@ -59,7 +59,7 @@ class ManyPolymorphicProxyTest < Test::Unit::TestCase
59
59
  should "assign foreign key" do
60
60
  room = Room.create
61
61
  message = room.messages.build
62
- message.room_id.should == room.id
62
+ message.room_id.should == room._id
63
63
  end
64
64
 
65
65
  should "assign _type" do
@@ -79,7 +79,7 @@ class ManyPolymorphicProxyTest < Test::Unit::TestCase
79
79
  should "assign foreign key" do
80
80
  room = Room.create
81
81
  message = room.messages.create
82
- message.room_id.should == room.id
82
+ message.room_id.should == room._id
83
83
  end
84
84
 
85
85
  should "assign _type" do
@@ -254,12 +254,12 @@ class ManyPolymorphicProxyTest < Test::Unit::TestCase
254
254
 
255
255
  context "with one id" do
256
256
  should "work for id in association" do
257
- @lounge.messages.find(@lm2.id).should == @lm2
257
+ @lounge.messages.find(@lm2._id).should == @lm2
258
258
  end
259
259
 
260
260
  should "not work for id not in association" do
261
261
  lambda {
262
- @lounge.messages.find(@hm2.id)
262
+ @lounge.messages.find!(@hm2._id)
263
263
  }.should raise_error(MongoMapper::DocumentNotFound)
264
264
  end
265
265
  end
@@ -280,13 +280,13 @@ class ManyPolymorphicProxyTest < Test::Unit::TestCase
280
280
 
281
281
  context "with multiple ids" do
282
282
  should "work for ids in association" do
283
- messages = @lounge.messages.find(@lm1.id, @lm2.id)
283
+ messages = @lounge.messages.find(@lm1._id, @lm2._id)
284
284
  messages.should == [@lm1, @lm2]
285
285
  end
286
286
 
287
287
  should "not work for ids not in association" do
288
288
  lambda {
289
- @lounge.messages.find(@lm1.id, @lm2.id, @hm2.id)
289
+ @lounge.messages.find!(@lm1._id, @lm2._id, @hm2._id)
290
290
  }.should raise_error(MongoMapper::DocumentNotFound)
291
291
  end
292
292
  end
@@ -25,9 +25,9 @@ class ManyProxyTest < Test::Unit::TestCase
25
25
  project.statuses = [Status.new("name" => "ready")]
26
26
  project.save.should be_true
27
27
 
28
- from_db = Project.find(project.id)
29
- from_db.statuses.size.should == 1
30
- from_db.statuses[0].name.should == "ready"
28
+ project = project.reload
29
+ project.statuses.size.should == 1
30
+ project.statuses[0].name.should == "ready"
31
31
  end
32
32
 
33
33
  should "correctly assign foreign key when using <<, push and concat" do
@@ -36,17 +36,17 @@ class ManyProxyTest < Test::Unit::TestCase
36
36
  project.statuses.push Status.new(:name => 'push')
37
37
  project.statuses.concat Status.new(:name => 'concat')
38
38
 
39
- from_db = Project.find(project.id)
40
- from_db.statuses[0].project_id.should == project.id
41
- from_db.statuses[1].project_id.should == project.id
42
- from_db.statuses[2].project_id.should == project.id
39
+ project = project.reload
40
+ project.statuses[0].project_id.should == project._id
41
+ project.statuses[1].project_id.should == project._id
42
+ project.statuses[2].project_id.should == project._id
43
43
  end
44
44
 
45
45
  context "build" do
46
46
  should "assign foreign key" do
47
47
  project = Project.create
48
48
  status = project.statuses.build
49
- status.project_id.should == project.id
49
+ status.project_id.should == project._id
50
50
  end
51
51
 
52
52
  should "allow assigning attributes" do
@@ -60,7 +60,7 @@ class ManyProxyTest < Test::Unit::TestCase
60
60
  should "assign foreign key" do
61
61
  project = Project.create
62
62
  status = project.statuses.create(:name => 'Foo!')
63
- status.project_id.should == project.id
63
+ status.project_id.should == project._id
64
64
  end
65
65
 
66
66
  should "save record" do
@@ -81,7 +81,7 @@ class ManyProxyTest < Test::Unit::TestCase
81
81
  should "assign foreign key" do
82
82
  project = Project.create
83
83
  status = project.statuses.create!(:name => 'Foo!')
84
- status.project_id.should == project.id
84
+ status.project_id.should == project._id
85
85
  end
86
86
 
87
87
  should "save record" do
@@ -105,7 +105,6 @@ class ManyProxyTest < Test::Unit::TestCase
105
105
  end
106
106
  end
107
107
 
108
-
109
108
  context "count" do
110
109
  should "work scoped to association" do
111
110
  project = Project.create
@@ -316,25 +315,25 @@ class ManyProxyTest < Test::Unit::TestCase
316
315
 
317
316
  context "with one id" do
318
317
  should "work for id in association" do
319
- @project1.statuses.find(@complete.id).should == @complete
318
+ @project1.statuses.find(@complete._id).should == @complete
320
319
  end
321
320
 
322
321
  should "not work for id not in association" do
323
322
  lambda {
324
- @project1.statuses.find(@archived.id)
323
+ @project1.statuses.find!(@archived._id)
325
324
  }.should raise_error(MongoMapper::DocumentNotFound)
326
325
  end
327
326
  end
328
327
 
329
328
  context "with multiple ids" do
330
329
  should "work for ids in association" do
331
- statuses = @project1.statuses.find(@brand_new.id, @complete.id)
330
+ statuses = @project1.statuses.find(@brand_new._id, @complete._id)
332
331
  statuses.should == [@brand_new, @complete]
333
332
  end
334
333
 
335
334
  should "not work for ids not in association" do
336
335
  lambda {
337
- @project1.statuses.find(@brand_new.id, @complete.id, @archived.id)
336
+ @project1.statuses.find!(@brand_new._id, @complete._id, @archived._id)
338
337
  }.should raise_error(MongoMapper::DocumentNotFound)
339
338
  end
340
339
  end
@@ -14,7 +14,7 @@ class AssociationsTest < Test::Unit::TestCase
14
14
  include MongoMapper::EmbeddedDocument
15
15
 
16
16
  key :name, String
17
- key :post_id, String
17
+ key :post_id, ObjectId
18
18
 
19
19
  belongs_to :post, :class_name => 'AssociationsTest::AwesomeUser'
20
20
  end
@@ -22,7 +22,7 @@ class AssociationsTest < Test::Unit::TestCase
22
22
  class AwesomePost
23
23
  include MongoMapper::Document
24
24
 
25
- key :creator_id, String
25
+ key :creator_id, ObjectId
26
26
 
27
27
  belongs_to :creator, :class_name => 'AssociationsTest::AwesomeUser'
28
28
  many :tags, :class_name => 'AssociationsTest::AwesomeTag', :foreign_key => :post_id
@@ -38,7 +38,7 @@ class AssociationsTest < Test::Unit::TestCase
38
38
  post2 = AwesomePost.create(:creator => user, :tags => [tag2])
39
39
  user.posts.should == [post1, post2]
40
40
 
41
- post1_from_db = AwesomePost.find(post1.id)
42
- post1_from_db.tags.should == [tag1]
41
+ post1 = post1.reload
42
+ post1.tags.should == [tag1]
43
43
  end
44
44
  end
@@ -12,7 +12,7 @@ class BinaryTest < Test::Unit::TestCase
12
12
  doc = klass.new(:contents => '010101')
13
13
  doc.save
14
14
 
15
- doc = klass.find(doc.id)
15
+ doc = doc.reload
16
16
  doc.contents.to_s.should == ByteBuffer.new('010101').to_s
17
17
  end
18
18
  end
@@ -55,17 +55,17 @@ class DirtyTest < Test::Unit::TestCase
55
55
  should "not happen when loading from database" do
56
56
  doc = @document.create(:phrase => 'Foo')
57
57
 
58
- from_db = @document.find(doc.id)
59
- from_db.changed?.should be_false
58
+ doc = doc.reload
59
+ doc.changed?.should be_false
60
60
  end
61
61
 
62
62
  should "happen if changed after loading from database" do
63
63
  doc = @document.create(:phrase => 'Foo')
64
64
 
65
- from_db = @document.find(doc.id)
66
- from_db.changed?.should be_false
67
- from_db.phrase = 'Bar'
68
- from_db.changed?.should be_true
65
+ doc = doc.reload
66
+ doc.changed?.should be_false
67
+ doc.phrase = 'Bar'
68
+ doc.changed?.should be_true
69
69
  end
70
70
  end
71
71
 
@@ -17,6 +17,7 @@ class DocumentTest < Test::Unit::TestCase
17
17
 
18
18
  context "Saving a document with a custom id" do
19
19
  should "clear custom id flag when saved" do
20
+ @document.key :_id, String
20
21
  doc = @document.new(:id => '1234')
21
22
  doc.using_custom_id?.should be_true
22
23
  doc.save.should be_true
@@ -37,7 +38,7 @@ class DocumentTest < Test::Unit::TestCase
37
38
 
38
39
  context "Loading a document from the database with keys that are not defined" do
39
40
  setup do
40
- @id = Mongo::ObjectID.new.to_s
41
+ @id = Mongo::ObjectID.new
41
42
  @document.collection.insert({
42
43
  :_id => @id,
43
44
  :first_name => 'John',
@@ -80,7 +81,7 @@ class DocumentTest < Test::Unit::TestCase
80
81
  doc.tags = %w(foo bar)
81
82
  doc.save
82
83
  doc.tags.should == %w(foo bar)
83
- @document.find(doc.id).tags.should == %w(foo bar)
84
+ doc.reload.tags.should == %w(foo bar)
84
85
  end
85
86
 
86
87
  should "work with assignment then <<" do
@@ -102,7 +103,7 @@ class DocumentTest < Test::Unit::TestCase
102
103
  doc.tags << "bar"
103
104
  doc.save
104
105
  doc.tags.should == %w(foo bar)
105
- @document.find(doc.id).tags.should == %w(foo bar)
106
+ doc.reload.tags.should == %w(foo bar)
106
107
  end
107
108
  end
108
109
 
@@ -135,7 +136,7 @@ class DocumentTest < Test::Unit::TestCase
135
136
  doc.foo = {:baz => 'bar'}
136
137
  doc.save
137
138
 
138
- doc = @document.find(doc.id)
139
+ doc = doc.reload
139
140
  doc.foo[:baz].should == 'bar'
140
141
  doc.foo['baz'].should == 'bar'
141
142
  end
@@ -156,12 +157,11 @@ class DocumentTest < Test::Unit::TestCase
156
157
  doc = @document.new
157
158
  doc.save
158
159
 
159
- from_db = @document.find(doc.id)
160
- from_db.window.should == WindowSize.new(600, 480)
160
+ doc = doc.reload
161
+ doc.window.should == WindowSize.new(600, 480)
161
162
  end
162
163
  end
163
164
 
164
-
165
165
  context "Creating a single document" do
166
166
  setup do
167
167
  @doc_instance = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
@@ -174,6 +174,8 @@ class DocumentTest < Test::Unit::TestCase
174
174
  should "automatically set id" do
175
175
  @doc_instance.id.should_not be_nil
176
176
  @doc_instance.id.size.should == 24
177
+ @doc_instance.id.should be_instance_of(String)
178
+ @doc_instance._id.should be_instance_of(Mongo::ObjectID)
177
179
  end
178
180
 
179
181
  should "no longer be new?" do
@@ -226,7 +228,7 @@ class DocumentTest < Test::Unit::TestCase
226
228
  context "Updating a document" do
227
229
  setup do
228
230
  doc = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
229
- @doc_instance = @document.update(doc.id, {:age => 40})
231
+ @doc_instance = @document.update(doc._id, {:age => 40})
230
232
  end
231
233
 
232
234
  should "update attributes provided" do
@@ -246,8 +248,8 @@ class DocumentTest < Test::Unit::TestCase
246
248
  should "raise error when updating single doc if not provided id and attributes" do
247
249
  doc = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
248
250
  lambda { @document.update }.should raise_error(ArgumentError)
249
- lambda { @document.update(doc.id) }.should raise_error(ArgumentError)
250
- lambda { @document.update(doc.id, [1]) }.should raise_error(ArgumentError)
251
+ lambda { @document.update(doc._id) }.should raise_error(ArgumentError)
252
+ lambda { @document.update(doc._id, [1]) }.should raise_error(ArgumentError)
251
253
  end
252
254
 
253
255
  context "Updating multiple documents" do
@@ -256,8 +258,8 @@ class DocumentTest < Test::Unit::TestCase
256
258
  @doc2 = @document.create({:first_name => 'Steve', :last_name => 'Smith', :age => '28'})
257
259
 
258
260
  @doc_instances = @document.update({
259
- @doc1.id => {:age => 30},
260
- @doc2.id => {:age => 30},
261
+ @doc1._id => {:age => 30},
262
+ @doc2._id => {:age => 30},
261
263
  })
262
264
  end
263
265
 
@@ -272,8 +274,8 @@ class DocumentTest < Test::Unit::TestCase
272
274
  end
273
275
 
274
276
  should "update the documents" do
275
- @document.find(@doc1.id).age.should == 30
276
- @document.find(@doc2.id).age.should == 30
277
+ @document.find(@doc1._id).age.should == 30
278
+ @document.find(@doc2._id).age.should == 30
277
279
  end
278
280
  end
279
281
 
@@ -288,33 +290,41 @@ class DocumentTest < Test::Unit::TestCase
288
290
  @doc3 = @document.create({:first_name => 'Steph', :last_name => 'Nunemaker', :age => '26'})
289
291
  end
290
292
 
291
- should "raise document not found if nothing provided" do
292
- lambda { @document.find }.should raise_error(MongoMapper::DocumentNotFound)
293
+ should "return nil if nothing provided for find" do
294
+ @document.find.should be_nil
295
+ end
296
+
297
+ should "raise document not found if nothing provided for find!" do
298
+ lambda { @document.find! }.should raise_error(MongoMapper::DocumentNotFound)
293
299
  end
294
300
 
295
301
  context "with a single id" do
296
302
  should "work" do
297
- @document.find(@doc1.id).should == @doc1
303
+ @document.find(@doc1._id).should == @doc1
304
+ end
305
+
306
+ should "return nil if document not found with find" do
307
+ @document.find(123).should be_nil
298
308
  end
299
309
 
300
- should "raise error if document not found" do
310
+ should "raise error if document not found with find!" do
301
311
  lambda {
302
- @document.find(123)
312
+ @document.find!(123)
303
313
  }.should raise_error(MongoMapper::DocumentNotFound)
304
314
  end
305
315
  end
306
316
 
307
317
  context "with multiple id's" do
308
318
  should "work as arguments" do
309
- @document.find(@doc1.id, @doc2.id).should == [@doc1, @doc2]
319
+ @document.find(@doc1._id, @doc2._id).should == [@doc1, @doc2]
310
320
  end
311
321
 
312
322
  should "work as array" do
313
- @document.find([@doc1.id, @doc2.id]).should == [@doc1, @doc2]
323
+ @document.find([@doc1._id, @doc2._id]).should == [@doc1, @doc2]
314
324
  end
315
325
 
316
326
  should "return array if array only has one element" do
317
- @document.find([@doc1.id]).should == [@doc1]
327
+ @document.find([@doc1._id]).should == [@doc1]
318
328
  end
319
329
  end
320
330
 
@@ -434,8 +444,8 @@ class DocumentTest < Test::Unit::TestCase
434
444
  end
435
445
 
436
446
  should "be able to find by id" do
437
- @document.find_by_id(@doc1.id).should == @doc1
438
- @document.find_by_id(@doc2.id).should == @doc2
447
+ @document.find_by_id(@doc1._id).should == @doc1
448
+ @document.find_by_id(@doc2._id).should == @doc2
439
449
  end
440
450
 
441
451
  should "return nil if document not found" do
@@ -447,7 +457,7 @@ class DocumentTest < Test::Unit::TestCase
447
457
  setup do
448
458
  @doc1 = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
449
459
  @doc2 = @document.create({:first_name => 'Steve', :last_name => 'Smith', :age => '28'})
450
- @document.delete(@doc1.id)
460
+ @document.delete(@doc1._id)
451
461
  end
452
462
 
453
463
  should "remove document from collection" do
@@ -455,7 +465,7 @@ class DocumentTest < Test::Unit::TestCase
455
465
  end
456
466
 
457
467
  should "not remove other documents" do
458
- @document.find(@doc2.id).should_not be(nil)
468
+ @document.find(@doc2._id).should_not be(nil)
459
469
  end
460
470
  end
461
471
 
@@ -464,7 +474,7 @@ class DocumentTest < Test::Unit::TestCase
464
474
  @doc1 = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
465
475
  @doc2 = @document.create({:first_name => 'Steve', :last_name => 'Smith', :age => '28'})
466
476
  @doc3 = @document.create({:first_name => 'Steph', :last_name => 'Nunemaker', :age => '26'})
467
- @document.delete(@doc1.id, @doc2.id)
477
+ @document.delete(@doc1._id, @doc2._id)
468
478
 
469
479
  @document.count.should == 1
470
480
  end
@@ -473,7 +483,7 @@ class DocumentTest < Test::Unit::TestCase
473
483
  @doc1 = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
474
484
  @doc2 = @document.create({:first_name => 'Steve', :last_name => 'Smith', :age => '28'})
475
485
  @doc3 = @document.create({:first_name => 'Steph', :last_name => 'Nunemaker', :age => '26'})
476
- @document.delete([@doc1.id, @doc2.id])
486
+ @document.delete([@doc1._id, @doc2._id])
477
487
 
478
488
  @document.count.should == 1
479
489
  end
@@ -506,7 +516,7 @@ class DocumentTest < Test::Unit::TestCase
506
516
  setup do
507
517
  @doc1 = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
508
518
  @doc2 = @document.create({:first_name => 'Steve', :last_name => 'Smith', :age => '28'})
509
- @document.destroy(@doc1.id)
519
+ @document.destroy(@doc1._id)
510
520
  end
511
521
 
512
522
  should "remove document from collection" do
@@ -514,7 +524,7 @@ class DocumentTest < Test::Unit::TestCase
514
524
  end
515
525
 
516
526
  should "not remove other documents" do
517
- @document.find(@doc2.id).should_not be(nil)
527
+ @document.find(@doc2._id).should_not be(nil)
518
528
  end
519
529
  end
520
530
 
@@ -523,8 +533,8 @@ class DocumentTest < Test::Unit::TestCase
523
533
  @doc1 = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
524
534
  @doc2 = @document.create({:first_name => 'Steve', :last_name => 'Smith', :age => '28'})
525
535
  @doc3 = @document.create({:first_name => 'Steph', :last_name => 'Nunemaker', :age => '26'})
526
- @document.destroy(@doc1.id, @doc2.id)
527
-
536
+ @document.destroy(@doc1._id, @doc2._id)
537
+
528
538
  @document.count.should == 1
529
539
  end
530
540
 
@@ -532,7 +542,7 @@ class DocumentTest < Test::Unit::TestCase
532
542
  @doc1 = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
533
543
  @doc2 = @document.create({:first_name => 'Steve', :last_name => 'Smith', :age => '28'})
534
544
  @doc3 = @document.create({:first_name => 'Steph', :last_name => 'Nunemaker', :age => '26'})
535
- @document.destroy([@doc1.id, @doc2.id])
545
+ @document.destroy([@doc1._id, @doc2._id])
536
546
 
537
547
  @document.count.should == 1
538
548
  end
@@ -586,7 +596,7 @@ class DocumentTest < Test::Unit::TestCase
586
596
  context "many" do
587
597
  context "=> destroy" do
588
598
  setup do
589
- Property.key :thing_id, String
599
+ Property.key :thing_id, ObjectId
590
600
  Property.belongs_to :thing, :dependent => :destroy
591
601
  Thing.many :properties, :dependent => :destroy
592
602
 
@@ -609,7 +619,7 @@ class DocumentTest < Test::Unit::TestCase
609
619
 
610
620
  context "=> delete_all" do
611
621
  setup do
612
- Property.key :thing_id, String
622
+ Property.key :thing_id, ObjectId
613
623
  Property.belongs_to :thing
614
624
  Thing.has_many :properties, :dependent => :delete_all
615
625
 
@@ -632,7 +642,7 @@ class DocumentTest < Test::Unit::TestCase
632
642
 
633
643
  context "=> nullify" do
634
644
  setup do
635
- Property.key :thing_id, String
645
+ Property.key :thing_id, ObjectId
636
646
  Property.belongs_to :thing
637
647
  Thing.has_many :properties, :dependent => :nullify
638
648
 
@@ -657,7 +667,7 @@ class DocumentTest < Test::Unit::TestCase
657
667
  context "belongs_to" do
658
668
  context "=> destroy" do
659
669
  setup do
660
- Property.key :thing_id, String
670
+ Property.key :thing_id, ObjectId
661
671
  Property.belongs_to :thing, :dependent => :destroy
662
672
  Thing.has_many :properties
663
673
 
@@ -777,25 +787,24 @@ class DocumentTest < Test::Unit::TestCase
777
787
  end
778
788
 
779
789
  should "update attributes in the database" do
780
- from_db = @document.find(@doc.id)
781
- from_db.should == @doc
782
- from_db.first_name.should == 'John'
783
- from_db.age.should == 27
790
+ doc = @doc.reload
791
+ doc.should == @doc
792
+ doc.first_name.should == 'John'
793
+ doc.age.should == 27
784
794
  end
785
795
 
786
796
  should "allow to add custom attributes to the document" do
787
797
  @doc = @document.new(:first_name => 'David', :age => '26', :gender => 'male', :tags => [1, "2"])
788
798
  @doc.save
789
- from_db = @document.find(@doc.id)
790
- from_db.gender.should == 'male'
791
- from_db.tags.should == [1, "2"]
799
+ doc = @doc.reload
800
+ doc.gender.should == 'male'
801
+ doc.tags.should == [1, "2"]
792
802
  end
793
803
 
794
804
  should "allow to use custom methods to assign properties" do
795
- person = RealPerson.new(:realname => "David")
805
+ person = RealPerson.new(:realname => 'David')
796
806
  person.save
797
- from_db = RealPerson.find(person.id)
798
- from_db.name.should == "David"
807
+ person.reload.name.should == 'David'
799
808
  end
800
809
 
801
810
  context "with key of type date" do
@@ -825,17 +834,16 @@ class DocumentTest < Test::Unit::TestCase
825
834
  end
826
835
 
827
836
  should "update attributes in the database" do
828
- from_db = @document.find(@doc.id)
829
- from_db.first_name.should == 'Johnny'
830
- from_db.age.should == 30
837
+ doc = @doc.reload
838
+ doc.first_name.should == 'Johnny'
839
+ doc.age.should == 30
831
840
  end
832
841
 
833
842
  should "allow updating custom attributes" do
834
843
  @doc = @document.new(:first_name => 'David', :age => '26', :gender => 'male')
835
844
  @doc.gender = 'Male'
836
845
  @doc.save
837
- from_db = @document.find(@doc.id)
838
- from_db.gender.should == 'Male'
846
+ @doc.reload.gender.should == 'Male'
839
847
  end
840
848
  end
841
849
 
@@ -860,16 +868,15 @@ class DocumentTest < Test::Unit::TestCase
860
868
  end
861
869
 
862
870
  should "update attributes in the database" do
863
- from_db = @document.find(@doc.id)
864
- from_db.should == @doc
865
- from_db.first_name.should == 'Johnny'
866
- from_db.age.should == 30
871
+ doc = @doc.reload
872
+ doc.should == @doc
873
+ doc.first_name.should == 'Johnny'
874
+ doc.age.should == 30
867
875
  end
868
876
 
869
877
  should "allow updating custom attributes" do
870
878
  @doc.update_attributes(:gender => 'mALe')
871
- from_db = @document.find(@doc.id)
872
- from_db.gender.should == 'mALe'
879
+ @doc.reload.gender.should == 'mALe'
873
880
  end
874
881
  end
875
882
 
@@ -889,9 +896,9 @@ class DocumentTest < Test::Unit::TestCase
889
896
  end
890
897
 
891
898
  should "update attributes in the database" do
892
- from_db = @document.find(@doc.id)
893
- from_db.first_name.should == 'Johnny'
894
- from_db.age.should == 30
899
+ doc = @doc.reload
900
+ doc.first_name.should == 'Johnny'
901
+ doc.age.should == 30
895
902
  end
896
903
  end
897
904
 
@@ -1023,14 +1030,14 @@ class DocumentTest < Test::Unit::TestCase
1023
1030
  steph = DocDaughter.create(:name => 'Steph')
1024
1031
 
1025
1032
  lambda {
1026
- DocSon.find(steph.id)
1033
+ DocSon.find!(steph._id)
1027
1034
  }.should raise_error(MongoMapper::DocumentNotFound)
1028
1035
  end
1029
1036
 
1030
1037
  should "not raise error for find with parent" do
1031
1038
  john = DocSon.create(:name => 'John')
1032
1039
 
1033
- DocParent.find(john.id).should == john
1040
+ DocParent.find!(john._id).should == john
1034
1041
  end
1035
1042
 
1036
1043
  should "count scoped to class" do
@@ -1065,7 +1072,7 @@ class DocumentTest < Test::Unit::TestCase
1065
1072
  steph = DocDaughter.create(:name => 'Steph')
1066
1073
 
1067
1074
  lambda {
1068
- DocSon.destroy(steph.id)
1075
+ DocSon.destroy(steph._id)
1069
1076
  }.should raise_error(MongoMapper::DocumentNotFound)
1070
1077
  end
1071
1078
 
@@ -1074,7 +1081,7 @@ class DocumentTest < Test::Unit::TestCase
1074
1081
  steph = DocDaughter.create(:name => 'Steph')
1075
1082
 
1076
1083
  lambda {
1077
- DocSon.delete(steph.id)
1084
+ DocSon.delete(steph._id)
1078
1085
  }.should_not change { DocParent.count }
1079
1086
  end
1080
1087
 
@@ -1134,9 +1141,9 @@ class DocumentTest < Test::Unit::TestCase
1134
1141
  @document.update(doc._id, { :first_name => 'Johnny' })
1135
1142
  end
1136
1143
 
1137
- from_db = @document.find(doc.id)
1138
- from_db.created_at.should == old_created_at
1139
- from_db.updated_at.should_not == old_updated_at
1144
+ doc = doc.reload
1145
+ doc.created_at.should == old_created_at
1146
+ doc.updated_at.should_not == old_updated_at
1140
1147
  end
1141
1148
  end
1142
1149
 
@@ -1166,7 +1173,7 @@ class DocumentTest < Test::Unit::TestCase
1166
1173
  context "reload" do
1167
1174
  setup do
1168
1175
  @doc_instance_1 = @document.create({:first_name => 'Ryan', :last_name => 'Koopmans', :age => '37'})
1169
- @doc_instance_2 = @document.update(@doc_instance_1.id, {:age => '39'})
1176
+ @doc_instance_2 = @document.update(@doc_instance_1._id, {:age => '39'})
1170
1177
  end
1171
1178
 
1172
1179
  should "load fresh information from the database" do