mongo_mapper-unstable 2010.3.8 → 2010.06.23
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.
- data/README.rdoc +4 -8
- data/bin/mmconsole +1 -1
- data/examples/keys.rb +37 -0
- data/examples/plugins.rb +41 -0
- data/examples/querying.rb +35 -0
- data/examples/scopes.rb +52 -0
- data/lib/mongo_mapper/connection.rb +83 -0
- data/lib/mongo_mapper/document.rb +11 -329
- data/lib/mongo_mapper/embedded_document.rb +9 -38
- data/lib/mongo_mapper/exceptions.rb +30 -0
- data/lib/mongo_mapper/extensions/array.rb +19 -0
- data/lib/mongo_mapper/extensions/binary.rb +22 -0
- data/lib/mongo_mapper/extensions/boolean.rb +44 -0
- data/lib/mongo_mapper/extensions/date.rb +25 -0
- data/lib/mongo_mapper/extensions/float.rb +14 -0
- data/lib/mongo_mapper/extensions/hash.rb +14 -0
- data/lib/mongo_mapper/extensions/integer.rb +19 -0
- data/lib/mongo_mapper/extensions/kernel.rb +9 -0
- data/lib/mongo_mapper/extensions/nil_class.rb +18 -0
- data/lib/mongo_mapper/extensions/object.rb +27 -0
- data/lib/mongo_mapper/extensions/object_id.rb +30 -0
- data/lib/mongo_mapper/extensions/set.rb +20 -0
- data/lib/mongo_mapper/extensions/string.rb +18 -0
- data/lib/mongo_mapper/extensions/time.rb +29 -0
- data/lib/mongo_mapper/plugins/accessible.rb +44 -0
- data/lib/mongo_mapper/plugins/associations/base.rb +7 -6
- data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +5 -6
- data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +5 -6
- data/lib/mongo_mapper/plugins/associations/collection.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +2 -1
- data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +25 -39
- data/lib/mongo_mapper/plugins/associations/many_documents_as_proxy.rb +4 -4
- data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +36 -46
- data/lib/mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +5 -4
- data/lib/mongo_mapper/plugins/associations/many_polymorphic_proxy.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb +40 -0
- data/lib/mongo_mapper/plugins/associations/one_proxy.rb +7 -7
- data/lib/mongo_mapper/plugins/associations/proxy.rb +16 -8
- data/lib/mongo_mapper/plugins/associations.rb +14 -22
- data/lib/mongo_mapper/plugins/caching.rb +21 -0
- data/lib/mongo_mapper/plugins/callbacks.rb +17 -5
- data/lib/mongo_mapper/plugins/clone.rb +10 -4
- data/lib/mongo_mapper/plugins/descendants.rb +3 -2
- data/lib/mongo_mapper/plugins/dirty.rb +1 -0
- data/lib/mongo_mapper/plugins/document.rb +41 -0
- data/lib/mongo_mapper/{support/find.rb → plugins/dynamic_querying/dynamic_finder.rb} +3 -36
- data/lib/mongo_mapper/plugins/dynamic_querying.rb +43 -0
- data/lib/mongo_mapper/plugins/embedded_document.rb +49 -0
- data/lib/mongo_mapper/plugins/equality.rb +4 -10
- data/lib/mongo_mapper/plugins/identity_map.rb +29 -23
- data/lib/mongo_mapper/plugins/indexes.rb +12 -0
- data/lib/mongo_mapper/plugins/inspect.rb +1 -0
- data/lib/mongo_mapper/plugins/keys/key.rb +55 -0
- data/lib/mongo_mapper/plugins/keys.rb +85 -110
- data/lib/mongo_mapper/plugins/logger.rb +1 -0
- data/lib/mongo_mapper/plugins/modifiers.rb +41 -16
- data/lib/mongo_mapper/plugins/pagination.rb +5 -15
- data/lib/mongo_mapper/plugins/persistence.rb +69 -0
- data/lib/mongo_mapper/plugins/protected.rb +9 -1
- data/lib/mongo_mapper/plugins/querying/decorator.rb +46 -0
- data/lib/mongo_mapper/plugins/querying/plucky_methods.rb +15 -0
- data/lib/mongo_mapper/plugins/querying.rb +176 -0
- data/lib/mongo_mapper/plugins/rails.rb +6 -1
- data/lib/mongo_mapper/plugins/safe.rb +28 -0
- data/lib/mongo_mapper/plugins/sci.rb +32 -0
- data/lib/mongo_mapper/plugins/scopes.rb +21 -0
- data/lib/mongo_mapper/plugins/serialization.rb +5 -4
- data/lib/mongo_mapper/plugins/timestamps.rb +2 -1
- data/lib/mongo_mapper/plugins/userstamps.rb +1 -0
- data/lib/mongo_mapper/plugins/validations.rb +9 -5
- data/lib/mongo_mapper/plugins.rb +1 -20
- data/lib/mongo_mapper/support/descendant_appends.rb +5 -6
- data/lib/mongo_mapper/version.rb +4 -0
- data/lib/mongo_mapper.rb +71 -128
- data/test/{NOTE_ON_TESTING → _NOTE_ON_TESTING} +0 -0
- data/test/functional/associations/test_belongs_to_polymorphic_proxy.rb +5 -5
- data/test/functional/associations/test_belongs_to_proxy.rb +13 -21
- data/test/functional/associations/test_in_array_proxy.rb +7 -9
- data/test/functional/associations/test_many_documents_as_proxy.rb +5 -5
- data/test/functional/associations/test_many_documents_proxy.rb +186 -64
- data/test/functional/associations/test_many_embedded_polymorphic_proxy.rb +22 -22
- data/test/functional/associations/test_many_embedded_proxy.rb +32 -32
- data/test/functional/associations/test_many_polymorphic_proxy.rb +47 -47
- data/test/functional/associations/test_one_embedded_proxy.rb +67 -0
- data/test/functional/associations/test_one_proxy.rb +70 -49
- data/test/functional/test_accessible.rb +168 -0
- data/test/functional/test_associations.rb +11 -11
- data/test/functional/test_binary.rb +5 -5
- data/test/functional/test_caching.rb +76 -0
- data/test/functional/test_callbacks.rb +104 -34
- data/test/functional/test_dirty.rb +16 -16
- data/test/functional/test_document.rb +12 -924
- data/test/functional/test_dynamic_querying.rb +75 -0
- data/test/functional/test_embedded_document.rb +88 -8
- data/test/functional/test_identity_map.rb +41 -43
- data/test/functional/{test_indexing.rb → test_indexes.rb} +3 -5
- data/test/functional/test_logger.rb +1 -1
- data/test/functional/test_modifiers.rb +275 -181
- data/test/functional/test_pagination.rb +13 -15
- data/test/functional/test_protected.rb +25 -11
- data/test/functional/test_querying.rb +873 -0
- data/test/functional/test_safe.rb +76 -0
- data/test/functional/test_sci.rb +230 -0
- data/test/functional/test_scopes.rb +171 -0
- data/test/functional/test_string_id_compatibility.rb +11 -11
- data/test/functional/test_timestamps.rb +0 -2
- data/test/functional/test_userstamps.rb +0 -1
- data/test/functional/test_validations.rb +44 -31
- data/test/models.rb +18 -17
- data/test/{active_model_lint_test.rb → test_active_model_lint.rb} +3 -1
- data/test/test_helper.rb +59 -16
- data/test/unit/associations/test_base.rb +47 -42
- data/test/unit/associations/test_proxy.rb +15 -15
- data/test/unit/serializers/test_json_serializer.rb +29 -29
- data/test/unit/test_clone.rb +69 -0
- data/test/unit/test_descendant_appends.rb +3 -3
- data/test/unit/test_document.rb +49 -67
- data/test/unit/test_dynamic_finder.rb +53 -51
- data/test/unit/test_embedded_document.rb +19 -38
- data/test/unit/{test_support.rb → test_extensions.rb} +136 -122
- data/test/unit/test_key.rb +185 -0
- data/test/unit/test_keys.rb +29 -147
- data/test/unit/test_mongo_mapper.rb +3 -48
- data/test/unit/test_pagination.rb +1 -150
- data/test/unit/test_rails.rb +77 -19
- data/test/unit/test_rails_compatibility.rb +12 -12
- data/test/unit/test_serialization.rb +5 -5
- data/test/unit/test_time_zones.rb +9 -9
- data/test/unit/test_validations.rb +46 -46
- metadata +157 -155
- data/.gitignore +0 -10
- data/Rakefile +0 -55
- data/VERSION +0 -1
- data/lib/mongo_mapper/plugins/pagination/proxy.rb +0 -72
- data/lib/mongo_mapper/query.rb +0 -130
- data/lib/mongo_mapper/support.rb +0 -215
- data/mongo_mapper.gemspec +0 -196
- data/performance/read_write.rb +0 -52
- data/specs.watchr +0 -51
- data/test/support/custom_matchers.rb +0 -55
- data/test/support/timing.rb +0 -16
- data/test/unit/test_query.rb +0 -340
@@ -9,7 +9,7 @@ class SerializationTest < Test::Unit::TestCase
|
|
9
9
|
key :preferences, Hash
|
10
10
|
key :created_at, Time
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
@instance = @document.new(
|
14
14
|
:name => 'John Doe',
|
15
15
|
:age => 25,
|
@@ -18,7 +18,7 @@ class SerializationTest < Test::Unit::TestCase
|
|
18
18
|
:created_at => Time.now.change(:usec => 0)
|
19
19
|
)
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
[:json].each do |format|
|
23
23
|
context format do
|
24
24
|
should "be reversable" do
|
@@ -27,7 +27,7 @@ class SerializationTest < Test::Unit::TestCase
|
|
27
27
|
|
28
28
|
assert_equal @instance, unserialized
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
should "allow attribute only filtering" do
|
32
32
|
serialized = @instance.send("to_#{format}", :only => [ :age, :name ])
|
33
33
|
unserialized = @document.send("from_#{format}", serialized)
|
@@ -37,11 +37,11 @@ class SerializationTest < Test::Unit::TestCase
|
|
37
37
|
assert ! unserialized.awesome
|
38
38
|
assert_nil unserialized.created_at
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
should "allow attribute except filtering" do
|
42
42
|
serialized = @instance.send("to_#{format}", :except => [ :age, :name ])
|
43
43
|
unserialized = @document.send("from_#{format}", serialized)
|
44
|
-
|
44
|
+
|
45
45
|
assert_nil unserialized.name
|
46
46
|
assert_nil unserialized.age
|
47
47
|
assert_equal @instance.awesome, unserialized.awesome
|
@@ -2,37 +2,37 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
class TimeZonesTest < Test::Unit::TestCase
|
4
4
|
context "An instance of an embedded document" do
|
5
|
-
setup do
|
5
|
+
setup do
|
6
6
|
@document = EDoc do
|
7
7
|
key :name, String
|
8
8
|
key :created_at, Time
|
9
9
|
end
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
should "work without Time.zone" do
|
13
13
|
Time.zone = nil
|
14
|
-
|
14
|
+
|
15
15
|
doc = @document.new(:created_at => "2009-08-15 14:00:00")
|
16
16
|
doc.created_at.should == Time.local(2009, 8, 15, 14, 0, 0).utc
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
should "work with Time.zone set to the (default) UTC" do
|
20
20
|
Time.zone = 'UTC'
|
21
|
-
|
21
|
+
|
22
22
|
doc = @document.new(:created_at => "2009-08-15 14:00:00")
|
23
23
|
doc.created_at.is_a?(ActiveSupport::TimeWithZone).should be_true
|
24
24
|
doc.created_at.should == Time.utc(2009, 8, 15, 14)
|
25
|
-
|
25
|
+
|
26
26
|
Time.zone = nil
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
should "work with timezones that are not UTC" do
|
30
30
|
Time.zone = 'Hawaii'
|
31
|
-
|
31
|
+
|
32
32
|
doc = @document.new(:created_at => "2009-08-15 14:00:00")
|
33
33
|
doc.created_at.is_a?(ActiveSupport::TimeWithZone).should be_true
|
34
34
|
doc.created_at.should == Time.utc(2009, 8, 16)
|
35
|
-
|
35
|
+
|
36
36
|
Time.zone = nil
|
37
37
|
end
|
38
38
|
end
|
@@ -153,7 +153,7 @@ class ValidationsTest < Test::Unit::TestCase
|
|
153
153
|
doc.should have_error_on(:name)
|
154
154
|
end
|
155
155
|
end
|
156
|
-
|
156
|
+
|
157
157
|
context "validating exclusion of" do
|
158
158
|
should "throw error if enumerator not provided" do
|
159
159
|
@document.key :action, String
|
@@ -161,30 +161,30 @@ class ValidationsTest < Test::Unit::TestCase
|
|
161
161
|
@document.validates_exclusion_of :action
|
162
162
|
}.should raise_error(ArgumentError)
|
163
163
|
end
|
164
|
-
|
164
|
+
|
165
165
|
should "work with validates_exclusion_of macro" do
|
166
166
|
@document.key :action, String
|
167
167
|
@document.validates_exclusion_of :action, :within => %w(kick run)
|
168
|
-
|
168
|
+
|
169
169
|
doc = @document.new
|
170
170
|
doc.should_not have_error_on(:action)
|
171
|
-
|
171
|
+
|
172
172
|
doc.action = 'fart'
|
173
173
|
doc.should_not have_error_on(:action)
|
174
|
-
|
174
|
+
|
175
175
|
doc.action = 'kick'
|
176
176
|
doc.should have_error_on(:action, 'is reserved')
|
177
177
|
end
|
178
178
|
|
179
179
|
should "work with :not_in shortcut on key definition" do
|
180
180
|
@document.key :action, String, :not_in => %w(kick run)
|
181
|
-
|
181
|
+
|
182
182
|
doc = @document.new
|
183
183
|
doc.should_not have_error_on(:action)
|
184
|
-
|
184
|
+
|
185
185
|
doc.action = 'fart'
|
186
186
|
doc.should_not have_error_on(:action)
|
187
|
-
|
187
|
+
|
188
188
|
doc.action = 'kick'
|
189
189
|
doc.should have_error_on(:action, 'is reserved')
|
190
190
|
end
|
@@ -192,7 +192,7 @@ class ValidationsTest < Test::Unit::TestCase
|
|
192
192
|
should "not have error if allow nil is true and value is nil" do
|
193
193
|
@document.key :action, String
|
194
194
|
@document.validates_exclusion_of :action, :within => %w(kick run), :allow_nil => true
|
195
|
-
|
195
|
+
|
196
196
|
doc = @document.new
|
197
197
|
doc.should_not have_error_on(:action)
|
198
198
|
end
|
@@ -200,7 +200,7 @@ class ValidationsTest < Test::Unit::TestCase
|
|
200
200
|
should "not have error if allow blank is true and value is blank" do
|
201
201
|
@document.key :action, String
|
202
202
|
@document.validates_exclusion_of :action, :within => %w(kick run), :allow_nil => true
|
203
|
-
|
203
|
+
|
204
204
|
doc = @document.new(:action => '')
|
205
205
|
doc.should_not have_error_on(:action)
|
206
206
|
end
|
@@ -213,53 +213,53 @@ class ValidationsTest < Test::Unit::TestCase
|
|
213
213
|
@document.validates_inclusion_of :action
|
214
214
|
}.should raise_error(ArgumentError)
|
215
215
|
end
|
216
|
-
|
216
|
+
|
217
217
|
should "work with validates_inclusion_of macro" do
|
218
218
|
@document.key :action, String
|
219
219
|
@document.validates_inclusion_of :action, :within => %w(kick run)
|
220
|
-
|
220
|
+
|
221
221
|
doc = @document.new
|
222
222
|
doc.should have_error_on(:action, 'is not in the list')
|
223
|
-
|
223
|
+
|
224
224
|
doc.action = 'fart'
|
225
225
|
doc.should have_error_on(:action, 'is not in the list')
|
226
|
-
|
226
|
+
|
227
227
|
doc.action = 'kick'
|
228
228
|
doc.should_not have_error_on(:action)
|
229
229
|
end
|
230
230
|
|
231
231
|
should "work with :in shortcut on key definition" do
|
232
232
|
@document.key :action, String, :in => %w(kick run)
|
233
|
-
|
233
|
+
|
234
234
|
doc = @document.new
|
235
235
|
doc.should have_error_on(:action, 'is not in the list')
|
236
|
-
|
236
|
+
|
237
237
|
doc.action = 'fart'
|
238
238
|
doc.should have_error_on(:action, 'is not in the list')
|
239
|
-
|
239
|
+
|
240
240
|
doc.action = 'kick'
|
241
241
|
doc.should_not have_error_on(:action)
|
242
242
|
end
|
243
|
-
|
243
|
+
|
244
244
|
should "not have error if allow nil is true and value is nil" do
|
245
245
|
@document.key :action, String
|
246
246
|
@document.validates_inclusion_of :action, :within => %w(kick run), :allow_nil => true
|
247
|
-
|
247
|
+
|
248
248
|
doc = @document.new
|
249
249
|
doc.should_not have_error_on(:action)
|
250
250
|
end
|
251
|
-
|
251
|
+
|
252
252
|
should "not have error if allow blank is true and value is blank" do
|
253
253
|
@document.key :action, String
|
254
254
|
@document.validates_inclusion_of :action, :within => %w(kick run), :allow_blank => true
|
255
|
-
|
255
|
+
|
256
256
|
doc = @document.new(:action => '')
|
257
257
|
doc.should_not have_error_on(:action)
|
258
258
|
end
|
259
259
|
end
|
260
|
-
|
260
|
+
|
261
261
|
end # End on a Document
|
262
|
-
|
262
|
+
|
263
263
|
context "On an EmbeddedDocument" do
|
264
264
|
setup do
|
265
265
|
@embedded_doc = EDoc()
|
@@ -411,7 +411,7 @@ class ValidationsTest < Test::Unit::TestCase
|
|
411
411
|
doc.should have_error_on(:name)
|
412
412
|
end
|
413
413
|
end
|
414
|
-
|
414
|
+
|
415
415
|
context "validating exclusion of" do
|
416
416
|
should "throw error if enumerator not provided" do
|
417
417
|
@embedded_doc.key :action, String
|
@@ -419,38 +419,38 @@ class ValidationsTest < Test::Unit::TestCase
|
|
419
419
|
@embedded_doc.validates_exclusion_of :action
|
420
420
|
}.should raise_error(ArgumentError)
|
421
421
|
end
|
422
|
-
|
422
|
+
|
423
423
|
should "work with validates_exclusion_of macro" do
|
424
424
|
@embedded_doc.key :action, String
|
425
425
|
@embedded_doc.validates_exclusion_of :action, :within => %w(kick run)
|
426
|
-
|
426
|
+
|
427
427
|
doc = @embedded_doc.new
|
428
428
|
doc.should_not have_error_on(:action)
|
429
|
-
|
429
|
+
|
430
430
|
doc.action = 'fart'
|
431
431
|
doc.should_not have_error_on(:action)
|
432
|
-
|
432
|
+
|
433
433
|
doc.action = 'kick'
|
434
434
|
doc.should have_error_on(:action, 'is reserved')
|
435
435
|
end
|
436
436
|
|
437
437
|
should "work with :not_in shortcut on key definition" do
|
438
438
|
@embedded_doc.key :action, String, :not_in => %w(kick run)
|
439
|
-
|
439
|
+
|
440
440
|
doc = @embedded_doc.new
|
441
441
|
doc.should_not have_error_on(:action)
|
442
|
-
|
442
|
+
|
443
443
|
doc.action = 'fart'
|
444
444
|
doc.should_not have_error_on(:action)
|
445
|
-
|
445
|
+
|
446
446
|
doc.action = 'kick'
|
447
447
|
doc.should have_error_on(:action, 'is reserved')
|
448
448
|
end
|
449
|
-
|
449
|
+
|
450
450
|
should "not have error if allow nil is true and value is nil" do
|
451
451
|
@embedded_doc.key :action, String
|
452
452
|
@embedded_doc.validates_exclusion_of :action, :within => %w(kick run), :allow_nil => true
|
453
|
-
|
453
|
+
|
454
454
|
doc = @embedded_doc.new
|
455
455
|
doc.should_not have_error_on(:action)
|
456
456
|
end
|
@@ -458,7 +458,7 @@ class ValidationsTest < Test::Unit::TestCase
|
|
458
458
|
should "not have error if allow blank is true and value is blank" do
|
459
459
|
@embedded_doc.key :action, String
|
460
460
|
@embedded_doc.validates_exclusion_of :action, :within => %w(kick run), :allow_nil => true
|
461
|
-
|
461
|
+
|
462
462
|
doc = @embedded_doc.new(:action => '')
|
463
463
|
doc.should_not have_error_on(:action)
|
464
464
|
end
|
@@ -471,30 +471,30 @@ class ValidationsTest < Test::Unit::TestCase
|
|
471
471
|
@embedded_doc.validates_inclusion_of :action
|
472
472
|
}.should raise_error(ArgumentError)
|
473
473
|
end
|
474
|
-
|
474
|
+
|
475
475
|
should "work with validates_inclusion_of macro" do
|
476
476
|
@embedded_doc.key :action, String
|
477
477
|
@embedded_doc.validates_inclusion_of :action, :within => %w(kick run)
|
478
|
-
|
478
|
+
|
479
479
|
doc = @embedded_doc.new
|
480
480
|
doc.should have_error_on(:action, 'is not in the list')
|
481
|
-
|
481
|
+
|
482
482
|
doc.action = 'fart'
|
483
483
|
doc.should have_error_on(:action, 'is not in the list')
|
484
|
-
|
484
|
+
|
485
485
|
doc.action = 'kick'
|
486
486
|
doc.should_not have_error_on(:action)
|
487
487
|
end
|
488
488
|
|
489
489
|
should "work with :in shortcut on key definition" do
|
490
490
|
@embedded_doc.key :action, String, :in => %w(kick run)
|
491
|
-
|
491
|
+
|
492
492
|
doc = @embedded_doc.new
|
493
493
|
doc.should have_error_on(:action, 'is not in the list')
|
494
|
-
|
494
|
+
|
495
495
|
doc.action = 'fart'
|
496
496
|
doc.should have_error_on(:action, 'is not in the list')
|
497
|
-
|
497
|
+
|
498
498
|
doc.action = 'kick'
|
499
499
|
doc.should_not have_error_on(:action)
|
500
500
|
end
|
@@ -502,24 +502,24 @@ class ValidationsTest < Test::Unit::TestCase
|
|
502
502
|
should "not have error if allow nil is true and value is nil" do
|
503
503
|
@embedded_doc.key :action, String
|
504
504
|
@embedded_doc.validates_inclusion_of :action, :within => %w(kick run), :allow_nil => true
|
505
|
-
|
505
|
+
|
506
506
|
doc = @embedded_doc.new
|
507
507
|
doc.should_not have_error_on(:action)
|
508
508
|
end
|
509
|
-
|
509
|
+
|
510
510
|
should "not have error if allow blank is true and value is blank" do
|
511
511
|
@embedded_doc.key :action, String
|
512
512
|
@embedded_doc.validates_inclusion_of :action, :within => %w(kick run), :allow_blank => true
|
513
|
-
|
513
|
+
|
514
514
|
doc = @embedded_doc.new(:action => '')
|
515
515
|
doc.should_not have_error_on(:action)
|
516
516
|
end
|
517
517
|
end
|
518
518
|
|
519
519
|
end # End on an EmbeddedDocument
|
520
|
-
|
520
|
+
|
521
521
|
end # Validations
|
522
|
-
|
522
|
+
|
523
523
|
context "Adding validation errors" do
|
524
524
|
setup do
|
525
525
|
@document = Doc do
|