mongo_mapper 0.13.1 → 0.14.0.rc1
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.
- checksums.yaml +13 -5
- data/README.rdoc +3 -6
- data/lib/mongo_mapper.rb +1 -0
- data/lib/mongo_mapper/document.rb +2 -0
- data/lib/mongo_mapper/extensions/array.rb +14 -6
- data/lib/mongo_mapper/extensions/hash.rb +15 -3
- data/lib/mongo_mapper/extensions/object.rb +4 -0
- data/lib/mongo_mapper/extensions/string.rb +13 -5
- data/lib/mongo_mapper/plugins/accessible.rb +12 -11
- data/lib/mongo_mapper/plugins/associations.rb +7 -6
- data/lib/mongo_mapper/plugins/associations/base.rb +13 -12
- data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +9 -8
- data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +12 -11
- data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +4 -4
- data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +24 -23
- data/lib/mongo_mapper/plugins/associations/many_documents_as_proxy.rb +18 -16
- data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +55 -48
- data/lib/mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +14 -13
- data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +7 -6
- data/lib/mongo_mapper/plugins/associations/many_polymorphic_proxy.rb +7 -5
- data/lib/mongo_mapper/plugins/associations/one_as_proxy.rb +14 -11
- data/lib/mongo_mapper/plugins/associations/one_embedded_polymorphic_proxy.rb +14 -13
- data/lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb +9 -9
- data/lib/mongo_mapper/plugins/associations/one_proxy.rb +27 -26
- data/lib/mongo_mapper/plugins/associations/proxy.rb +29 -26
- data/lib/mongo_mapper/plugins/callbacks.rb +13 -0
- data/lib/mongo_mapper/plugins/counter_cache.rb +23 -4
- data/lib/mongo_mapper/plugins/dirty.rb +2 -2
- data/lib/mongo_mapper/plugins/dynamic_querying.rb +10 -9
- data/lib/mongo_mapper/plugins/dynamic_querying/dynamic_finder.rb +17 -16
- data/lib/mongo_mapper/plugins/embedded_callbacks.rb +1 -1
- data/lib/mongo_mapper/plugins/identity_map.rb +1 -1
- data/lib/mongo_mapper/plugins/indexes.rb +1 -1
- data/lib/mongo_mapper/plugins/keys.rb +158 -158
- data/lib/mongo_mapper/plugins/keys/key.rb +16 -10
- data/lib/mongo_mapper/plugins/keys/static.rb +45 -0
- data/lib/mongo_mapper/plugins/modifiers.rb +27 -26
- data/lib/mongo_mapper/plugins/partial_updates.rb +86 -0
- data/lib/mongo_mapper/plugins/persistence.rb +7 -6
- data/lib/mongo_mapper/plugins/protected.rb +6 -5
- data/lib/mongo_mapper/plugins/querying.rb +80 -43
- data/lib/mongo_mapper/plugins/querying/decorated_plucky_query.rb +14 -9
- data/lib/mongo_mapper/plugins/scopes.rb +78 -7
- data/lib/mongo_mapper/plugins/timestamps.rb +1 -0
- data/lib/mongo_mapper/plugins/validations.rb +0 -0
- data/lib/mongo_mapper/version.rb +1 -1
- data/lib/rails/generators/mongo_mapper/config/config_generator.rb +12 -13
- data/lib/rails/generators/mongo_mapper/model/model_generator.rb +9 -9
- data/spec/functional/accessible_spec.rb +12 -12
- data/spec/functional/associations/belongs_to_polymorphic_proxy_spec.rb +11 -11
- data/spec/functional/associations/belongs_to_proxy_spec.rb +14 -15
- data/spec/functional/associations/in_array_proxy_spec.rb +6 -6
- data/spec/functional/associations/many_documents_proxy_spec.rb +89 -18
- data/spec/functional/associations/many_embedded_polymorphic_proxy_spec.rb +11 -11
- data/spec/functional/associations/many_embedded_proxy_spec.rb +1 -1
- data/spec/functional/associations/one_as_proxy_spec.rb +14 -14
- data/spec/functional/associations/one_embedded_polymorphic_proxy_spec.rb +9 -9
- data/spec/functional/associations/one_embedded_proxy_spec.rb +3 -3
- data/spec/functional/associations/one_proxy_spec.rb +14 -14
- data/spec/functional/caching_spec.rb +8 -8
- data/spec/functional/callbacks_spec.rb +87 -0
- data/spec/functional/counter_cache_spec.rb +89 -0
- data/spec/functional/dirty_spec.rb +41 -41
- data/spec/functional/document_spec.rb +3 -3
- data/spec/functional/embedded_document_spec.rb +18 -18
- data/spec/functional/identity_map_spec.rb +28 -15
- data/spec/functional/indexes_spec.rb +4 -4
- data/spec/functional/keys_spec.rb +12 -3
- data/spec/functional/logger_spec.rb +1 -1
- data/spec/functional/modifiers_spec.rb +2 -2
- data/spec/functional/partial_updates_spec.rb +577 -0
- data/spec/functional/protected_spec.rb +13 -13
- data/spec/functional/querying_spec.rb +11 -10
- data/spec/functional/safe_spec.rb +2 -2
- data/spec/functional/sci_spec.rb +3 -3
- data/spec/functional/scopes_spec.rb +234 -1
- data/spec/functional/static_keys_spec.rb +153 -0
- data/spec/functional/stats_spec.rb +0 -4
- data/spec/functional/touch_spec.rb +1 -1
- data/spec/functional/validations_spec.rb +59 -57
- data/spec/quality_spec.rb +1 -1
- data/spec/spec_helper.rb +7 -3
- data/spec/support/matchers.rb +4 -13
- data/spec/unit/associations/base_spec.rb +12 -12
- data/spec/unit/associations/belongs_to_association_spec.rb +2 -2
- data/spec/unit/associations/many_association_spec.rb +2 -2
- data/spec/unit/associations/one_association_spec.rb +2 -2
- data/spec/unit/associations/proxy_spec.rb +13 -15
- data/spec/unit/document_spec.rb +5 -5
- data/spec/unit/dynamic_finder_spec.rb +8 -8
- data/spec/unit/embedded_document_spec.rb +14 -14
- data/spec/unit/extensions_spec.rb +17 -17
- data/spec/unit/identity_map_middleware_spec.rb +5 -5
- data/spec/unit/key_spec.rb +24 -21
- data/spec/unit/keys_spec.rb +5 -5
- data/spec/unit/mongo_mapper_spec.rb +26 -26
- data/spec/unit/rails_spec.rb +2 -2
- data/spec/unit/serialization_spec.rb +1 -1
- data/spec/unit/time_zones_spec.rb +2 -2
- data/spec/unit/validations_spec.rb +28 -15
- metadata +16 -14
- data/lib/mongo_mapper/connections/10gen.rb +0 -0
- data/lib/mongo_mapper/connections/moped.rb +0 -0
@@ -38,7 +38,7 @@ describe "OneEmbeddedProxy" do
|
|
38
38
|
post.reload
|
39
39
|
|
40
40
|
post.author.should == author
|
41
|
-
post.author.nil?.should
|
41
|
+
post.author.nil?.should be_falsey
|
42
42
|
|
43
43
|
new_author = @author_class.new(:name => 'Emily')
|
44
44
|
post.author = new_author
|
@@ -72,10 +72,10 @@ describe "OneEmbeddedProxy" do
|
|
72
72
|
@post_class.one :author, :class => @author_class
|
73
73
|
|
74
74
|
post = @post_class.new
|
75
|
-
post.author?.should
|
75
|
+
post.author?.should be_falsey
|
76
76
|
|
77
77
|
post.author = @author_class.new(:name => 'Frank')
|
78
|
-
post.author?.should
|
78
|
+
post.author?.should be_truthy
|
79
79
|
end
|
80
80
|
|
81
81
|
it "should initialize id for nested embedded document created from hash" do
|
@@ -11,7 +11,7 @@ describe "OneProxy" do
|
|
11
11
|
|
12
12
|
it "should default to nil" do
|
13
13
|
@post_class.one :author, :class => @author_class
|
14
|
-
@post_class.new.author.nil?.should
|
14
|
+
@post_class.new.author.nil?.should be_truthy
|
15
15
|
end
|
16
16
|
|
17
17
|
it "should return nil instead of a proxy" do
|
@@ -25,7 +25,7 @@ describe "OneProxy" do
|
|
25
25
|
post = @post_class.new('author' => { 'name' => 'Frank' })
|
26
26
|
post.author.name.should == 'Frank'
|
27
27
|
|
28
|
-
post.save.should
|
28
|
+
post.save.should be_truthy
|
29
29
|
post.reload
|
30
30
|
|
31
31
|
post.author.name.should == 'Frank'
|
@@ -42,7 +42,7 @@ describe "OneProxy" do
|
|
42
42
|
post.reload
|
43
43
|
|
44
44
|
post.author.should == author
|
45
|
-
post.author.nil?.should
|
45
|
+
post.author.nil?.should be_falsey
|
46
46
|
|
47
47
|
new_author = @author_class.new(:name => 'Emily')
|
48
48
|
post.author = new_author
|
@@ -58,7 +58,7 @@ describe "OneProxy" do
|
|
58
58
|
post.reload
|
59
59
|
|
60
60
|
post.author.should == author
|
61
|
-
post.author.nil?.should
|
61
|
+
post.author.nil?.should be_falsey
|
62
62
|
|
63
63
|
original_author = post.author
|
64
64
|
original_author.name.should == 'Frank'
|
@@ -79,7 +79,7 @@ describe "OneProxy" do
|
|
79
79
|
post.reload
|
80
80
|
|
81
81
|
post.author.name.should == 'Frank'
|
82
|
-
post.author.nil?.should
|
82
|
+
post.author.nil?.should be_falsey
|
83
83
|
|
84
84
|
post.author = {'name' => 'Emily'}
|
85
85
|
post.author.name.should == 'Emily'
|
@@ -97,7 +97,7 @@ describe "OneProxy" do
|
|
97
97
|
end
|
98
98
|
|
99
99
|
it "should call delete on the existing document" do
|
100
|
-
@author_class.
|
100
|
+
expect_any_instance_of(@author_class).to receive(:delete).once
|
101
101
|
@post.author = @author_class.new
|
102
102
|
end
|
103
103
|
|
@@ -107,7 +107,7 @@ describe "OneProxy" do
|
|
107
107
|
end
|
108
108
|
|
109
109
|
it "should do nothing if it's the same document" do
|
110
|
-
@author_class.
|
110
|
+
expect_any_instance_of(@author_class).to receive(:delete).never
|
111
111
|
@post.author = @author
|
112
112
|
end
|
113
113
|
end
|
@@ -122,7 +122,7 @@ describe "OneProxy" do
|
|
122
122
|
end
|
123
123
|
|
124
124
|
it "should call destroy the existing document" do
|
125
|
-
@author_class.
|
125
|
+
expect_any_instance_of(@author_class).to receive(:destroy).once
|
126
126
|
@post.author = @author_class.new
|
127
127
|
end
|
128
128
|
|
@@ -132,7 +132,7 @@ describe "OneProxy" do
|
|
132
132
|
end
|
133
133
|
|
134
134
|
it "should do nothing if it's the same document" do
|
135
|
-
@author_class.
|
135
|
+
expect_any_instance_of(@author_class).to receive(:destroy).never
|
136
136
|
@post.author = @author
|
137
137
|
end
|
138
138
|
end
|
@@ -207,10 +207,10 @@ describe "OneProxy" do
|
|
207
207
|
@post_class.one :author, :class => @author_class
|
208
208
|
|
209
209
|
post = @post_class.new
|
210
|
-
post.author?.should
|
210
|
+
post.author?.should be_falsey
|
211
211
|
|
212
212
|
post.author = @author_class.new(:name => 'Frank')
|
213
|
-
post.author?.should
|
213
|
+
post.author?.should be_truthy
|
214
214
|
end
|
215
215
|
|
216
216
|
it "should work with criteria" do
|
@@ -232,7 +232,7 @@ describe "OneProxy" do
|
|
232
232
|
post.update_attributes!(:author => author)
|
233
233
|
post.reload
|
234
234
|
post.author = nil
|
235
|
-
post.author.nil?.should
|
235
|
+
post.author.nil?.should be_truthy
|
236
236
|
end
|
237
237
|
|
238
238
|
context "destroying parent with :dependent" do
|
@@ -246,7 +246,7 @@ describe "OneProxy" do
|
|
246
246
|
end
|
247
247
|
|
248
248
|
it "should should call destroy on the associated documents" do
|
249
|
-
@author_class.
|
249
|
+
expect_any_instance_of(@author_class).to receive(:destroy).once
|
250
250
|
@post.destroy
|
251
251
|
end
|
252
252
|
|
@@ -268,7 +268,7 @@ describe "OneProxy" do
|
|
268
268
|
end
|
269
269
|
|
270
270
|
it "should should call delete the associated documents" do
|
271
|
-
@author_class.
|
271
|
+
expect_any_instance_of(@author_class).to receive(:delete).once
|
272
272
|
@post.destroy
|
273
273
|
end
|
274
274
|
|
@@ -6,16 +6,16 @@ describe "Caching" do
|
|
6
6
|
extend MongoMapper::Plugins
|
7
7
|
plugin MongoMapper::Plugins::Caching
|
8
8
|
end
|
9
|
-
@klass.
|
10
|
-
@klass.
|
11
|
-
@klass.
|
12
|
-
@klass.
|
9
|
+
allow(@klass).to receive(:name).and_return('Post')
|
10
|
+
allow_any_instance_of(@klass).to receive(:persisted?).and_return(true)
|
11
|
+
allow_any_instance_of(@klass).to receive(:[]).and_return(nil)
|
12
|
+
allow_any_instance_of(@klass).to receive(:[]=).and_return(nil)
|
13
13
|
end
|
14
14
|
|
15
15
|
context "new" do
|
16
16
|
before do
|
17
17
|
@doc = @klass.new
|
18
|
-
@doc.
|
18
|
+
allow(@doc).to receive(:persisted?).and_return(false)
|
19
19
|
end
|
20
20
|
|
21
21
|
it "should be class/new" do
|
@@ -35,14 +35,14 @@ describe "Caching" do
|
|
35
35
|
before do
|
36
36
|
@object_id = BSON::ObjectId.new
|
37
37
|
@doc = @klass.new
|
38
|
-
@doc.
|
39
|
-
@doc.
|
38
|
+
allow(@doc).to receive(:persisted).and_return(true)
|
39
|
+
allow(@doc).to receive(:id).and_return(@object_id)
|
40
40
|
end
|
41
41
|
|
42
42
|
context "with updated_at" do
|
43
43
|
before do
|
44
44
|
time = Time.utc(2010, 6, 20, 8, 10, 7)
|
45
|
-
@doc.
|
45
|
+
allow(@doc).to receive(:[]).with(:updated_at).and_return(time)
|
46
46
|
end
|
47
47
|
|
48
48
|
it "should be class/id-timestamp" do
|
@@ -240,4 +240,91 @@ describe "Callbacks" do
|
|
240
240
|
doc.message.should == 'Ho!'
|
241
241
|
end
|
242
242
|
end
|
243
|
+
|
244
|
+
describe "after_find" do
|
245
|
+
before do
|
246
|
+
@found_objects = []
|
247
|
+
found_objects = @found_objects # use a local for closure
|
248
|
+
|
249
|
+
@doc_class = Doc("User") do
|
250
|
+
after_find :set_found_object
|
251
|
+
|
252
|
+
define_method :set_found_object do
|
253
|
+
found_objects << self
|
254
|
+
end
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
it "should run after finding an object with find!" do
|
259
|
+
@doc = @doc_class.create!
|
260
|
+
|
261
|
+
@doc_class.find!(@doc.id)
|
262
|
+
@found_objects.should == [@doc]
|
263
|
+
end
|
264
|
+
|
265
|
+
it "should not have run if nothing was queried" do
|
266
|
+
@found_objects.should == []
|
267
|
+
end
|
268
|
+
|
269
|
+
it "should run for multiple objects" do
|
270
|
+
@doc1 = @doc_class.create!
|
271
|
+
@doc2 = @doc_class.create!
|
272
|
+
|
273
|
+
@doc_class.all
|
274
|
+
@found_objects.should == [@doc1, @doc2]
|
275
|
+
end
|
276
|
+
|
277
|
+
it "should run after finding an object through the query proxy" do
|
278
|
+
@doc = @doc_class.create!
|
279
|
+
@doc_class.where(:_id => @doc.id).first
|
280
|
+
@found_objects.should == [@doc]
|
281
|
+
end
|
282
|
+
|
283
|
+
it "should still return the object" do
|
284
|
+
@doc = @doc_class.create!
|
285
|
+
@doc_class.where(:_id => @doc.id).first.should == @doc
|
286
|
+
end
|
287
|
+
|
288
|
+
it "should not bail if the method return false" do
|
289
|
+
@doc_class = Doc("User") do
|
290
|
+
after_find :set_found_object
|
291
|
+
|
292
|
+
define_method :set_found_object do
|
293
|
+
false
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
@doc = @doc_class.create!
|
298
|
+
@doc_class.where(:_id => @doc.id).first.should == @doc
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
describe "after_initialize" do
|
303
|
+
before do
|
304
|
+
@objects = []
|
305
|
+
objects = @objects
|
306
|
+
|
307
|
+
@doc_class = Doc("User") do
|
308
|
+
after_initialize :set_initialized_object
|
309
|
+
|
310
|
+
define_method :set_initialized_object do
|
311
|
+
objects << self
|
312
|
+
end
|
313
|
+
end
|
314
|
+
end
|
315
|
+
|
316
|
+
it "should be triggered for objects created with new" do
|
317
|
+
@objects.should == []
|
318
|
+
obj = @doc_class.new
|
319
|
+
@objects.should == [obj]
|
320
|
+
end
|
321
|
+
|
322
|
+
it "should be triggered for objects found in the db" do
|
323
|
+
@doc = @doc_class.create!
|
324
|
+
@objects.clear # don't re-assign as we want the operation to be in place
|
325
|
+
|
326
|
+
@doc_class.all
|
327
|
+
@objects.should == [@doc]
|
328
|
+
end
|
329
|
+
end
|
243
330
|
end
|
@@ -15,6 +15,7 @@ module CounterCacheFixtureModels
|
|
15
15
|
|
16
16
|
key :comments_count, Integer, :default => 0
|
17
17
|
key :some_custom_comments_count, Integer, :default => 0
|
18
|
+
key :commentable_count, Integer, :default => 0
|
18
19
|
|
19
20
|
has_many :comments,
|
20
21
|
:class_name => "CounterCacheFixtureModels::Comment"
|
@@ -22,6 +23,20 @@ module CounterCacheFixtureModels
|
|
22
23
|
belongs_to :user,
|
23
24
|
:counter_cache => true,
|
24
25
|
:class_name => "CounterCacheFixtureModels::User"
|
26
|
+
|
27
|
+
many :polymorphic_comments,
|
28
|
+
:as => :commentable,
|
29
|
+
:class_name => "CounterCacheFixtureModels::Comment"
|
30
|
+
end
|
31
|
+
|
32
|
+
class Article
|
33
|
+
include MongoMapper::Document
|
34
|
+
|
35
|
+
key :commentable_count, Integer, :default => 0
|
36
|
+
|
37
|
+
many :polymorphic_comments,
|
38
|
+
:as => :commentable,
|
39
|
+
:class_name => "CounterCacheFixtureModels::Comment"
|
25
40
|
end
|
26
41
|
|
27
42
|
class Comment
|
@@ -30,6 +45,10 @@ module CounterCacheFixtureModels
|
|
30
45
|
belongs_to :post,
|
31
46
|
:counter_cache => true,
|
32
47
|
:class_name => "CounterCacheFixtureModels::Post"
|
48
|
+
|
49
|
+
belongs_to :commentable,
|
50
|
+
:polymorphic => true,
|
51
|
+
:counter_cache => :commentable_count
|
33
52
|
end
|
34
53
|
|
35
54
|
class CustomComment
|
@@ -143,4 +162,74 @@ describe MongoMapper::Plugins::CounterCache do
|
|
143
162
|
end
|
144
163
|
}.should raise_error(MongoMapper::Plugins::CounterCache::InvalidCounterCacheError, "Missing `key :invalid_field, Integer, :default => 0' on model CounterCacheFixtureModels::Post")
|
145
164
|
end
|
165
|
+
|
166
|
+
describe "with polymorphic associations" do
|
167
|
+
before do
|
168
|
+
@article = CounterCacheFixtureModels::Article.new
|
169
|
+
@comment = CounterCacheFixtureModels::Comment.new
|
170
|
+
@comment.commentable = @article
|
171
|
+
end
|
172
|
+
|
173
|
+
it "should update the counter cache on save" do
|
174
|
+
expect {
|
175
|
+
@comment.save!
|
176
|
+
@article.reload
|
177
|
+
}.to change(@article, :commentable_count).by(1)
|
178
|
+
end
|
179
|
+
|
180
|
+
it "should increment with a second object" do
|
181
|
+
@comment.save!
|
182
|
+
|
183
|
+
expect {
|
184
|
+
second_comment = CounterCacheFixtureModels::Comment.new
|
185
|
+
second_comment.commentable = @article
|
186
|
+
second_comment.save!
|
187
|
+
@article.reload
|
188
|
+
}.to change(@article, :commentable_count).by(1)
|
189
|
+
end
|
190
|
+
|
191
|
+
it "should decrement the counter cache on destroy" do
|
192
|
+
@comment.save!
|
193
|
+
|
194
|
+
expect {
|
195
|
+
@comment.destroy
|
196
|
+
@article.reload
|
197
|
+
}.to change(@article, :commentable_count).by(-1)
|
198
|
+
end
|
199
|
+
|
200
|
+
it "should increment with a different type of object" do
|
201
|
+
@comment.save!
|
202
|
+
|
203
|
+
expect {
|
204
|
+
second_comment = CounterCacheFixtureModels::Comment.new
|
205
|
+
second_comment.commentable = @article
|
206
|
+
second_comment.save!
|
207
|
+
|
208
|
+
@article.reload
|
209
|
+
}.to change(@article, :commentable_count).by(1)
|
210
|
+
end
|
211
|
+
|
212
|
+
describe "without a counter cache field" do
|
213
|
+
before do
|
214
|
+
@comment = CounterCacheFixtureModels::Comment.new
|
215
|
+
@klass = Class.new do
|
216
|
+
include MongoMapper::Document
|
217
|
+
|
218
|
+
many :polymorphic_comments,
|
219
|
+
:as => :commentable,
|
220
|
+
:class_name => "CounterCacheFixtureModels::Comment"
|
221
|
+
end
|
222
|
+
|
223
|
+
@obj = @klass.new
|
224
|
+
end
|
225
|
+
|
226
|
+
it "should raise at save (runtime) if there is no counter cache field" do
|
227
|
+
@comment.commentable = @obj
|
228
|
+
|
229
|
+
expect {
|
230
|
+
@comment.save!
|
231
|
+
}.to raise_error(MongoMapper::Plugins::CounterCache::InvalidCounterCacheError)
|
232
|
+
end
|
233
|
+
end
|
234
|
+
end
|
146
235
|
end
|
@@ -11,73 +11,73 @@ describe "Dirty" do
|
|
11
11
|
context "marking changes" do
|
12
12
|
it "should not happen if there are none" do
|
13
13
|
doc = @document.new
|
14
|
-
doc.phrase_changed?.should
|
14
|
+
doc.phrase_changed?.should be_falsey
|
15
15
|
doc.phrase_change.should be_nil
|
16
16
|
end
|
17
17
|
|
18
18
|
it "should happen when change happens" do
|
19
19
|
doc = @document.new
|
20
20
|
doc.phrase = 'Golly Gee Willikers Batman'
|
21
|
-
doc.phrase_changed?.should
|
21
|
+
doc.phrase_changed?.should be_truthy
|
22
22
|
doc.phrase_was.should be_nil
|
23
23
|
doc.phrase_change.should == [nil, 'Golly Gee Willikers Batman']
|
24
24
|
end
|
25
25
|
|
26
26
|
it "should happen when initializing" do
|
27
27
|
doc = @document.new(:phrase => 'Foo')
|
28
|
-
doc.changed?.should
|
28
|
+
doc.changed?.should be_truthy
|
29
29
|
end
|
30
30
|
|
31
31
|
it "should clear changes on save" do
|
32
32
|
doc = @document.new
|
33
33
|
doc.phrase = 'Golly Gee Willikers Batman'
|
34
|
-
doc.phrase_changed?.should
|
34
|
+
doc.phrase_changed?.should be_truthy
|
35
35
|
doc.save
|
36
|
-
doc.phrase_changed?.should_not
|
36
|
+
doc.phrase_changed?.should_not be_truthy
|
37
37
|
doc.phrase_change.should be_nil
|
38
38
|
end
|
39
39
|
|
40
40
|
it "should clear changes on save!" do
|
41
41
|
doc = @document.new
|
42
42
|
doc.phrase = 'Golly Gee Willikers Batman'
|
43
|
-
doc.phrase_changed?.should
|
43
|
+
doc.phrase_changed?.should be_truthy
|
44
44
|
doc.save!
|
45
|
-
doc.phrase_changed?.should_not
|
45
|
+
doc.phrase_changed?.should_not be_truthy
|
46
46
|
doc.phrase_change.should be_nil
|
47
47
|
end
|
48
48
|
|
49
49
|
it "should not happen when loading from database" do
|
50
50
|
doc = @document.create(:phrase => 'Foo')
|
51
|
-
@document.
|
52
|
-
@document.
|
51
|
+
expect_any_instance_of(@document).to receive(:attribute_will_change!).never
|
52
|
+
expect_any_instance_of(@document).to receive(:attribute_changed?).never
|
53
53
|
doc = @document.find(doc.id)
|
54
|
-
doc.changed?.should
|
54
|
+
doc.changed?.should be_falsey
|
55
55
|
end
|
56
56
|
|
57
57
|
it "should not happen when reloading from database" do
|
58
58
|
doc = @document.create(:phrase => 'Foo')
|
59
59
|
doc = @document.find(doc.id)
|
60
60
|
|
61
|
-
doc.changed?.should
|
61
|
+
doc.changed?.should be_falsey
|
62
62
|
doc.phrase = 'Fart'
|
63
|
-
doc.changed?.should
|
63
|
+
doc.changed?.should be_truthy
|
64
64
|
doc.reload
|
65
|
-
doc.changed?.should
|
65
|
+
doc.changed?.should be_falsey
|
66
66
|
end
|
67
67
|
|
68
68
|
it "should happen if changed after loading from database" do
|
69
69
|
doc = @document.create(:phrase => 'Foo')
|
70
70
|
doc.reload
|
71
|
-
doc.changed?.should
|
71
|
+
doc.changed?.should be_falsey
|
72
72
|
doc.phrase = 'Bar'
|
73
|
-
doc.changed?.should
|
73
|
+
doc.changed?.should be_truthy
|
74
74
|
end
|
75
75
|
|
76
76
|
it "should happen with aliased keys" do
|
77
77
|
doc = @document.create(:paragraph => 'Wibbly')
|
78
78
|
doc.paragraph = "Wobbly"
|
79
|
-
doc.changed?.should
|
80
|
-
doc.paragraph_changed?.should
|
79
|
+
doc.changed?.should be_truthy
|
80
|
+
doc.paragraph_changed?.should be_truthy
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
@@ -88,7 +88,7 @@ describe "Dirty" do
|
|
88
88
|
[nil, ''].each do |value|
|
89
89
|
doc = @document.new
|
90
90
|
doc.age = value
|
91
|
-
doc.age_changed?.should
|
91
|
+
doc.age_changed?.should be_falsey
|
92
92
|
doc.age_change.should be_nil
|
93
93
|
end
|
94
94
|
end
|
@@ -101,7 +101,7 @@ describe "Dirty" do
|
|
101
101
|
[nil, ''].each do |value|
|
102
102
|
doc = @document.new
|
103
103
|
doc.amount = value
|
104
|
-
doc.amount_changed?.should
|
104
|
+
doc.amount_changed?.should be_falsey
|
105
105
|
doc.amount_change.should be_nil
|
106
106
|
end
|
107
107
|
end
|
@@ -111,27 +111,27 @@ describe "Dirty" do
|
|
111
111
|
it "should be true if key changed" do
|
112
112
|
doc = @document.new
|
113
113
|
doc.phrase = 'A penny saved is a penny earned.'
|
114
|
-
doc.changed?.should
|
114
|
+
doc.changed?.should be_truthy
|
115
115
|
end
|
116
116
|
|
117
117
|
it "should be false if no keys changed" do
|
118
|
-
@document.new.changed?.should
|
118
|
+
@document.new.changed?.should be_falsey
|
119
119
|
end
|
120
120
|
|
121
121
|
it "should not raise when key name is 'value'" do
|
122
122
|
@document.key :value, Integer
|
123
123
|
|
124
124
|
doc = @document.new
|
125
|
-
doc.value_changed?.should
|
125
|
+
doc.value_changed?.should be_falsey
|
126
126
|
end
|
127
127
|
|
128
128
|
it "should be false if the same ObjectId was assigned in String format" do
|
129
129
|
@document.key :doc_id, ObjectId
|
130
130
|
|
131
131
|
doc = @document.create!(:doc_id => BSON::ObjectId.new)
|
132
|
-
doc.changed?.should
|
132
|
+
doc.changed?.should be_falsey
|
133
133
|
doc.doc_id = doc.doc_id.to_s
|
134
|
-
doc.changed?.should
|
134
|
+
doc.changed?.should be_falsey
|
135
135
|
end
|
136
136
|
end
|
137
137
|
|
@@ -164,14 +164,14 @@ describe "Dirty" do
|
|
164
164
|
doc = @document.create(:phrase => 'Foo')
|
165
165
|
|
166
166
|
doc.phrase << 'bar'
|
167
|
-
doc.phrase_changed?.should
|
167
|
+
doc.phrase_changed?.should be_falsey
|
168
168
|
|
169
169
|
doc.phrase_will_change!
|
170
|
-
doc.phrase_changed?.should
|
170
|
+
doc.phrase_changed?.should be_truthy
|
171
171
|
doc.phrase_change.should == ['Foobar', 'Foobar']
|
172
172
|
|
173
173
|
doc.phrase << '!'
|
174
|
-
doc.phrase_changed?.should
|
174
|
+
doc.phrase_changed?.should be_truthy
|
175
175
|
doc.phrase_change.should == ['Foobar', 'Foobar!']
|
176
176
|
end
|
177
177
|
end
|
@@ -190,7 +190,7 @@ describe "Dirty" do
|
|
190
190
|
|
191
191
|
milestone = milestone_class.create(:name => 'Launch')
|
192
192
|
milestone.project = project_class.create(:name => 'Harmony')
|
193
|
-
milestone.changed?.should
|
193
|
+
milestone.changed?.should be_truthy
|
194
194
|
milestone.changed.should == %w(project_id)
|
195
195
|
end
|
196
196
|
end
|
@@ -204,11 +204,11 @@ describe "Dirty" do
|
|
204
204
|
validated_doc = validated_class.new
|
205
205
|
validated_doc.name = "I'm a changin"
|
206
206
|
validated_doc.save
|
207
|
-
validated_doc.changed?.should
|
207
|
+
validated_doc.changed?.should be_truthy
|
208
208
|
|
209
209
|
validated_doc.required = 1
|
210
210
|
validated_doc.save
|
211
|
-
validated_doc.changed?.should
|
211
|
+
validated_doc.changed?.should be_falsey
|
212
212
|
end
|
213
213
|
end
|
214
214
|
|
@@ -224,7 +224,7 @@ describe "Dirty" do
|
|
224
224
|
doc = @document.create(:a=>"b")
|
225
225
|
doc.a = "c"
|
226
226
|
doc.a = "b"
|
227
|
-
doc.changed?.should
|
227
|
+
doc.changed?.should be_falsey
|
228
228
|
end
|
229
229
|
end
|
230
230
|
|
@@ -233,7 +233,7 @@ describe "Dirty" do
|
|
233
233
|
doc = @document.create(:a=>"b")
|
234
234
|
doc.a = "c"
|
235
235
|
doc.reset_a!
|
236
|
-
doc.changed?.should
|
236
|
+
doc.changed?.should be_falsey
|
237
237
|
doc.a.should == "b"
|
238
238
|
end
|
239
239
|
it "should reset the attribute back to the original value after several changes" do
|
@@ -242,7 +242,7 @@ describe "Dirty" do
|
|
242
242
|
doc.a = "d"
|
243
243
|
doc.a = "e"
|
244
244
|
doc.reset_a!
|
245
|
-
doc.changed?.should
|
245
|
+
doc.changed?.should be_falsey
|
246
246
|
doc.a.should == "b"
|
247
247
|
end
|
248
248
|
end
|
@@ -275,21 +275,21 @@ describe "Dirty" do
|
|
275
275
|
|
276
276
|
it "should track changes" do
|
277
277
|
@duck.name = "hi"
|
278
|
-
@duck.changed?.should
|
278
|
+
@duck.changed?.should be_truthy
|
279
279
|
end
|
280
280
|
|
281
281
|
it "should clear changes when saved" do
|
282
282
|
@duck.name = "hi"
|
283
|
-
@duck.changed?.should
|
283
|
+
@duck.changed?.should be_truthy
|
284
284
|
@duck.save!
|
285
|
-
@duck.changed?.should_not
|
285
|
+
@duck.changed?.should_not be_truthy
|
286
286
|
end
|
287
287
|
|
288
288
|
it "should clear changes when the parent is saved" do
|
289
289
|
@duck.name = "hi"
|
290
|
-
@duck.changed?.should
|
290
|
+
@duck.changed?.should be_truthy
|
291
291
|
@doc.save!
|
292
|
-
@duck.changed?.should_not
|
292
|
+
@duck.changed?.should_not be_truthy
|
293
293
|
end
|
294
294
|
|
295
295
|
context "with nested embedded documents" do
|
@@ -302,14 +302,14 @@ describe "Dirty" do
|
|
302
302
|
|
303
303
|
it "should track changes" do
|
304
304
|
@dong.name = "hi"
|
305
|
-
@dong.changed?.should
|
305
|
+
@dong.changed?.should be_truthy
|
306
306
|
end
|
307
307
|
|
308
308
|
it "should clear changes when the root saves" do
|
309
309
|
@dong.name = "hi"
|
310
|
-
@dong.changed?.should
|
310
|
+
@dong.changed?.should be_truthy
|
311
311
|
@doc.save!
|
312
|
-
@dong.changed?.should
|
312
|
+
@dong.changed?.should be_falsey
|
313
313
|
end
|
314
314
|
end
|
315
315
|
end
|