mongo_mapper 0.8.6 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/UPGRADES +10 -0
- data/bin/mmconsole +0 -1
- data/examples/identity_map/automatic.rb +1 -7
- data/examples/plugins.rb +9 -9
- data/examples/safe.rb +43 -0
- data/lib/mongo_mapper.rb +46 -33
- data/lib/mongo_mapper/document.rb +33 -32
- data/lib/mongo_mapper/embedded_document.rb +22 -22
- data/lib/mongo_mapper/locale/en.yml +5 -0
- data/lib/mongo_mapper/middleware/identity_map.rb +16 -0
- data/lib/mongo_mapper/plugins.rb +16 -3
- data/lib/mongo_mapper/plugins/accessible.rb +2 -0
- data/lib/mongo_mapper/plugins/active_model.rb +18 -0
- data/lib/mongo_mapper/plugins/associations.rb +37 -42
- data/lib/mongo_mapper/plugins/associations/base.rb +14 -50
- data/lib/mongo_mapper/plugins/associations/belongs_to_association.rb +58 -0
- data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +6 -1
- data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +30 -2
- data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +4 -0
- data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +12 -6
- data/lib/mongo_mapper/plugins/associations/many_association.rb +67 -0
- data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +5 -5
- data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +1 -1
- data/lib/mongo_mapper/plugins/associations/one_association.rb +20 -0
- data/lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb +5 -0
- data/lib/mongo_mapper/plugins/associations/one_proxy.rb +7 -7
- data/lib/mongo_mapper/plugins/associations/proxy.rb +2 -2
- data/lib/mongo_mapper/plugins/caching.rb +3 -1
- data/lib/mongo_mapper/plugins/callbacks.rb +12 -221
- data/lib/mongo_mapper/plugins/clone.rb +3 -1
- data/lib/mongo_mapper/plugins/dirty.rb +38 -91
- data/lib/mongo_mapper/plugins/document.rb +4 -2
- data/lib/mongo_mapper/plugins/dynamic_querying.rb +2 -0
- data/lib/mongo_mapper/plugins/embedded_callbacks.rb +43 -0
- data/lib/mongo_mapper/plugins/embedded_document.rb +16 -9
- data/lib/mongo_mapper/plugins/equality.rb +2 -0
- data/lib/mongo_mapper/plugins/identity_map.rb +4 -2
- data/lib/mongo_mapper/plugins/indexes.rb +2 -0
- data/lib/mongo_mapper/plugins/inspect.rb +3 -1
- data/lib/mongo_mapper/plugins/keys.rb +28 -22
- data/lib/mongo_mapper/plugins/keys/key.rb +12 -6
- data/lib/mongo_mapper/plugins/logger.rb +2 -0
- data/lib/mongo_mapper/plugins/modifiers.rb +3 -1
- data/lib/mongo_mapper/plugins/pagination.rb +2 -0
- data/lib/mongo_mapper/plugins/persistence.rb +2 -0
- data/lib/mongo_mapper/plugins/protected.rb +2 -0
- data/lib/mongo_mapper/plugins/querying.rb +5 -4
- data/lib/mongo_mapper/plugins/rails.rb +3 -5
- data/lib/mongo_mapper/plugins/safe.rb +2 -0
- data/lib/mongo_mapper/plugins/sci.rb +2 -0
- data/lib/mongo_mapper/plugins/scopes.rb +2 -0
- data/lib/mongo_mapper/plugins/serialization.rb +67 -46
- data/lib/mongo_mapper/plugins/timestamps.rb +3 -1
- data/lib/mongo_mapper/plugins/userstamps.rb +2 -0
- data/lib/mongo_mapper/plugins/validations.rb +40 -24
- data/lib/mongo_mapper/railtie.rb +49 -0
- data/lib/mongo_mapper/railtie/database.rake +60 -0
- data/lib/mongo_mapper/support/descendant_appends.rb +11 -11
- data/lib/mongo_mapper/translation.rb +10 -0
- data/lib/mongo_mapper/version.rb +1 -1
- data/lib/rails/generators/mongo_mapper/config/config_generator.rb +24 -0
- data/lib/rails/generators/mongo_mapper/config/templates/mongo.yml +18 -0
- data/lib/rails/generators/mongo_mapper/model/model_generator.rb +23 -0
- data/lib/rails/generators/mongo_mapper/model/templates/model.rb +11 -0
- data/test/functional/associations/test_belongs_to_polymorphic_proxy.rb +1 -0
- data/test/functional/associations/test_belongs_to_proxy.rb +131 -1
- data/test/functional/associations/test_in_array_proxy.rb +30 -0
- data/test/functional/associations/test_many_documents_proxy.rb +30 -2
- data/test/functional/associations/test_many_embedded_proxy.rb +33 -0
- data/test/functional/associations/test_many_polymorphic_proxy.rb +1 -0
- data/test/functional/associations/test_one_embedded_proxy.rb +21 -2
- data/test/functional/associations/test_one_proxy.rb +49 -9
- data/test/functional/test_associations.rb +2 -0
- data/test/functional/test_caching.rb +3 -2
- data/test/functional/test_callbacks.rb +25 -18
- data/test/functional/test_dirty.rb +123 -1
- data/test/functional/test_document.rb +26 -2
- data/test/functional/test_embedded_document.rb +68 -2
- data/test/functional/test_identity_map.rb +3 -4
- data/test/functional/test_querying.rb +11 -0
- data/test/functional/test_userstamps.rb +2 -2
- data/test/functional/test_validations.rb +31 -29
- data/test/models.rb +10 -0
- data/test/test_active_model_lint.rb +1 -1
- data/test/test_helper.rb +9 -10
- data/test/unit/associations/test_base.rb +24 -100
- data/test/unit/associations/test_belongs_to_association.rb +29 -0
- data/test/unit/associations/test_many_association.rb +63 -0
- data/test/unit/associations/test_one_association.rb +18 -0
- data/test/unit/serializers/test_json_serializer.rb +0 -1
- data/test/unit/test_descendant_appends.rb +8 -16
- data/test/unit/test_document.rb +4 -9
- data/test/unit/test_dynamic_finder.rb +1 -1
- data/test/unit/test_embedded_document.rb +51 -18
- data/test/unit/test_identity_map_middleware.rb +34 -0
- data/test/unit/test_inspect.rb +22 -0
- data/test/unit/test_key.rb +21 -1
- data/test/unit/test_keys.rb +0 -2
- data/test/unit/test_plugins.rb +106 -20
- data/test/unit/test_rails.rb +8 -8
- data/test/unit/test_serialization.rb +116 -1
- data/test/unit/test_translation.rb +27 -0
- data/test/unit/test_validations.rb +66 -81
- metadata +103 -43
- data/examples/identity_map/middleware.rb +0 -14
- data/lib/mongo_mapper/plugins/descendants.rb +0 -17
- data/rails/init.rb +0 -19
@@ -20,7 +20,7 @@ class OneEmbeddedProxyTest < Test::Unit::TestCase
|
|
20
20
|
@post_class.one :author, :class => @author_class
|
21
21
|
|
22
22
|
post = @post_class.create
|
23
|
-
author = post.
|
23
|
+
author = post.build_author(:name => "John")
|
24
24
|
post.author.should be_instance_of(@author_class)
|
25
25
|
post.author.should be_new
|
26
26
|
post.author.name.should == 'John'
|
@@ -48,7 +48,7 @@ class OneEmbeddedProxyTest < Test::Unit::TestCase
|
|
48
48
|
should "not have problem loading root document if embedded one is nil" do
|
49
49
|
@post_class.one :author, :class => @author_class
|
50
50
|
post = @post_class.create
|
51
|
-
|
51
|
+
|
52
52
|
lambda {
|
53
53
|
@post_class.find(post.id)
|
54
54
|
}.should_not raise_error
|
@@ -78,4 +78,23 @@ class OneEmbeddedProxyTest < Test::Unit::TestCase
|
|
78
78
|
post.author?.should be_true
|
79
79
|
end
|
80
80
|
|
81
|
+
should "initialize id for nested embedded document created from hash" do
|
82
|
+
@address_class = EDoc('Address') do
|
83
|
+
key :city, String
|
84
|
+
key :state, String
|
85
|
+
end
|
86
|
+
@author_class.one(:address, :class => @address_class)
|
87
|
+
@post_class.one(:author, :class => @author_class)
|
88
|
+
|
89
|
+
post = @post_class.create(:title => 'Post Title', :author => {
|
90
|
+
:name => 'Frank',
|
91
|
+
:address => {
|
92
|
+
:city => 'Boston',
|
93
|
+
:state => 'MA'
|
94
|
+
}
|
95
|
+
})
|
96
|
+
|
97
|
+
post.author.address.id.should_not be_nil
|
98
|
+
end
|
99
|
+
|
81
100
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'test_helper'
|
2
|
+
require 'models'
|
2
3
|
|
3
4
|
class OneProxyTest < Test::Unit::TestCase
|
4
5
|
def setup
|
@@ -13,6 +14,11 @@ class OneProxyTest < Test::Unit::TestCase
|
|
13
14
|
@post_class.new.author.nil?.should be_true
|
14
15
|
end
|
15
16
|
|
17
|
+
should "return nil instead of a proxy" do
|
18
|
+
@post_class.one :author, :class => @author_class
|
19
|
+
nil.should === @post_class.new.author
|
20
|
+
end
|
21
|
+
|
16
22
|
should "allow assignment of associated document using a hash" do
|
17
23
|
@post_class.one :author, :class => @author_class
|
18
24
|
|
@@ -42,6 +48,26 @@ class OneProxyTest < Test::Unit::TestCase
|
|
42
48
|
post.author = new_author
|
43
49
|
post.author.should == new_author
|
44
50
|
end
|
51
|
+
|
52
|
+
should "generate a new proxy instead of modifying the existing one" do
|
53
|
+
@post_class.one :author, :class => @author_class
|
54
|
+
|
55
|
+
post = @post_class.new
|
56
|
+
author = @author_class.new(:name => 'Frank')
|
57
|
+
post.author = author
|
58
|
+
post.reload
|
59
|
+
|
60
|
+
post.author.should == author
|
61
|
+
post.author.nil?.should be_false
|
62
|
+
|
63
|
+
original_author = post.author
|
64
|
+
original_author.name.should == 'Frank'
|
65
|
+
new_author = @author_class.new(:name => 'Emily')
|
66
|
+
post.author = new_author
|
67
|
+
post.author.should == new_author
|
68
|
+
|
69
|
+
original_author.name.should == 'Frank'
|
70
|
+
end
|
45
71
|
end
|
46
72
|
|
47
73
|
context "with a Hash" do
|
@@ -85,13 +111,12 @@ class OneProxyTest < Test::Unit::TestCase
|
|
85
111
|
|
86
112
|
should "unset the association" do
|
87
113
|
@post_class.one :author, :class => @author_class
|
88
|
-
post = @post_class.
|
89
|
-
author = @author_class.
|
90
|
-
post.author
|
114
|
+
post = @post_class.create
|
115
|
+
author = @author_class.create
|
116
|
+
post.update_attributes!(:author => author)
|
91
117
|
post.reload
|
92
|
-
|
93
118
|
post.author = nil
|
94
|
-
post.author.nil?.should
|
119
|
+
post.author.nil?.should be_true
|
95
120
|
end
|
96
121
|
|
97
122
|
should "work with :dependent delete" do
|
@@ -136,7 +161,7 @@ class OneProxyTest < Test::Unit::TestCase
|
|
136
161
|
@post_class.one :author, :class => @author_class
|
137
162
|
|
138
163
|
post = @post_class.create
|
139
|
-
author = post.
|
164
|
+
author = post.build_author(:name => 'John')
|
140
165
|
post.author.should be_instance_of(@author_class)
|
141
166
|
post.author.should be_new
|
142
167
|
post.author.name.should == 'John'
|
@@ -148,7 +173,7 @@ class OneProxyTest < Test::Unit::TestCase
|
|
148
173
|
@post_class.one :author, :class => @author_class
|
149
174
|
|
150
175
|
post = @post_class.create
|
151
|
-
author = post.
|
176
|
+
author = post.create_author(:name => 'John')
|
152
177
|
post.author.should be_instance_of(@author_class)
|
153
178
|
post.author.should_not be_new
|
154
179
|
post.author.name.should == 'John'
|
@@ -165,13 +190,13 @@ class OneProxyTest < Test::Unit::TestCase
|
|
165
190
|
should "raise exception if invalid" do
|
166
191
|
post = @post_class.create
|
167
192
|
assert_raises(MongoMapper::DocumentNotValid) do
|
168
|
-
post.
|
193
|
+
post.create_author!
|
169
194
|
end
|
170
195
|
end
|
171
196
|
|
172
197
|
should "work if valid" do
|
173
198
|
post = @post_class.create
|
174
|
-
author = post.
|
199
|
+
author = post.create_author!(:name => 'John')
|
175
200
|
post.author.should be_instance_of(@author_class)
|
176
201
|
post.author.should_not be_new
|
177
202
|
post.author.name.should == 'John'
|
@@ -179,4 +204,19 @@ class OneProxyTest < Test::Unit::TestCase
|
|
179
204
|
post.author.post_id.should == post.id
|
180
205
|
end
|
181
206
|
end
|
207
|
+
|
208
|
+
context "namespaced foreign keys" do
|
209
|
+
setup do
|
210
|
+
News::Paper.one :article, :class_name => 'News::Article'
|
211
|
+
News::Article.belongs_to :paper, :class_name => 'News::Paper'
|
212
|
+
|
213
|
+
@paper = News::Paper.create
|
214
|
+
end
|
215
|
+
|
216
|
+
should "properly infer the foreign key" do
|
217
|
+
article = @paper.create_article
|
218
|
+
article.should respond_to(:paper_id)
|
219
|
+
article.paper_id.should == @paper.id
|
220
|
+
end
|
221
|
+
end
|
182
222
|
end
|
@@ -36,6 +36,8 @@ class AssociationsTest < Test::Unit::TestCase
|
|
36
36
|
tag2 = AwesomeTag.new(:name => 'grand')
|
37
37
|
post1 = AwesomePost.create(:creator => user, :tags => [tag1])
|
38
38
|
post2 = AwesomePost.create(:creator => user, :tags => [tag2])
|
39
|
+
|
40
|
+
user.reload
|
39
41
|
user.posts.should == [post1, post2]
|
40
42
|
|
41
43
|
post1 = post1.reload
|
@@ -8,6 +8,7 @@ class CachingTest < Test::Unit::TestCase
|
|
8
8
|
plugin MongoMapper::Plugins::Caching
|
9
9
|
end
|
10
10
|
@klass.stubs(:name).returns('Post')
|
11
|
+
@klass.any_instance.stubs(:persisted?).returns(true)
|
11
12
|
@klass.any_instance.stubs(:[]).returns(nil)
|
12
13
|
@klass.any_instance.stubs(:[]=).returns(nil)
|
13
14
|
end
|
@@ -15,7 +16,7 @@ class CachingTest < Test::Unit::TestCase
|
|
15
16
|
context "new" do
|
16
17
|
setup do
|
17
18
|
@doc = @klass.new
|
18
|
-
@doc.stubs(:
|
19
|
+
@doc.stubs(:persisted?).returns(false)
|
19
20
|
end
|
20
21
|
|
21
22
|
should "be class/new" do
|
@@ -35,7 +36,7 @@ class CachingTest < Test::Unit::TestCase
|
|
35
36
|
setup do
|
36
37
|
@object_id = BSON::ObjectId.new
|
37
38
|
@doc = @klass.new
|
38
|
-
@doc.stubs(:
|
39
|
+
@doc.stubs(:persisted).returns(true)
|
39
40
|
@doc.stubs(:id).returns(@object_id)
|
40
41
|
end
|
41
42
|
|
@@ -4,15 +4,13 @@ module CallbacksSupport
|
|
4
4
|
def self.included base
|
5
5
|
base.key :name, String
|
6
6
|
|
7
|
-
[ :
|
8
|
-
:before_validation, :after_validation,
|
7
|
+
[ :before_validation, :after_validation,
|
9
8
|
:before_create, :after_create,
|
10
9
|
:before_update, :after_update,
|
11
10
|
:before_save, :after_save,
|
12
|
-
:before_destroy, :after_destroy
|
13
|
-
|
14
|
-
base.send(callback
|
15
|
-
define_method(callback_method) do
|
11
|
+
:before_destroy, :after_destroy
|
12
|
+
].each do |callback|
|
13
|
+
base.send(callback) do
|
16
14
|
history << callback.to_sym
|
17
15
|
end
|
18
16
|
end
|
@@ -29,8 +27,23 @@ module CallbacksSupport
|
|
29
27
|
end
|
30
28
|
|
31
29
|
class CallbacksTest < Test::Unit::TestCase
|
32
|
-
CreateCallbackOrder = [
|
33
|
-
|
30
|
+
CreateCallbackOrder = [
|
31
|
+
:before_validation,
|
32
|
+
:after_validation,
|
33
|
+
:before_save,
|
34
|
+
:before_create,
|
35
|
+
:after_create,
|
36
|
+
:after_save
|
37
|
+
]
|
38
|
+
|
39
|
+
UpdateCallbackOrder = [
|
40
|
+
:before_validation,
|
41
|
+
:after_validation,
|
42
|
+
:before_save,
|
43
|
+
:before_update,
|
44
|
+
:after_update,
|
45
|
+
:after_save
|
46
|
+
]
|
34
47
|
|
35
48
|
context "Defining and running callbacks on documents" do
|
36
49
|
setup do
|
@@ -102,11 +115,8 @@ class CallbacksTest < Test::Unit::TestCase
|
|
102
115
|
child = @child_class.new(:name => 'Child', :children => [grand])
|
103
116
|
root = @root_class.create(:name => 'Parent', :children => [child])
|
104
117
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
grand = root.children.first.children.first
|
109
|
-
grand.history.should == CreateCallbackOrder
|
118
|
+
root.children.first.history.should == CreateCallbackOrder
|
119
|
+
root.children.first.children.first.history.should == CreateCallbackOrder
|
110
120
|
end
|
111
121
|
|
112
122
|
should "get the order right based on root document updating" do
|
@@ -116,11 +126,8 @@ class CallbacksTest < Test::Unit::TestCase
|
|
116
126
|
root.clear_history
|
117
127
|
root.update_attributes(:name => 'Updated Parent')
|
118
128
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
grand = root.children.first.children.first
|
123
|
-
grand.history.should == UpdateCallbackOrder
|
129
|
+
root.children.first.history.should == UpdateCallbackOrder
|
130
|
+
root.children.first.children.first.history.should == UpdateCallbackOrder
|
124
131
|
end
|
125
132
|
|
126
133
|
should "work for before and after destroy" do
|
@@ -160,4 +160,126 @@ class DirtyTest < Test::Unit::TestCase
|
|
160
160
|
milestone.changed.should == %w(project_id)
|
161
161
|
end
|
162
162
|
end
|
163
|
-
|
163
|
+
|
164
|
+
context "save with an invalid document" do
|
165
|
+
should "not clear changes" do
|
166
|
+
validated_class = Doc do
|
167
|
+
key :name, String
|
168
|
+
key :required, String, :required=>true
|
169
|
+
end
|
170
|
+
validated_doc = validated_class.new
|
171
|
+
validated_doc.name = "I'm a changin"
|
172
|
+
validated_doc.save
|
173
|
+
validated_doc.changed?.should be_true
|
174
|
+
|
175
|
+
validated_doc.required = 1
|
176
|
+
validated_doc.save
|
177
|
+
validated_doc.changed?.should be_false
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
context "changing an already changed attribute" do
|
182
|
+
should "preserve the original value" do
|
183
|
+
doc = @document.create(:a=>"b")
|
184
|
+
doc.a = "c"
|
185
|
+
doc.a_change.should == ["b","c"]
|
186
|
+
doc.a = "d"
|
187
|
+
doc.a_change.should == ["b","d"]
|
188
|
+
end
|
189
|
+
should "reset changes when set back to the original value" do
|
190
|
+
doc = @document.create(:a=>"b")
|
191
|
+
doc.a = "c"
|
192
|
+
doc.a = "b"
|
193
|
+
doc.changed?.should be_false
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
context "reset_attribute!" do
|
198
|
+
should "reset the attribute back to the previous value" do
|
199
|
+
doc = @document.create(:a=>"b")
|
200
|
+
doc.a = "c"
|
201
|
+
doc.reset_a!
|
202
|
+
doc.changed?.should be_false
|
203
|
+
doc.a.should == "b"
|
204
|
+
end
|
205
|
+
should "reset the attribute back to the original value after several changes" do
|
206
|
+
doc = @document.create(:a=>"b")
|
207
|
+
doc.a = "c"
|
208
|
+
doc.a = "d"
|
209
|
+
doc.a = "e"
|
210
|
+
doc.reset_a!
|
211
|
+
doc.changed?.should be_false
|
212
|
+
doc.a.should == "b"
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
context "previous_changes" do
|
217
|
+
should "reflect previously committed change" do
|
218
|
+
doc = @document.create(:a=>"b")
|
219
|
+
doc.a = "c"
|
220
|
+
changes = doc.changes
|
221
|
+
doc.save!
|
222
|
+
doc.previous_changes.should == changes
|
223
|
+
end
|
224
|
+
|
225
|
+
should "not include attributes loaded from db" do
|
226
|
+
doc = @document.create(:a => "b")
|
227
|
+
@document.find(doc.id).previous_changes.should be_blank
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
context "Embedded documents" do
|
232
|
+
setup do
|
233
|
+
@edoc = EDoc('Duck') { key :name, String }
|
234
|
+
@edoc.plugin MongoMapper::Plugins::Dirty
|
235
|
+
@document = Doc('Long') { key :name, String }
|
236
|
+
@document.many :ducks, :class=>@edoc
|
237
|
+
@doc = @document.new
|
238
|
+
@duck = @doc.ducks.build
|
239
|
+
end
|
240
|
+
|
241
|
+
should "track changes" do
|
242
|
+
@duck.name = "hi"
|
243
|
+
@duck.changed?.should be_true
|
244
|
+
end
|
245
|
+
|
246
|
+
should "clear changes when saved" do
|
247
|
+
@duck.name = "hi"
|
248
|
+
@duck.changed?.should be_true
|
249
|
+
@duck.save!
|
250
|
+
@duck.changed?.should_not be_true
|
251
|
+
end
|
252
|
+
|
253
|
+
should "clear changes when the parent is saved" do
|
254
|
+
@duck.name = "hi"
|
255
|
+
@duck.changed?.should be_true
|
256
|
+
@doc.save!
|
257
|
+
@duck.changed?.should_not be_true
|
258
|
+
end
|
259
|
+
|
260
|
+
context "with nested embedded documents" do
|
261
|
+
setup do
|
262
|
+
@inner_edoc = EDoc('Dong') {key :name, String}
|
263
|
+
@inner_edoc.plugin MongoMapper::Plugins::Dirty
|
264
|
+
@edoc.many :dongs, :class=>@inner_edoc
|
265
|
+
@dong = @duck.dongs.build
|
266
|
+
end
|
267
|
+
|
268
|
+
should "track changes" do
|
269
|
+
@dong.name = "hi"
|
270
|
+
@dong.changed?.should be_true
|
271
|
+
end
|
272
|
+
|
273
|
+
should "clear changes when the root saves" do
|
274
|
+
@dong.name = "hi"
|
275
|
+
@dong.changed?.should be_true
|
276
|
+
@doc.save!
|
277
|
+
@dong.changed?.should be_false
|
278
|
+
end
|
279
|
+
|
280
|
+
end
|
281
|
+
|
282
|
+
end
|
283
|
+
|
284
|
+
|
285
|
+
end
|
@@ -192,11 +192,15 @@ class DocumentTest < Test::Unit::TestCase
|
|
192
192
|
|
193
193
|
@document.many :foos, :class => @foo_class
|
194
194
|
@document.many :bars, :class => @bar_class
|
195
|
+
@document.belongs_to :foo, :class => @foo_class
|
196
|
+
@document.one :bar, :class => @bar_class
|
195
197
|
|
196
198
|
@instance = @document.create({
|
197
|
-
:age
|
199
|
+
:age => 39,
|
198
200
|
:foos => [@foo_class.new(:name => '1')],
|
199
201
|
:bars => [@bar_class.new(:name => '1')],
|
202
|
+
:foo => @foo_class.new(:name => '2'),
|
203
|
+
:bar => @bar_class.new(:name => '2')
|
200
204
|
})
|
201
205
|
end
|
202
206
|
|
@@ -207,12 +211,27 @@ class DocumentTest < Test::Unit::TestCase
|
|
207
211
|
@instance.age.should == 39
|
208
212
|
end
|
209
213
|
|
210
|
-
should "reset
|
214
|
+
should "reset many associations" do
|
211
215
|
@instance.foos.expects(:reset).at_least_once
|
212
216
|
@instance.bars.expects(:reset).at_least_once
|
213
217
|
@instance.reload
|
214
218
|
end
|
215
219
|
|
220
|
+
should "reset belongs_to association" do
|
221
|
+
@instance.foo = nil
|
222
|
+
@instance.reload
|
223
|
+
@instance.foo.should_not be_nil
|
224
|
+
end
|
225
|
+
|
226
|
+
should "reset one association" do
|
227
|
+
@instance.bar = nil
|
228
|
+
@instance.reload
|
229
|
+
@instance.bar.should_not be_nil
|
230
|
+
end
|
231
|
+
|
232
|
+
should "reset nil one association" do
|
233
|
+
end
|
234
|
+
|
216
235
|
should "reinstantiate embedded associations" do
|
217
236
|
@instance.reload
|
218
237
|
@instance.bars.first.name.should == '1'
|
@@ -250,4 +269,9 @@ class DocumentTest < Test::Unit::TestCase
|
|
250
269
|
doc.skills.should == ['ruby', 'rails', 'javascript', 'xhtml', 'css']
|
251
270
|
end
|
252
271
|
end
|
272
|
+
|
273
|
+
should "not walk ObjectSpace when creating a model" do
|
274
|
+
ObjectSpace.expects(:each_object).never
|
275
|
+
Doc()
|
276
|
+
end
|
253
277
|
end
|