vizjerai-validatable 1.8.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.
- data/README.rdoc +118 -0
- data/Rakefile +54 -0
- data/VERSION.yml +4 -0
- data/lib/child_validation.rb +15 -0
- data/lib/errors.rb +88 -0
- data/lib/included_validation.rb +9 -0
- data/lib/macros.rb +304 -0
- data/lib/object_extension.rb +21 -0
- data/lib/requireable.rb +26 -0
- data/lib/understandable.rb +31 -0
- data/lib/validatable.rb +23 -0
- data/lib/validatable_class_methods.rb +85 -0
- data/lib/validatable_instance_methods.rb +106 -0
- data/lib/validations/validates_acceptance_of.rb +14 -0
- data/lib/validations/validates_confirmation_of.rb +23 -0
- data/lib/validations/validates_each.rb +14 -0
- data/lib/validations/validates_format_of.rb +16 -0
- data/lib/validations/validates_inclusion_of.rb +25 -0
- data/lib/validations/validates_length_of.rb +30 -0
- data/lib/validations/validates_numericality_of.rb +27 -0
- data/lib/validations/validates_presence_of.rb +17 -0
- data/lib/validations/validates_true_for.rb +13 -0
- data/lib/validations/validation_base.rb +86 -0
- data/test/all_tests.rb +1 -0
- data/test/functional/test_validatable.rb +437 -0
- data/test/functional/test_validates_acceptance_of.rb +16 -0
- data/test/functional/test_validates_confirmation_of.rb +56 -0
- data/test/functional/test_validates_each.rb +14 -0
- data/test/functional/test_validates_format_of.rb +34 -0
- data/test/functional/test_validates_inclusion_of.rb +53 -0
- data/test/functional/test_validates_length_of.rb +64 -0
- data/test/functional/test_validates_numericality_of.rb +57 -0
- data/test/functional/test_validates_presence_of.rb +16 -0
- data/test/functional/test_validates_true_for.rb +27 -0
- data/test/test_helper.rb +33 -0
- data/test/unit/test_errors.rb +64 -0
- data/test/unit/test_understandable.rb +19 -0
- data/test/unit/test_validatable.rb +38 -0
- data/test/unit/test_validates_acceptance_of.rb +45 -0
- data/test/unit/test_validates_confirmation_of.rb +76 -0
- data/test/unit/test_validates_format_of.rb +44 -0
- data/test/unit/test_validates_inclusion_of.rb +35 -0
- data/test/unit/test_validates_length_of.rb +80 -0
- data/test/unit/test_validates_numericality_of.rb +76 -0
- data/test/unit/test_validates_presence_of.rb +35 -0
- data/test/unit/test_validates_true_for.rb +29 -0
- data/test/unit/test_validation_base.rb +52 -0
- metadata +123 -0
@@ -0,0 +1,437 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
|
+
|
3
|
+
functional_tests do
|
4
|
+
|
5
|
+
expect "can't be empty" do
|
6
|
+
child_class = Module.new do
|
7
|
+
include Validatable
|
8
|
+
validates_presence_of :name
|
9
|
+
end
|
10
|
+
klass = Class.new do
|
11
|
+
include Validatable
|
12
|
+
include_validations_from :child
|
13
|
+
define_method :child do
|
14
|
+
child_class
|
15
|
+
end
|
16
|
+
attr_accessor :name
|
17
|
+
end
|
18
|
+
instance = klass.new
|
19
|
+
instance.valid?
|
20
|
+
instance.errors.on(:name)
|
21
|
+
end
|
22
|
+
|
23
|
+
expect "can't be empty" do
|
24
|
+
child_class = Module.new do
|
25
|
+
include Validatable
|
26
|
+
validates_presence_of :name
|
27
|
+
end
|
28
|
+
klass = Class.new do
|
29
|
+
include Validatable
|
30
|
+
validates_presence_of :address
|
31
|
+
include_validations_from :child
|
32
|
+
define_method :child do
|
33
|
+
child_class
|
34
|
+
end
|
35
|
+
attr_accessor :name, :address
|
36
|
+
end
|
37
|
+
instance = klass.new
|
38
|
+
instance.valid?
|
39
|
+
instance.errors.on(:address)
|
40
|
+
end
|
41
|
+
|
42
|
+
expect :is_set do
|
43
|
+
klass = Class.new do
|
44
|
+
include Validatable
|
45
|
+
attr_accessor :result
|
46
|
+
before_validation do
|
47
|
+
self.result = :is_set
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
instance = klass.new
|
52
|
+
instance.valid?
|
53
|
+
instance.result
|
54
|
+
end
|
55
|
+
|
56
|
+
expect :is_set do
|
57
|
+
klass = Class.new do
|
58
|
+
include Validatable
|
59
|
+
attr_accessor :name, :result
|
60
|
+
validates_presence_of :name, :after_validate => lambda { |result, attribute| self.result = :is_set }
|
61
|
+
end
|
62
|
+
|
63
|
+
instance = klass.new
|
64
|
+
instance.valid?
|
65
|
+
instance.result
|
66
|
+
end
|
67
|
+
|
68
|
+
expect false do
|
69
|
+
klass = Class.new do
|
70
|
+
include Validatable
|
71
|
+
attr_accessor :name
|
72
|
+
validates_presence_of :name
|
73
|
+
end
|
74
|
+
subclass = Class.new klass do
|
75
|
+
end
|
76
|
+
subsubclass = Class.new subclass do
|
77
|
+
end
|
78
|
+
subsubclass.new.valid?
|
79
|
+
end
|
80
|
+
|
81
|
+
expect false do
|
82
|
+
klass = Class.new do
|
83
|
+
include Validatable
|
84
|
+
attr_accessor :name
|
85
|
+
validates_presence_of :name
|
86
|
+
end
|
87
|
+
subclass = Class.new klass do
|
88
|
+
end
|
89
|
+
subclass.new.valid?
|
90
|
+
end
|
91
|
+
|
92
|
+
expect true do
|
93
|
+
klass = Class.new do
|
94
|
+
include Validatable
|
95
|
+
attr_accessor :name
|
96
|
+
validates_presence_of :name
|
97
|
+
end
|
98
|
+
subclass = Class.new klass do
|
99
|
+
end
|
100
|
+
instance = subclass.new
|
101
|
+
instance.name = 'a name'
|
102
|
+
instance.valid?
|
103
|
+
end
|
104
|
+
|
105
|
+
expect ArgumentError do
|
106
|
+
Class.new do
|
107
|
+
include Validatable
|
108
|
+
attr_accessor :name
|
109
|
+
validates_presence_of :name, :times => 1
|
110
|
+
validates_presence_of :name, :times => 1
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
expect ArgumentError do
|
115
|
+
Class.new do
|
116
|
+
include Validatable
|
117
|
+
attr_accessor :name
|
118
|
+
validates_presence_of :name, :times => 1, :key => 'anything'
|
119
|
+
validates_presence_of :name, :times => 1, :key => 'anything'
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
expect "is invalid" do
|
124
|
+
child_class = Class.new do
|
125
|
+
include Validatable
|
126
|
+
attr_accessor :name, :address
|
127
|
+
validates_presence_of :name
|
128
|
+
validates_format_of :address, :with => /.+/
|
129
|
+
end
|
130
|
+
klass = Class.new do
|
131
|
+
include Validatable
|
132
|
+
include_errors_from :child
|
133
|
+
define_method :child do
|
134
|
+
child_class.new
|
135
|
+
end
|
136
|
+
end
|
137
|
+
instance = klass.new
|
138
|
+
instance.valid?
|
139
|
+
instance.errors.on(:address)
|
140
|
+
end
|
141
|
+
|
142
|
+
expect "can't be empty" do
|
143
|
+
child_class = Class.new do
|
144
|
+
include Validatable
|
145
|
+
attr_accessor :name, :address
|
146
|
+
validates_presence_of :name
|
147
|
+
validates_format_of :address, :with => /.+/
|
148
|
+
end
|
149
|
+
klass = Class.new do
|
150
|
+
include Validatable
|
151
|
+
include_errors_from :child
|
152
|
+
define_method :child do
|
153
|
+
child_class.new
|
154
|
+
end
|
155
|
+
end
|
156
|
+
instance = klass.new
|
157
|
+
instance.valid?
|
158
|
+
instance.errors.on(:name)
|
159
|
+
end
|
160
|
+
|
161
|
+
|
162
|
+
test "when child validations have errors, level 2 and higher parent validations are not performed" do
|
163
|
+
child_class = Class.new do
|
164
|
+
include Validatable
|
165
|
+
attr_accessor :name
|
166
|
+
validates_presence_of :name
|
167
|
+
end
|
168
|
+
|
169
|
+
klass = Class.new do
|
170
|
+
include Validatable
|
171
|
+
extend Forwardable
|
172
|
+
def_delegator :child, :name
|
173
|
+
validates_true_for :name, :logic => lambda { false }, :level => 2, :message => "invalid message"
|
174
|
+
include_errors_from :child
|
175
|
+
define_method :child do
|
176
|
+
@child ||= child_class.new
|
177
|
+
end
|
178
|
+
end
|
179
|
+
instance = klass.new
|
180
|
+
instance.valid?
|
181
|
+
assert_equal "can't be empty", instance.errors.on(:name)
|
182
|
+
end
|
183
|
+
|
184
|
+
test "when child validations have errors, level 1 parent validations are still performed" do
|
185
|
+
child_class = Class.new do
|
186
|
+
include Validatable
|
187
|
+
attr_accessor :name
|
188
|
+
validates_presence_of :name
|
189
|
+
end
|
190
|
+
|
191
|
+
klass = Class.new do
|
192
|
+
include Validatable
|
193
|
+
validates_true_for :address, :logic => lambda { false }, :level => 1, :message => "invalid message"
|
194
|
+
include_errors_from :child
|
195
|
+
define_method :child do
|
196
|
+
@child ||= child_class.new
|
197
|
+
end
|
198
|
+
|
199
|
+
end
|
200
|
+
instance = klass.new
|
201
|
+
instance.valid?
|
202
|
+
assert_equal "can't be empty", instance.errors.on(:name)
|
203
|
+
assert_equal "invalid message", instance.errors.on(:address)
|
204
|
+
end
|
205
|
+
|
206
|
+
expect "can't be empty" do
|
207
|
+
child_class = Class.new do
|
208
|
+
include Validatable
|
209
|
+
attr_accessor :name, :address
|
210
|
+
validates_presence_of :name
|
211
|
+
end
|
212
|
+
klass = Class.new do
|
213
|
+
include Validatable
|
214
|
+
include_errors_from :child, :map => {:name => :namen}
|
215
|
+
define_method :child do
|
216
|
+
child_class.new
|
217
|
+
end
|
218
|
+
end
|
219
|
+
instance = klass.new
|
220
|
+
instance.valid?
|
221
|
+
instance.errors.on(:namen)
|
222
|
+
end
|
223
|
+
|
224
|
+
expect "can't be empty" do
|
225
|
+
child_class = Class.new do
|
226
|
+
include Validatable
|
227
|
+
attr_accessor :name, :address
|
228
|
+
validates_presence_of :name
|
229
|
+
end
|
230
|
+
klass = Class.new do
|
231
|
+
include Validatable
|
232
|
+
include_errors_from :child, :if => lambda { true }
|
233
|
+
define_method :child do
|
234
|
+
child_class.new
|
235
|
+
end
|
236
|
+
end
|
237
|
+
instance = klass.new
|
238
|
+
instance.valid?
|
239
|
+
instance.errors.on(:name)
|
240
|
+
end
|
241
|
+
|
242
|
+
expect true do
|
243
|
+
child_class = Class.new do
|
244
|
+
include Validatable
|
245
|
+
attr_accessor :name, :address
|
246
|
+
validates_presence_of :name
|
247
|
+
end
|
248
|
+
klass = Class.new do
|
249
|
+
include Validatable
|
250
|
+
include_errors_from :child, :if => lambda { false }
|
251
|
+
define_method :child do
|
252
|
+
child_class.new
|
253
|
+
end
|
254
|
+
end
|
255
|
+
instance = klass.new
|
256
|
+
instance.valid?
|
257
|
+
end
|
258
|
+
|
259
|
+
test "classes only have valid_for_* methods for groups that appear in their validations" do
|
260
|
+
class_with_group_one = Class.new do
|
261
|
+
include Validatable
|
262
|
+
validates_presence_of :name, :groups => :group_one
|
263
|
+
attr_accessor :name
|
264
|
+
end
|
265
|
+
class_with_group_two = Class.new do
|
266
|
+
include Validatable
|
267
|
+
validates_presence_of :name, :groups => :group_two
|
268
|
+
attr_accessor :name
|
269
|
+
end
|
270
|
+
assert_equal false, class_with_group_one.public_instance_methods.include?(:valid_for_group_two?)
|
271
|
+
assert_equal false, class_with_group_two.public_instance_methods.include?(:valid_for_group_one?)
|
272
|
+
end
|
273
|
+
|
274
|
+
test "nonmatching groups are not used as validations" do
|
275
|
+
klass = Class.new do
|
276
|
+
include Validatable
|
277
|
+
validates_presence_of :name, :groups => :group_one
|
278
|
+
validates_presence_of :address, :groups => :group_two
|
279
|
+
attr_accessor :name, :address
|
280
|
+
end
|
281
|
+
instance = klass.new
|
282
|
+
assert_equal nil, instance.errors.on(:name)
|
283
|
+
end
|
284
|
+
|
285
|
+
expect "can't be empty twice changed message" do
|
286
|
+
klass = Class.new do
|
287
|
+
include Validatable
|
288
|
+
validates_presence_of :name
|
289
|
+
attr_accessor :name
|
290
|
+
end
|
291
|
+
|
292
|
+
Validatable::ValidationBase.class_eval do
|
293
|
+
after_validate do |result, instance, attribute|
|
294
|
+
instance.errors.add(attribute, " changed message")
|
295
|
+
end
|
296
|
+
end
|
297
|
+
Validatable::ValidatesPresenceOf.class_eval do
|
298
|
+
after_validate do |result, instance, attribute|
|
299
|
+
instance.errors.add(attribute, " twice")
|
300
|
+
end
|
301
|
+
end
|
302
|
+
instance = klass.new
|
303
|
+
instance.valid?
|
304
|
+
Validatable::ValidatesPresenceOf.after_validations.clear
|
305
|
+
Validatable::ValidationBase.after_validations.clear
|
306
|
+
instance.errors.on(:name).join
|
307
|
+
end
|
308
|
+
|
309
|
+
expect false do
|
310
|
+
klass = Class.new do
|
311
|
+
include Validatable
|
312
|
+
validates_presence_of :name, :groups => :group_one
|
313
|
+
attr_accessor :name
|
314
|
+
end
|
315
|
+
instance = klass.new
|
316
|
+
instance.valid_for_group_one?
|
317
|
+
end
|
318
|
+
|
319
|
+
expect false do
|
320
|
+
klass = Class.new do
|
321
|
+
include Validatable
|
322
|
+
validates_presence_of :name, :groups => [:group_one, :group_two]
|
323
|
+
attr_accessor :name
|
324
|
+
end
|
325
|
+
instance = klass.new
|
326
|
+
instance.valid_for_group_one?
|
327
|
+
end
|
328
|
+
|
329
|
+
expect true do
|
330
|
+
klass = Class.new do
|
331
|
+
include Validatable
|
332
|
+
validates_presence_of :name, :groups => :group_one
|
333
|
+
validates_presence_of :address
|
334
|
+
attr_accessor :name, :address
|
335
|
+
end
|
336
|
+
instance = klass.new
|
337
|
+
instance.address = 'anything'
|
338
|
+
instance.valid?
|
339
|
+
end
|
340
|
+
|
341
|
+
expect true do
|
342
|
+
klass = Class.new do
|
343
|
+
include Validatable
|
344
|
+
validates_presence_of :name, :groups => :group_one
|
345
|
+
attr_accessor :name
|
346
|
+
end
|
347
|
+
instance = klass.new
|
348
|
+
instance.valid?
|
349
|
+
end
|
350
|
+
|
351
|
+
expect true do
|
352
|
+
klass = Class.new do
|
353
|
+
include Validatable
|
354
|
+
validates_presence_of :name, :times => 1
|
355
|
+
attr_accessor :name
|
356
|
+
end
|
357
|
+
instance = klass.new
|
358
|
+
instance.valid?
|
359
|
+
instance.valid?
|
360
|
+
end
|
361
|
+
|
362
|
+
expect false do
|
363
|
+
klass = Class.new do
|
364
|
+
include Validatable
|
365
|
+
validates_presence_of :name, :times => 1
|
366
|
+
attr_accessor :name
|
367
|
+
end
|
368
|
+
instance1 = klass.new
|
369
|
+
instance1.valid?
|
370
|
+
instance2 = klass.new
|
371
|
+
instance2.valid?
|
372
|
+
end
|
373
|
+
|
374
|
+
expect "name message" do
|
375
|
+
klass = Class.new do
|
376
|
+
include Validatable
|
377
|
+
validates_presence_of :name, :level => 1, :message => "name message"
|
378
|
+
validates_presence_of :address, :level => 2
|
379
|
+
attr_accessor :name, :address
|
380
|
+
end
|
381
|
+
instance = klass.new
|
382
|
+
instance.valid?
|
383
|
+
instance.errors.on(:name)
|
384
|
+
end
|
385
|
+
|
386
|
+
expect nil do
|
387
|
+
klass = Class.new do
|
388
|
+
include Validatable
|
389
|
+
validates_presence_of :name, :level => 1, :message => "name message"
|
390
|
+
validates_presence_of :address, :level => 2
|
391
|
+
attr_accessor :name, :address
|
392
|
+
end
|
393
|
+
instance = klass.new
|
394
|
+
instance.valid?
|
395
|
+
instance.errors.on(:address)
|
396
|
+
end
|
397
|
+
|
398
|
+
expect "Mod::Klass/Validatable::ValidatesPresenceOf/name" do
|
399
|
+
module Mod
|
400
|
+
class Klass
|
401
|
+
include Validatable
|
402
|
+
validates_presence_of :name
|
403
|
+
end
|
404
|
+
end
|
405
|
+
Mod::Klass.validations.first.key
|
406
|
+
end
|
407
|
+
|
408
|
+
expect "/Validatable::ValidatesPresenceOf/custom key" do
|
409
|
+
klass = Class.new do
|
410
|
+
include Validatable
|
411
|
+
validates_presence_of :name, :key => "custom key"
|
412
|
+
end
|
413
|
+
klass.validations.first.key
|
414
|
+
end
|
415
|
+
|
416
|
+
expect "can't be empty" do
|
417
|
+
klass = Class.new do
|
418
|
+
include Validatable
|
419
|
+
validates_presence_of :name, :address
|
420
|
+
attr_accessor :name, :address
|
421
|
+
end
|
422
|
+
instance = klass.new
|
423
|
+
instance.validate_only("presence_of/name")
|
424
|
+
instance.errors.on(:name)
|
425
|
+
end
|
426
|
+
|
427
|
+
expect nil do
|
428
|
+
klass = Class.new do
|
429
|
+
include Validatable
|
430
|
+
validates_presence_of :name, :address
|
431
|
+
attr_accessor :name, :address
|
432
|
+
end
|
433
|
+
instance = klass.new
|
434
|
+
instance.validate_only("presence_of/name")
|
435
|
+
instance.errors.on(:address)
|
436
|
+
end
|
437
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
|
+
|
3
|
+
module Functional
|
4
|
+
class ValidatesAcceptanceOfTest < Test::Unit::TestCase
|
5
|
+
test "given no acceptance, when validated, then error is in the objects error collection" do
|
6
|
+
klass = Class.new do
|
7
|
+
include Validatable
|
8
|
+
attr_accessor :name
|
9
|
+
validates_acceptance_of :name
|
10
|
+
end
|
11
|
+
instance = klass.new
|
12
|
+
instance.valid?
|
13
|
+
assert_equal "must be accepted", instance.errors.on(:name)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
|
+
|
3
|
+
module Functional
|
4
|
+
class ValidatesConfirmationOfTest < Test::Unit::TestCase
|
5
|
+
test "given non matching attributes, when validated, then error is in the objects error collection" do
|
6
|
+
klass = Class.new do
|
7
|
+
include Validatable
|
8
|
+
attr_accessor :name
|
9
|
+
validates_confirmation_of :name
|
10
|
+
end
|
11
|
+
instance = klass.new
|
12
|
+
instance.name = "foo"
|
13
|
+
instance.name_confirmation = "bar"
|
14
|
+
instance.valid?
|
15
|
+
assert_equal "doesn't match confirmation", instance.errors.on(:name)
|
16
|
+
end
|
17
|
+
|
18
|
+
test "given matching attributes, when validated, then no error is in the objects error collection" do
|
19
|
+
klass = Class.new do
|
20
|
+
include Validatable
|
21
|
+
attr_accessor :name
|
22
|
+
validates_confirmation_of :name
|
23
|
+
end
|
24
|
+
instance = klass.new
|
25
|
+
instance.name = "foo"
|
26
|
+
instance.name_confirmation = "foo"
|
27
|
+
assert_equal true, instance.valid?
|
28
|
+
end
|
29
|
+
|
30
|
+
test "given matching attributes of different case, when validated with case sensitive false, then no error is in the objects error collection" do
|
31
|
+
klass = Class.new do
|
32
|
+
include Validatable
|
33
|
+
attr_accessor :name
|
34
|
+
validates_confirmation_of :name, :case_sensitive => false
|
35
|
+
end
|
36
|
+
instance = klass.new
|
37
|
+
instance.name = "foo"
|
38
|
+
instance.name_confirmation = "FOO"
|
39
|
+
assert_equal true, instance.valid?
|
40
|
+
end
|
41
|
+
|
42
|
+
test "given matching attributes of different case, when validated with case sensitive true, then error is in the objects error collection" do
|
43
|
+
klass = Class.new do
|
44
|
+
include Validatable
|
45
|
+
attr_accessor :name
|
46
|
+
validates_confirmation_of :name
|
47
|
+
end
|
48
|
+
instance = klass.new
|
49
|
+
instance.name = "foo"
|
50
|
+
instance.name_confirmation = "FOO"
|
51
|
+
assert_equal false, instance.valid?
|
52
|
+
assert_equal "doesn't match confirmation", instance.errors.on(:name)
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
|
+
|
3
|
+
functional_tests do
|
4
|
+
expect :is_set do
|
5
|
+
klass = Class.new do
|
6
|
+
include Validatable
|
7
|
+
attr_accessor :name, :result
|
8
|
+
validates_each :name, :logic => lambda { @result = :is_set }
|
9
|
+
end
|
10
|
+
instance = klass.new
|
11
|
+
instance.valid?
|
12
|
+
instance.result
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
|
+
|
3
|
+
module Functional
|
4
|
+
class ValidatesFormatOfTest < Test::Unit::TestCase
|
5
|
+
test "given invalid name format, when validated, then error is in the objects error collection" do
|
6
|
+
klass = Class.new do
|
7
|
+
include Validatable
|
8
|
+
attr_accessor :name
|
9
|
+
validates_format_of :name, :with => /.+/
|
10
|
+
end
|
11
|
+
instance = klass.new
|
12
|
+
instance.valid?
|
13
|
+
assert_equal "is invalid", instance.errors.on(:name)
|
14
|
+
end
|
15
|
+
|
16
|
+
test "given invalid name format and nil name, when validated, then error is in the objects error collection" do
|
17
|
+
klass = Class.new do
|
18
|
+
include Validatable
|
19
|
+
attr_accessor :name
|
20
|
+
validates_format_of :name, :with => /.+/, :if => Proc.new { !name.nil? }
|
21
|
+
end
|
22
|
+
assert_equal true, klass.new.valid?
|
23
|
+
end
|
24
|
+
|
25
|
+
test "given invalid name format and a name, when validated, then error is in the objects error collection" do
|
26
|
+
klass = Class.new do
|
27
|
+
include Validatable
|
28
|
+
attr_accessor :name
|
29
|
+
validates_format_of :name, :with => /.+/, :if => Proc.new { name.nil? }
|
30
|
+
end
|
31
|
+
assert_equal false, klass.new.valid?
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
|
+
|
3
|
+
module Functional
|
4
|
+
class ValidatesInclusionOfTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
test "given no name, when validated, then error is in the objects error collection" do
|
7
|
+
klass = Class.new do
|
8
|
+
include Validatable
|
9
|
+
attr_accessor :name
|
10
|
+
validates_inclusion_of :name, :in => [true]
|
11
|
+
end
|
12
|
+
instance = klass.new
|
13
|
+
assert_equal false, instance.valid?
|
14
|
+
assert_equal "is not included in the list", instance.errors.on(:name)
|
15
|
+
end
|
16
|
+
|
17
|
+
test "given no gender with custom message, when validated, then error is the custom message" do
|
18
|
+
klass = Class.new do
|
19
|
+
include Validatable
|
20
|
+
attr_accessor :gender
|
21
|
+
validates_inclusion_of :gender, :in => %w( m f ), :message => "whoa! what are you then!??!!"
|
22
|
+
end
|
23
|
+
instance = klass.new
|
24
|
+
assert_equal false, instance.valid?
|
25
|
+
assert_equal "whoa! what are you then!??!!", instance.errors.on(:gender)
|
26
|
+
end
|
27
|
+
|
28
|
+
test "given gender, when validated, then no error message" do
|
29
|
+
klass = Class.new do
|
30
|
+
include Validatable
|
31
|
+
attr_accessor :gender
|
32
|
+
validates_inclusion_of :gender, :in => %w( m f ), :message => "whoa! what are you then!??!!"
|
33
|
+
end
|
34
|
+
instance = klass.new
|
35
|
+
instance.gender = 'f'
|
36
|
+
assert_equal true, instance.valid?
|
37
|
+
assert_equal nil, instance.errors.on(:gender)
|
38
|
+
end
|
39
|
+
|
40
|
+
test 'given age, when validated, then no error message' do
|
41
|
+
klass = Class.new do
|
42
|
+
include Validatable
|
43
|
+
attr_accessor :age
|
44
|
+
validates_inclusion_of :age, :in => 0..99
|
45
|
+
end
|
46
|
+
instance = klass.new
|
47
|
+
instance.age = rand(99)
|
48
|
+
assert_equal true, instance.valid?
|
49
|
+
assert_equal nil, instance.errors.on(:age)
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
|
+
|
3
|
+
module Functional
|
4
|
+
class ValidatesLengthOfTest < Test::Unit::TestCase
|
5
|
+
test "given short value, when validated, then error is in the objects error collection" do
|
6
|
+
klass = Class.new do
|
7
|
+
include Validatable
|
8
|
+
attr_accessor :name
|
9
|
+
validates_length_of :name, :minimum => 2
|
10
|
+
end
|
11
|
+
instance = klass.new
|
12
|
+
instance.valid?
|
13
|
+
assert_equal "is invalid", instance.errors.on(:name)
|
14
|
+
end
|
15
|
+
|
16
|
+
test "given is constraint, when validated, then error is in the objects error collection" do
|
17
|
+
klass = Class.new do
|
18
|
+
include Validatable
|
19
|
+
attr_accessor :name
|
20
|
+
validates_length_of :name, :is => 2
|
21
|
+
end
|
22
|
+
|
23
|
+
instance = klass.new
|
24
|
+
instance.valid?
|
25
|
+
assert_equal "is invalid", instance.errors.on(:name)
|
26
|
+
end
|
27
|
+
|
28
|
+
test "given is constraint is met, when validated, then valid is true" do
|
29
|
+
klass = Class.new do
|
30
|
+
include Validatable
|
31
|
+
attr_accessor :name
|
32
|
+
validates_length_of :name, :is => 2
|
33
|
+
end
|
34
|
+
|
35
|
+
instance = klass.new
|
36
|
+
instance.name = "bk"
|
37
|
+
assert_equal true, instance.valid?
|
38
|
+
end
|
39
|
+
|
40
|
+
test "given within constraint, when validated, then error is in the objects error collection" do
|
41
|
+
klass = Class.new do
|
42
|
+
include Validatable
|
43
|
+
attr_accessor :name
|
44
|
+
validates_length_of :name, :within => 2..4
|
45
|
+
end
|
46
|
+
|
47
|
+
instance = klass.new
|
48
|
+
instance.valid?
|
49
|
+
assert_equal "is invalid", instance.errors.on(:name)
|
50
|
+
end
|
51
|
+
|
52
|
+
test "given within constraint, when validated, then valid is true" do
|
53
|
+
klass = Class.new do
|
54
|
+
include Validatable
|
55
|
+
attr_accessor :name
|
56
|
+
validates_length_of :name, :within => 2..4
|
57
|
+
end
|
58
|
+
|
59
|
+
instance = klass.new
|
60
|
+
instance.name = "bk"
|
61
|
+
assert_equal true, instance.valid?
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|