validatable 1.6.4 → 1.6.6
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/included_validation.rb +9 -0
- data/lib/macros.rb +51 -3
- data/lib/object_extension.rb +3 -2
- data/lib/validatable.rb +2 -4
- data/lib/validatable_class_methods.rb +7 -1
- data/lib/validatable_instance_methods.rb +25 -2
- data/lib/validations/validation_base.rb +2 -2
- data/rakefile.rb +1 -1
- data/test/functional/validatable_test.rb +85 -7
- data/test/test_helper.rb +0 -6
- data/test/unit/validates_acceptance_of_test.rb +3 -3
- data/test/unit/validates_confirmation_of_test.rb +11 -11
- data/test/unit/validates_format_of_test.rb +6 -6
- data/test/unit/validates_length_of_test.rb +12 -12
- data/test/unit/validates_numericality_of_test.rb +8 -8
- data/test/unit/validates_presence_of_test.rb +4 -4
- data/test/unit/validates_true_for_test.rb +5 -5
- data/test/unit/validation_base_test.rb +6 -16
- metadata +4 -8
- data/lib/validatable_assertions.rb +0 -77
- data/lib/validation_assertion.rb +0 -7
- data/lib/validation_assertion_collector.rb +0 -43
- data/test/functional/validatable_assertions_test.rb +0 -98
- data/test/functional/validation_assertion_collector_test.rb +0 -49
data/lib/macros.rb
CHANGED
@@ -194,7 +194,37 @@ module Validatable
|
|
194
194
|
add_validations(args, ValidatesTrueFor)
|
195
195
|
end
|
196
196
|
|
197
|
-
# call-seq:
|
197
|
+
# call-seq: include_validations_from(attribute)
|
198
|
+
#
|
199
|
+
# Includes all the validations that are defined on the attribute.
|
200
|
+
# class Person
|
201
|
+
# include Validatable
|
202
|
+
# validates_presence_of :name
|
203
|
+
# end
|
204
|
+
#
|
205
|
+
# class PersonPresenter
|
206
|
+
# include Validatable
|
207
|
+
# include_validataions_from :person
|
208
|
+
# attr_accessor :person
|
209
|
+
# def name
|
210
|
+
# person.name
|
211
|
+
# end
|
212
|
+
#
|
213
|
+
# def initialize(person)
|
214
|
+
# @person = person
|
215
|
+
# end
|
216
|
+
# end
|
217
|
+
#
|
218
|
+
# presenter = PersonPresenter.new(Person.new)
|
219
|
+
# presenter.valid? #=> false
|
220
|
+
# presenter.errors.on(:name) #=> "can't be blank"
|
221
|
+
#
|
222
|
+
# The name attribute whose validations should be added.
|
223
|
+
def include_validations_from(attribute_to_validate, options = {})
|
224
|
+
validations_to_include << IncludedValidation.new(attribute_to_validate)
|
225
|
+
end
|
226
|
+
|
227
|
+
# call-seq: include_errors_from(attribute_to_validate, options = {})
|
198
228
|
#
|
199
229
|
# Validates the specified attributes.
|
200
230
|
# class Person
|
@@ -205,7 +235,7 @@ module Validatable
|
|
205
235
|
#
|
206
236
|
# class PersonPresenter
|
207
237
|
# include Validatable
|
208
|
-
#
|
238
|
+
# include_errors_from :person, :map => { :name => :namen }, :if => lambda { not person.nil? }
|
209
239
|
# attr_accessor :person
|
210
240
|
#
|
211
241
|
# def initialize(person)
|
@@ -224,10 +254,28 @@ module Validatable
|
|
224
254
|
#
|
225
255
|
# * map - A hash that maps attributes of the child to attributes of the parent.
|
226
256
|
# * if - A block that when executed must return true of the validation will not occur.
|
227
|
-
def
|
257
|
+
def include_errors_from(attribute_to_validate, options = {})
|
228
258
|
children_to_validate << ChildValidation.new(attribute_to_validate, options[:map] || {}, options[:if] || lambda { true })
|
229
259
|
end
|
230
260
|
|
261
|
+
def include_validations_for(attribute_to_validate, options = {}) #:nodoc:
|
262
|
+
puts "include_validations_for is deprecated; use include_errors_from instead"
|
263
|
+
children_to_validate << ChildValidation.new(attribute_to_validate, options[:map] || {}, options[:if] || lambda { true })
|
264
|
+
end
|
265
|
+
|
266
|
+
# call-seq: before_validation(&block)
|
267
|
+
#
|
268
|
+
# Is called before valid? or valid_for_*?
|
269
|
+
#
|
270
|
+
# class Person
|
271
|
+
# include Validatable
|
272
|
+
# before_validation do
|
273
|
+
# self.name = "default name"
|
274
|
+
# end
|
275
|
+
#
|
276
|
+
# attr_accessor :name
|
277
|
+
# end
|
278
|
+
#
|
231
279
|
def before_validation(&block)
|
232
280
|
before_validations << block
|
233
281
|
end
|
data/lib/object_extension.rb
CHANGED
data/lib/validatable.rb
CHANGED
@@ -4,6 +4,7 @@ require File.expand_path(File.dirname(__FILE__) + '/errors')
|
|
4
4
|
require File.expand_path(File.dirname(__FILE__) + '/validatable_class_methods')
|
5
5
|
require File.expand_path(File.dirname(__FILE__) + '/macros')
|
6
6
|
require File.expand_path(File.dirname(__FILE__) + '/validatable_instance_methods')
|
7
|
+
require File.expand_path(File.dirname(__FILE__) + '/included_validation')
|
7
8
|
require File.expand_path(File.dirname(__FILE__) + '/child_validation')
|
8
9
|
require File.expand_path(File.dirname(__FILE__) + '/understandable')
|
9
10
|
require File.expand_path(File.dirname(__FILE__) + '/requireable')
|
@@ -15,7 +16,4 @@ require File.expand_path(File.dirname(__FILE__) + '/validations/validates_confir
|
|
15
16
|
require File.expand_path(File.dirname(__FILE__) + '/validations/validates_length_of')
|
16
17
|
require File.expand_path(File.dirname(__FILE__) + '/validations/validates_true_for')
|
17
18
|
require File.expand_path(File.dirname(__FILE__) + '/validations/validates_numericality_of')
|
18
|
-
require File.expand_path(File.dirname(__FILE__) + '/validations/validates_each')
|
19
|
-
require File.expand_path(File.dirname(__FILE__) + '/validation_assertion')
|
20
|
-
require File.expand_path(File.dirname(__FILE__) + '/validation_assertion_collector')
|
21
|
-
require File.expand_path(File.dirname(__FILE__) + '/validatable_assertions')
|
19
|
+
require File.expand_path(File.dirname(__FILE__) + '/validations/validates_each')
|
@@ -34,7 +34,9 @@ module Validatable
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def all_validations
|
37
|
-
|
37
|
+
if self.respond_to?(:superclass) && self.superclass.respond_to?(:all_validations)
|
38
|
+
return validations + self.superclass.all_validations
|
39
|
+
end
|
38
40
|
validations
|
39
41
|
end
|
40
42
|
|
@@ -50,6 +52,10 @@ module Validatable
|
|
50
52
|
validations.map { |validation| validation.key }.include?(key)
|
51
53
|
end
|
52
54
|
|
55
|
+
def validations_to_include
|
56
|
+
@validations_to_include ||= []
|
57
|
+
end
|
58
|
+
|
53
59
|
protected
|
54
60
|
|
55
61
|
def add_validations(args, klass)
|
@@ -40,6 +40,22 @@ module Validatable
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
+
# call-seq: validate_only(key)
|
44
|
+
#
|
45
|
+
# Only executes a specified validation. The argument should follow a pattern based on the key of the validation.
|
46
|
+
# Examples:
|
47
|
+
# * validates_presence_of :name can be run with obj.validate_only("presence_of/name")
|
48
|
+
# * validates_presence_of :birthday, :key => "a key" can be run with obj.validate_only("presence_of/a key")
|
49
|
+
def validate_only(key)
|
50
|
+
validation_name, attribute_name = key.split("/")
|
51
|
+
validation_name = validation_name.split("_").collect{|word| word.capitalize}.join
|
52
|
+
validation_key = "#{self.class.name}/Validatable::Validates#{validation_name}/#{attribute_name}"
|
53
|
+
validation = self.class.all_validations.find { |validation| validation.key == validation_key }
|
54
|
+
raise ArgumentError.new("validation with key #{validation_key} could not be found") if validation.nil?
|
55
|
+
errors.clear
|
56
|
+
run_validation(validation)
|
57
|
+
end
|
58
|
+
|
43
59
|
protected
|
44
60
|
def times_validated_hash #:nodoc:
|
45
61
|
@times_validated_hash ||= {}
|
@@ -61,7 +77,7 @@ module Validatable
|
|
61
77
|
validation.run_after_validate(validation_result, self, validation.attribute)
|
62
78
|
end
|
63
79
|
|
64
|
-
def run_before_validations
|
80
|
+
def run_before_validations #:nodoc:
|
65
81
|
self.class.all_before_validations.each do |block|
|
66
82
|
instance_eval &block
|
67
83
|
end
|
@@ -72,11 +88,18 @@ module Validatable
|
|
72
88
|
end
|
73
89
|
|
74
90
|
def validations_for_level_and_group(level, group) #:nodoc:
|
75
|
-
validations_for_level = self.
|
91
|
+
validations_for_level = self.all_validations.select { |validation| validation.level == level }
|
76
92
|
return validations_for_level.select { |validation| validation.groups.empty? } if group.nil?
|
77
93
|
validations_for_level.select { |validation| validation.groups.include?(group) }
|
78
94
|
end
|
79
95
|
|
96
|
+
def all_validations #:nodoc:
|
97
|
+
res = self.class.validations_to_include.inject(self.class.all_validations) do |result, included_validation_class|
|
98
|
+
result += self.send(included_validation_class.attribute).all_validations
|
99
|
+
result
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
80
103
|
def validation_levels #:nodoc:
|
81
104
|
self.class.all_validations.inject([1]) { |result, validation| result << validation.level }.uniq.sort
|
82
105
|
end
|
@@ -54,8 +54,8 @@ module Validatable
|
|
54
54
|
end
|
55
55
|
self.attribute = attribute
|
56
56
|
self.groups = [self.groups] unless self.groups.is_a?(Array)
|
57
|
-
self.key = "#{
|
58
|
-
raise_error_if_key_is_dup(klass)
|
57
|
+
self.key = "#{klass.name}/#{self.class.name}/#{self.key || self.attribute}"
|
58
|
+
raise_error_if_key_is_dup(klass)
|
59
59
|
end
|
60
60
|
|
61
61
|
def raise_error_if_key_is_dup(klass)
|
data/rakefile.rb
CHANGED
@@ -29,7 +29,7 @@ Gem::manage_gems
|
|
29
29
|
specification = Gem::Specification.new do |s|
|
30
30
|
s.name = "validatable"
|
31
31
|
s.summary = "Validatable is a library for adding validations."
|
32
|
-
s.version = "1.6.
|
32
|
+
s.version = "1.6.6"
|
33
33
|
s.author = 'Jay Fields'
|
34
34
|
s.description = "Validatable is a library for adding validations."
|
35
35
|
s.email = 'validatable-developer@rubyforge.org'
|
@@ -1,6 +1,44 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
2
|
|
3
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
|
+
|
4
42
|
expect :is_set do
|
5
43
|
klass = Class.new do
|
6
44
|
include Validatable
|
@@ -91,7 +129,7 @@ functional_tests do
|
|
91
129
|
end
|
92
130
|
klass = Class.new do
|
93
131
|
include Validatable
|
94
|
-
|
132
|
+
include_errors_from :child
|
95
133
|
define_method :child do
|
96
134
|
child_class.new
|
97
135
|
end
|
@@ -110,7 +148,7 @@ functional_tests do
|
|
110
148
|
end
|
111
149
|
klass = Class.new do
|
112
150
|
include Validatable
|
113
|
-
|
151
|
+
include_errors_from :child
|
114
152
|
define_method :child do
|
115
153
|
child_class.new
|
116
154
|
end
|
@@ -133,7 +171,7 @@ functional_tests do
|
|
133
171
|
extend Forwardable
|
134
172
|
def_delegator :child, :name
|
135
173
|
validates_true_for :name, :logic => lambda { false }, :level => 2, :message => "invalid message"
|
136
|
-
|
174
|
+
include_errors_from :child
|
137
175
|
define_method :child do
|
138
176
|
@child ||= child_class.new
|
139
177
|
end
|
@@ -153,7 +191,7 @@ functional_tests do
|
|
153
191
|
klass = Class.new do
|
154
192
|
include Validatable
|
155
193
|
validates_true_for :address, :logic => lambda { false }, :level => 1, :message => "invalid message"
|
156
|
-
|
194
|
+
include_errors_from :child
|
157
195
|
define_method :child do
|
158
196
|
@child ||= child_class.new
|
159
197
|
end
|
@@ -173,7 +211,7 @@ functional_tests do
|
|
173
211
|
end
|
174
212
|
klass = Class.new do
|
175
213
|
include Validatable
|
176
|
-
|
214
|
+
include_errors_from :child, :map => {:name => :namen}
|
177
215
|
define_method :child do
|
178
216
|
child_class.new
|
179
217
|
end
|
@@ -191,7 +229,7 @@ functional_tests do
|
|
191
229
|
end
|
192
230
|
klass = Class.new do
|
193
231
|
include Validatable
|
194
|
-
|
232
|
+
include_errors_from :child, :if => lambda { true }
|
195
233
|
define_method :child do
|
196
234
|
child_class.new
|
197
235
|
end
|
@@ -209,7 +247,7 @@ functional_tests do
|
|
209
247
|
end
|
210
248
|
klass = Class.new do
|
211
249
|
include Validatable
|
212
|
-
|
250
|
+
include_errors_from :child, :if => lambda { false }
|
213
251
|
define_method :child do
|
214
252
|
child_class.new
|
215
253
|
end
|
@@ -356,4 +394,44 @@ functional_tests do
|
|
356
394
|
instance.valid?
|
357
395
|
instance.errors.on(:address)
|
358
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
|
359
437
|
end
|
data/test/test_helper.rb
CHANGED
@@ -7,12 +7,6 @@ require 'set'
|
|
7
7
|
require File.dirname(__FILE__) + '/../lib/validatable'
|
8
8
|
|
9
9
|
class << Test::Unit::TestCase
|
10
|
-
def test(name, &block)
|
11
|
-
test_name = :"test_#{name.gsub(' ','_')}"
|
12
|
-
raise ArgumentError, "#{test_name} is already defined" if self.instance_methods.include? test_name.to_s
|
13
|
-
define_method test_name, &block
|
14
|
-
end
|
15
|
-
|
16
10
|
def expect(expected_value, &block)
|
17
11
|
define_method :"test_#{caller.first.split("/").last}" do
|
18
12
|
begin
|
@@ -2,20 +2,20 @@ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
|
2
2
|
|
3
3
|
class ValidatesAcceptanceOfTest < Test::Unit::TestCase
|
4
4
|
test "valid acceptance" do
|
5
|
-
validation = Validatable::ValidatesAcceptanceOf.new
|
5
|
+
validation = Validatable::ValidatesAcceptanceOf.new stub_everything, :acceptance
|
6
6
|
instance = stub(:acceptance=>'true')
|
7
7
|
assert_equal true, validation.valid?(instance)
|
8
8
|
end
|
9
9
|
|
10
10
|
test "invalid acceptance" do
|
11
|
-
validation = Validatable::ValidatesAcceptanceOf.new
|
11
|
+
validation = Validatable::ValidatesAcceptanceOf.new stub_everything, :acceptance
|
12
12
|
instance = stub(:acceptance=>'false')
|
13
13
|
assert_equal false, validation.valid?(instance)
|
14
14
|
end
|
15
15
|
|
16
16
|
expect true do
|
17
17
|
options = {:message => nil, :if => nil, :times => nil, :level => nil, :groups => nil}
|
18
|
-
Validatable::ValidatesAcceptanceOf.new(
|
18
|
+
Validatable::ValidatesAcceptanceOf.new(stub_everything, :test).must_understand(options)
|
19
19
|
end
|
20
20
|
|
21
21
|
end
|
@@ -2,62 +2,62 @@ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
|
2
2
|
|
3
3
|
class ValidatesConfirmationOfTest < Test::Unit::TestCase
|
4
4
|
test "valid confirmation" do
|
5
|
-
validation = Validatable::ValidatesConfirmationOf.new
|
5
|
+
validation = Validatable::ValidatesConfirmationOf.new stub_everything, :username
|
6
6
|
instance = stub(:username=>"username", :username_confirmation=>"username")
|
7
7
|
assert_equal true, validation.valid?(instance)
|
8
8
|
end
|
9
9
|
|
10
10
|
test "invalid confirmation" do
|
11
|
-
validation = Validatable::ValidatesConfirmationOf.new
|
11
|
+
validation = Validatable::ValidatesConfirmationOf.new stub_everything, :username
|
12
12
|
instance = stub(:username=>"username", :username_confirmation=>"usessrname")
|
13
13
|
assert_equal false, validation.valid?(instance)
|
14
14
|
end
|
15
15
|
|
16
16
|
test "valid confirmation with case insensitive" do
|
17
|
-
validation = Validatable::ValidatesConfirmationOf.new
|
17
|
+
validation = Validatable::ValidatesConfirmationOf.new stub_everything, :username, :case_sensitive => false
|
18
18
|
instance = stub(:username=>"username", :username_confirmation=>"USERNAME")
|
19
19
|
assert_equal true, validation.valid?(instance)
|
20
20
|
end
|
21
21
|
|
22
22
|
test "invalid confirmation with case sensitive" do
|
23
|
-
validation = Validatable::ValidatesConfirmationOf.new
|
23
|
+
validation = Validatable::ValidatesConfirmationOf.new stub_everything, :username, :case_sensitive => true
|
24
24
|
instance = stub(:username=>"username", :username_confirmation=>"USERNAME")
|
25
25
|
assert_equal false, validation.valid?(instance)
|
26
26
|
end
|
27
27
|
|
28
28
|
test "invalid confirmation if value is nil and confirmation is not with case sensitive true" do
|
29
|
-
validation = Validatable::ValidatesConfirmationOf.new
|
29
|
+
validation = Validatable::ValidatesConfirmationOf.new stub_everything, :username, :case_sensitive => true
|
30
30
|
assert_equal false, validation.valid?(stub(:username => nil, :username_confirmation => 'something'))
|
31
31
|
end
|
32
32
|
|
33
33
|
test "invalid confirmation if confirmation is nil and value is not with case sensitive true" do
|
34
|
-
validation = Validatable::ValidatesConfirmationOf.new
|
34
|
+
validation = Validatable::ValidatesConfirmationOf.new stub_everything, :username, :case_sensitive => true
|
35
35
|
assert_equal false, validation.valid?(stub(:username => 'something', :username_confirmation => nil))
|
36
36
|
end
|
37
37
|
|
38
38
|
test "valid confirmation if value and confirmation are nil with case sensitive true" do
|
39
|
-
validation = Validatable::ValidatesConfirmationOf.new
|
39
|
+
validation = Validatable::ValidatesConfirmationOf.new stub_everything, :username, :case_sensitive => true
|
40
40
|
assert_equal true, validation.valid?(stub(:username => nil, :username_confirmation => nil))
|
41
41
|
end
|
42
42
|
|
43
43
|
test "invalid confirmation if value is nil and confirmation is not with case sensitive false" do
|
44
|
-
validation = Validatable::ValidatesConfirmationOf.new
|
44
|
+
validation = Validatable::ValidatesConfirmationOf.new stub_everything, :username, :case_sensitive => false
|
45
45
|
assert_equal false, validation.valid?(stub(:username => nil, :username_confirmation => 'something'))
|
46
46
|
end
|
47
47
|
|
48
48
|
test "invalid confirmation if confirmation is nil and value is not with case sensitive false" do
|
49
|
-
validation = Validatable::ValidatesConfirmationOf.new
|
49
|
+
validation = Validatable::ValidatesConfirmationOf.new stub_everything, :username, :case_sensitive => false
|
50
50
|
assert_equal false, validation.valid?(stub(:username => 'something', :username_confirmation => nil))
|
51
51
|
end
|
52
52
|
|
53
53
|
test "valid confirmation if value and confirmation are nil with case sensitive false" do
|
54
|
-
validation = Validatable::ValidatesConfirmationOf.new
|
54
|
+
validation = Validatable::ValidatesConfirmationOf.new stub_everything, :username, :case_sensitive => false
|
55
55
|
assert_equal true, validation.valid?(stub(:username => nil, :username_confirmation => nil))
|
56
56
|
end
|
57
57
|
|
58
58
|
expect true do
|
59
59
|
options = { :message => nil, :if => nil, :times => nil, :level => nil, :groups => nil, :case_sensitive => nil }
|
60
|
-
Validatable::ValidatesConfirmationOf.new(
|
60
|
+
Validatable::ValidatesConfirmationOf.new(stub_everything, :test).must_understand(options)
|
61
61
|
end
|
62
62
|
|
63
63
|
end
|
@@ -2,34 +2,34 @@ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
|
2
2
|
|
3
3
|
class ValidatesFormatOfTest < Test::Unit::TestCase
|
4
4
|
test "when attribute value does not match the given regex, then valid is false" do
|
5
|
-
validation = Validatable::ValidatesFormatOf.new
|
5
|
+
validation = Validatable::ValidatesFormatOf.new stub_everything, :name, :with => /book/
|
6
6
|
assert_equal false, validation.valid?(stub_everything)
|
7
7
|
end
|
8
8
|
|
9
9
|
test "when attribute value does match the given regex, then valid is true" do
|
10
|
-
validation = Validatable::ValidatesFormatOf.new
|
10
|
+
validation = Validatable::ValidatesFormatOf.new stub_everything, :name, :with => /book/
|
11
11
|
assert_equal true, validation.valid?(stub(:name=>"book"))
|
12
12
|
end
|
13
13
|
|
14
14
|
test "when attribute value is an integer it should be converted to a string before matching" do
|
15
|
-
validation = Validatable::ValidatesFormatOf.new
|
15
|
+
validation = Validatable::ValidatesFormatOf.new stub_everything, :age, :with => /14/
|
16
16
|
assert_equal true, validation.valid?(stub(:age=>14))
|
17
17
|
end
|
18
18
|
|
19
19
|
test "when no with is given, then an error is raised during construction" do
|
20
20
|
assert_raises ArgumentError do
|
21
|
-
validation = Validatable::ValidatesFormatOf.new
|
21
|
+
validation = Validatable::ValidatesFormatOf.new stub_everything, :age
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
expect true do
|
26
26
|
options = [:message, :if, :times, :level, :groups, :with, :key]
|
27
|
-
Validatable::ValidatesFormatOf.new(
|
27
|
+
Validatable::ValidatesFormatOf.new(stub_everything, :test, options.to_blank_options_hash).must_understand(options.to_blank_options_hash)
|
28
28
|
end
|
29
29
|
|
30
30
|
expect true do
|
31
31
|
options = [:with]
|
32
|
-
Validatable::ValidatesFormatOf.new(
|
32
|
+
Validatable::ValidatesFormatOf.new(stub_everything, :name, options.to_blank_options_hash).requires(options.to_blank_options_hash)
|
33
33
|
end
|
34
34
|
|
35
35
|
end
|
@@ -3,74 +3,74 @@ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
|
3
3
|
module Unit
|
4
4
|
class ValidatesLengthOfTest < Test::Unit::TestCase
|
5
5
|
expect false do
|
6
|
-
validation = Validatable::ValidatesLengthOf.new
|
6
|
+
validation = Validatable::ValidatesLengthOf.new stub_everything, :username, :maximum => 8
|
7
7
|
validation.valid?(stub(:username=>"usernamefdfd"))
|
8
8
|
end
|
9
9
|
|
10
10
|
test "min length" do
|
11
|
-
validation = Validatable::ValidatesLengthOf.new
|
11
|
+
validation = Validatable::ValidatesLengthOf.new stub_everything, :username, :minimum => 2
|
12
12
|
instance = stub(:username=>"u")
|
13
13
|
assert_equal false, validation.valid?(instance)
|
14
14
|
end
|
15
15
|
|
16
16
|
test "valid length" do
|
17
|
-
validation = Validatable::ValidatesLengthOf.new
|
17
|
+
validation = Validatable::ValidatesLengthOf.new stub_everything, :username, :minimum => 2, :maximum => 8
|
18
18
|
instance = stub(:username=>"udfgdf")
|
19
19
|
assert_equal true, validation.valid?(instance)
|
20
20
|
end
|
21
21
|
|
22
22
|
test "is length is false" do
|
23
|
-
validation = Validatable::ValidatesLengthOf.new
|
23
|
+
validation = Validatable::ValidatesLengthOf.new stub_everything, :username, :is => 2
|
24
24
|
instance = stub(:username=>"u")
|
25
25
|
assert_equal false, validation.valid?(instance)
|
26
26
|
end
|
27
27
|
|
28
28
|
test "is length is true" do
|
29
|
-
validation = Validatable::ValidatesLengthOf.new
|
29
|
+
validation = Validatable::ValidatesLengthOf.new stub_everything, :username, :is => 2
|
30
30
|
instance = stub(:username=>"uu")
|
31
31
|
assert_equal true, validation.valid?(instance)
|
32
32
|
end
|
33
33
|
|
34
34
|
test "within lower bound is true" do
|
35
|
-
validation = Validatable::ValidatesLengthOf.new
|
35
|
+
validation = Validatable::ValidatesLengthOf.new stub_everything, :username, :within => 2..4
|
36
36
|
instance = stub(:username => "aa")
|
37
37
|
assert_equal true, validation.valid?(instance)
|
38
38
|
end
|
39
39
|
|
40
40
|
test "within outside lower bound is false" do
|
41
|
-
validation = Validatable::ValidatesLengthOf.new
|
41
|
+
validation = Validatable::ValidatesLengthOf.new stub_everything, :username, :within => 2..4
|
42
42
|
instance = stub(:username => "a")
|
43
43
|
assert_equal false, validation.valid?(instance)
|
44
44
|
end
|
45
45
|
|
46
46
|
test "within upper bound is true" do
|
47
|
-
validation = Validatable::ValidatesLengthOf.new
|
47
|
+
validation = Validatable::ValidatesLengthOf.new stub_everything, :username, :within => 2..4
|
48
48
|
instance = stub(:username => "aaaa")
|
49
49
|
assert_equal true, validation.valid?(instance)
|
50
50
|
end
|
51
51
|
|
52
52
|
test "within outside upper bound is false" do
|
53
|
-
validation = Validatable::ValidatesLengthOf.new
|
53
|
+
validation = Validatable::ValidatesLengthOf.new stub_everything, :username, :within => 2..4
|
54
54
|
instance = stub(:username => "aaaaa")
|
55
55
|
assert_equal false, validation.valid?(instance)
|
56
56
|
end
|
57
57
|
|
58
58
|
test "given nil value, should not be valid" do
|
59
|
-
validation = Validatable::ValidatesLengthOf.new
|
59
|
+
validation = Validatable::ValidatesLengthOf.new stub_everything, :username, :within => 2..4
|
60
60
|
instance = stub(:username => nil)
|
61
61
|
assert_equal false, validation.valid?(instance)
|
62
62
|
end
|
63
63
|
|
64
64
|
|
65
65
|
test "given allow_nil is true, nil value should be valid" do
|
66
|
-
validation = Validatable::ValidatesLengthOf.new
|
66
|
+
validation = Validatable::ValidatesLengthOf.new stub_everything, :username, :within => 2..4, :allow_nil => true
|
67
67
|
instance = stub(:username => nil)
|
68
68
|
assert_equal true, validation.valid?(instance)
|
69
69
|
end
|
70
70
|
|
71
71
|
expect true do
|
72
72
|
options = [:message, :if, :times, :level, :groups, :maximum, :minimum, :is, :within, :allow_nil]
|
73
|
-
Validatable::ValidatesLengthOf.new(
|
73
|
+
Validatable::ValidatesLengthOf.new(stub_everything, :test).must_understand(options.to_blank_options_hash)
|
74
74
|
end
|
75
75
|
|
76
76
|
end
|
@@ -4,50 +4,50 @@ module Unit
|
|
4
4
|
class ValidatesNumericalityOfTest < Test::Unit::TestCase
|
5
5
|
|
6
6
|
test "when the value is nil then valid is false" do
|
7
|
-
validation = Validatable::ValidatesNumericalityOf.new
|
7
|
+
validation = Validatable::ValidatesNumericalityOf.new stub_everything, :nothing
|
8
8
|
instance = stub(:nothing => nil)
|
9
9
|
assert_equal false, validation.valid?(instance)
|
10
10
|
end
|
11
11
|
|
12
12
|
test "when value is an integer then valid is true" do
|
13
|
-
validation = Validatable::ValidatesNumericalityOf.new
|
13
|
+
validation = Validatable::ValidatesNumericalityOf.new stub_everything, :some_int
|
14
14
|
instance = stub(:some_int => 50)
|
15
15
|
assert_equal true, validation.valid?(instance)
|
16
16
|
end
|
17
17
|
|
18
18
|
test "when value is an decimal then valid is true" do
|
19
|
-
validation = Validatable::ValidatesNumericalityOf.new
|
19
|
+
validation = Validatable::ValidatesNumericalityOf.new stub_everything, :some_decimal
|
20
20
|
instance = stub(:some_decimal => 1.23)
|
21
21
|
assert_equal true, validation.valid?(instance)
|
22
22
|
end
|
23
23
|
|
24
24
|
test "when value is a decimal but only_integer is true, then valid is false" do
|
25
|
-
validation = Validatable::ValidatesNumericalityOf.new
|
25
|
+
validation = Validatable::ValidatesNumericalityOf.new stub_everything, :some_decimal, :only_integer => true
|
26
26
|
instance = stub(:some_decimal => 1.23)
|
27
27
|
assert_equal false, validation.valid?(instance)
|
28
28
|
end
|
29
29
|
|
30
30
|
test "when value is an integer string and only_integer is true, then valid is true" do
|
31
|
-
validation = Validatable::ValidatesNumericalityOf.new
|
31
|
+
validation = Validatable::ValidatesNumericalityOf.new stub_everything, :some_negative_number, :only_integer => true
|
32
32
|
instance = stub(:some_negative_number => "-1")
|
33
33
|
assert_equal true, validation.valid?(instance)
|
34
34
|
end
|
35
35
|
|
36
36
|
test "when value has non numeric characters then valid is false" do
|
37
|
-
validation = Validatable::ValidatesNumericalityOf.new
|
37
|
+
validation = Validatable::ValidatesNumericalityOf.new stub_everything, :some_non_numeric
|
38
38
|
instance = stub(:some_non_numeric => "50F")
|
39
39
|
assert_equal false, validation.valid?(instance)
|
40
40
|
end
|
41
41
|
|
42
42
|
test "when value is a string with multiple dots then valid is false" do
|
43
|
-
validation = Validatable::ValidatesNumericalityOf.new
|
43
|
+
validation = Validatable::ValidatesNumericalityOf.new stub_everything, :multiple_dots
|
44
44
|
instance = stub(:multiple_dots => "50.0.0")
|
45
45
|
assert_equal false, validation.valid?(instance)
|
46
46
|
end
|
47
47
|
|
48
48
|
expect true do
|
49
49
|
options = [:message, :if, :times, :level, :groups, :only_integer]
|
50
|
-
Validatable::ValidatesNumericalityOf.new(
|
50
|
+
Validatable::ValidatesNumericalityOf.new(stub_everything, :test).must_understand(options.to_blank_options_hash)
|
51
51
|
end
|
52
52
|
|
53
53
|
end
|
@@ -2,23 +2,23 @@ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
|
2
2
|
|
3
3
|
class ValidatesPresenceOfTest < Test::Unit::TestCase
|
4
4
|
test "when attribute value does not match the given regex, then valid is false" do
|
5
|
-
validation = Validatable::ValidatesPresenceOf.new
|
5
|
+
validation = Validatable::ValidatesPresenceOf.new stub_everything, :name
|
6
6
|
assert_equal false, validation.valid?(stub_everything)
|
7
7
|
end
|
8
8
|
|
9
9
|
test "when attribute value does match the given regex, then valid is true" do
|
10
|
-
validation = Validatable::ValidatesPresenceOf.new
|
10
|
+
validation = Validatable::ValidatesPresenceOf.new stub_everything, :name
|
11
11
|
assert_equal true, validation.valid?(stub(:name=>"book"))
|
12
12
|
end
|
13
13
|
|
14
14
|
test "when given a true value which is not a String, then valid is true" do
|
15
|
-
validation = Validatable::ValidatesPresenceOf.new
|
15
|
+
validation = Validatable::ValidatesPresenceOf.new stub_everything, :employee
|
16
16
|
assert_equal true, validation.valid?(stub(:employee => stub(:nil? => false)))
|
17
17
|
end
|
18
18
|
|
19
19
|
expect true do
|
20
20
|
options = {:message => nil, :if => nil, :times => nil, :level => nil, :groups => nil}
|
21
|
-
Validatable::ValidatesPresenceOf.new(
|
21
|
+
Validatable::ValidatesPresenceOf.new(stub_everything, :test).must_understand(options)
|
22
22
|
end
|
23
23
|
|
24
24
|
end
|
@@ -2,29 +2,29 @@ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
|
2
2
|
|
3
3
|
class ValidatesTrueForTest < Test::Unit::TestCase
|
4
4
|
test "when block returns false for attribute value, then valid is false" do
|
5
|
-
validation = Validatable::ValidatesTrueFor.new
|
5
|
+
validation = Validatable::ValidatesTrueFor.new stub_everything, :name, :logic => lambda { false }
|
6
6
|
assert_equal false, validation.valid?(stub_everything)
|
7
7
|
end
|
8
8
|
|
9
9
|
test "when block returns true for attribute value, then valid is false" do
|
10
|
-
validation = Validatable::ValidatesTrueFor.new
|
10
|
+
validation = Validatable::ValidatesTrueFor.new stub_everything, :name, :logic => lambda { true }
|
11
11
|
assert_equal true, validation.valid?(stub_everything)
|
12
12
|
end
|
13
13
|
|
14
14
|
test "when no logic is given, then an error is raised during construction" do
|
15
15
|
assert_raises ArgumentError do
|
16
|
-
validation = Validatable::ValidatesTrueFor.new
|
16
|
+
validation = Validatable::ValidatesTrueFor.new stub_everything, :age
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
20
|
expect true do
|
21
21
|
options = [:message, :if, :times, :level, :groups, :logic, :key]
|
22
|
-
Validatable::ValidatesTrueFor.new(
|
22
|
+
Validatable::ValidatesTrueFor.new(stub_everything, :name, options.to_blank_options_hash).must_understand(options.to_blank_options_hash)
|
23
23
|
end
|
24
24
|
|
25
25
|
expect true do
|
26
26
|
options = [:logic]
|
27
|
-
Validatable::ValidatesTrueFor.new(
|
27
|
+
Validatable::ValidatesTrueFor.new(stub_everything, :name, options.to_blank_options_hash).requires(options.to_blank_options_hash)
|
28
28
|
end
|
29
29
|
|
30
30
|
end
|
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
|
2
2
|
|
3
3
|
class ValidationBaseTest < Test::Unit::TestCase
|
4
4
|
expect true do
|
5
|
-
validation = Validatable::ValidationBase.new
|
5
|
+
validation = Validatable::ValidationBase.new stub_everything, :base
|
6
6
|
validation.should_validate? Object.new
|
7
7
|
end
|
8
8
|
|
@@ -12,7 +12,7 @@ class ValidationBaseTest < Test::Unit::TestCase
|
|
12
12
|
end
|
13
13
|
|
14
14
|
expect true do
|
15
|
-
validation = Validatable::ValidationBase.new
|
15
|
+
validation = Validatable::ValidationBase.new stub_everything, :base
|
16
16
|
validation.validate_this_time?(nil)
|
17
17
|
end
|
18
18
|
|
@@ -21,16 +21,6 @@ class ValidationBaseTest < Test::Unit::TestCase
|
|
21
21
|
validation.validate_this_time?(stub(:times_validated => 1))
|
22
22
|
end
|
23
23
|
|
24
|
-
expect "Validatable::ValidationBase:base:key" do
|
25
|
-
validation = Validatable::ValidationBase.new stub_everything, :base, :times => 1, :key => "key"
|
26
|
-
validation.key
|
27
|
-
end
|
28
|
-
|
29
|
-
expect "Validatable::ValidationBase:base:key" do
|
30
|
-
validation = Validatable::ValidationBase.new stub_everything, :base, :times => 1
|
31
|
-
validation.key
|
32
|
-
end
|
33
|
-
|
34
24
|
expect false do
|
35
25
|
validation = Validatable::ValidationBase.new stub_everything, :base, :times => 1
|
36
26
|
validation.validate_this_time?(stub(:times_validated => 1))
|
@@ -42,21 +32,21 @@ class ValidationBaseTest < Test::Unit::TestCase
|
|
42
32
|
end
|
43
33
|
|
44
34
|
expect ArgumentError do
|
45
|
-
Validatable::ValidationBase.new
|
35
|
+
Validatable::ValidationBase.new stub_everything(:validation_keys_include? => true), :base, :times => 1
|
46
36
|
end
|
47
37
|
|
48
38
|
expect "some message 100" do
|
49
|
-
validation = Validatable::ValidationBase.new
|
39
|
+
validation = Validatable::ValidationBase.new stub_everything, :base, :message => lambda { "some message #{a_method}" }
|
50
40
|
validation.message(stub(:a_method=>'100'))
|
51
41
|
end
|
52
42
|
|
53
43
|
expect ArgumentError do
|
54
|
-
Validatable::ValidationBase.new(
|
44
|
+
Validatable::ValidationBase.new(stub_everything, :base).must_understand(:foo => 1, :bar => 2)
|
55
45
|
end
|
56
46
|
|
57
47
|
expect true do
|
58
48
|
options = {:message => nil, :if => nil, :times => nil, :level => nil, :groups => nil, :key => nil}
|
59
|
-
Validatable::ValidationBase.new(
|
49
|
+
Validatable::ValidationBase.new(stub_everything, :base).must_understand(options)
|
60
50
|
end
|
61
51
|
|
62
52
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
|
|
3
3
|
specification_version: 1
|
4
4
|
name: validatable
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.6.
|
7
|
-
date: 2007-
|
6
|
+
version: 1.6.6
|
7
|
+
date: 2007-11-04 00:00:00 -04:00
|
8
8
|
summary: Validatable is a library for adding validations.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -31,16 +31,14 @@ authors:
|
|
31
31
|
files:
|
32
32
|
- lib/child_validation.rb
|
33
33
|
- lib/errors.rb
|
34
|
+
- lib/included_validation.rb
|
34
35
|
- lib/macros.rb
|
35
36
|
- lib/object_extension.rb
|
36
37
|
- lib/requireable.rb
|
37
38
|
- lib/understandable.rb
|
38
39
|
- lib/validatable.rb
|
39
|
-
- lib/validatable_assertions.rb
|
40
40
|
- lib/validatable_class_methods.rb
|
41
41
|
- lib/validatable_instance_methods.rb
|
42
|
-
- lib/validation_assertion.rb
|
43
|
-
- lib/validation_assertion_collector.rb
|
44
42
|
- lib/validations/validates_acceptance_of.rb
|
45
43
|
- lib/validations/validates_confirmation_of.rb
|
46
44
|
- lib/validations/validates_each.rb
|
@@ -51,8 +49,6 @@ files:
|
|
51
49
|
- lib/validations/validates_true_for.rb
|
52
50
|
- lib/validations/validation_base.rb
|
53
51
|
- test/all_tests.rb
|
54
|
-
- test/test_helper.rb
|
55
|
-
- test/functional/validatable_assertions_test.rb
|
56
52
|
- test/functional/validatable_test.rb
|
57
53
|
- test/functional/validates_acceptance_of_test.rb
|
58
54
|
- test/functional/validates_confirmation_of_test.rb
|
@@ -62,7 +58,7 @@ files:
|
|
62
58
|
- test/functional/validates_numericality_of_test.rb
|
63
59
|
- test/functional/validates_presence_of_test.rb
|
64
60
|
- test/functional/validates_true_for_test.rb
|
65
|
-
- test/
|
61
|
+
- test/test_helper.rb
|
66
62
|
- test/unit/errors_test.rb
|
67
63
|
- test/unit/understandable_test.rb
|
68
64
|
- test/unit/validatable_test.rb
|
@@ -1,77 +0,0 @@
|
|
1
|
-
module Validatable
|
2
|
-
module Assertions
|
3
|
-
|
4
|
-
def create_message_for_assertion(assertion) #:nodoc:
|
5
|
-
message = "#{assertion.klass} does not contain a #{assertion.validation_type} for #{assertion.attribute}"
|
6
|
-
message += " with options #{assertion.options.inspect}" unless assertion.options == {}
|
7
|
-
message
|
8
|
-
end
|
9
|
-
|
10
|
-
def create_backtrace #:nodoc:
|
11
|
-
backtrace = caller
|
12
|
-
backtrace.shift
|
13
|
-
backtrace.shift
|
14
|
-
backtrace
|
15
|
-
end
|
16
|
-
|
17
|
-
def validation_matching_proc(assertion) #:nodoc:
|
18
|
-
lambda do |validation|
|
19
|
-
result = assertion.validation_type === validation
|
20
|
-
result &&= assertion.attribute == validation.attribute
|
21
|
-
assertion.options.each_pair do |key, value|
|
22
|
-
validation_value = validation.send key if validation.respond_to? key
|
23
|
-
result = false if validation_value.nil?
|
24
|
-
result &&= validation_value == value
|
25
|
-
end
|
26
|
-
result
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def self.included(klass) #:nodoc:
|
31
|
-
Test::Unit::TestCase.class_eval do
|
32
|
-
def self.create_test_name(assertion) #:nodoc:
|
33
|
-
"test#{assertion.validation_type.to_s.gsub(/Validatable::/,'').gsub(/([A-Z])/, '_\1').downcase}_#{assertion.attribute}"
|
34
|
-
end
|
35
|
-
|
36
|
-
def self.define_test_method name, &block #:nodoc:
|
37
|
-
class_eval do
|
38
|
-
define_method name, &block
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
Class.class_eval do
|
44
|
-
# call-seq: must_validate
|
45
|
-
#
|
46
|
-
# class FooTest < Test::Unit::TestCase
|
47
|
-
# include Validatable::Assertions
|
48
|
-
#
|
49
|
-
# Foo.must_validate do
|
50
|
-
# presence_of :name
|
51
|
-
# format_of(:name).with(/^[A-Z]/)
|
52
|
-
# numericality_of(:age).only_integer(true)
|
53
|
-
# end
|
54
|
-
# end
|
55
|
-
#
|
56
|
-
# The above code creates a test for each line in the block given to must_validate.
|
57
|
-
# If the Foo class does not contain a presence of validation for name,
|
58
|
-
# an error with the text "Foo does not contain a Validatable::ValidatesPresenceOf for name" will be raised.
|
59
|
-
#
|
60
|
-
# Clearly this solution has limitations. Any validates_true_for validation cannot be tested using
|
61
|
-
# this DSL style of testing. Furthermore, any validation that uses an :if argument cannot use this DSL,
|
62
|
-
# since those validations require an instance to eval the :if argument against. However, for validations
|
63
|
-
# that are not validates_true_for and do not rely on an :if argument, the ValidatableAssertions can
|
64
|
-
# replace various existing success and failure validation tests.
|
65
|
-
def must_validate(&block)
|
66
|
-
test_class = eval "self", block.binding
|
67
|
-
ValidationAssertionCollector.gather(self, &block).each do |assertion|
|
68
|
-
test_class.define_test_method test_class.create_test_name(assertion) do
|
69
|
-
validation = assertion.klass.validations.find &validation_matching_proc(assertion)
|
70
|
-
add_failure create_message_for_assertion(assertion), create_backtrace if validation.nil?
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
data/lib/validation_assertion.rb
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
class ValidationAssertion #:nodoc:
|
2
|
-
attr_accessor :klass, :validation_type, :options, :attribute
|
3
|
-
|
4
|
-
def initialize(klass, validation_type, attribute)
|
5
|
-
self.klass, self.validation_type, self.attribute, self.options = klass, validation_type, attribute, {}
|
6
|
-
end
|
7
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
class ValidationAssertionCollector #:nodoc:
|
2
|
-
def self.gather(klass, &block)
|
3
|
-
collector = self.new(klass)
|
4
|
-
collector.instance_eval(&block)
|
5
|
-
collector.assertions
|
6
|
-
end
|
7
|
-
|
8
|
-
def self.define_method_for_validation_method(validation_method, validatable_class)
|
9
|
-
define_method validation_method.gsub(/^validates_/,'').to_sym do |attribute|
|
10
|
-
assertions << ValidationAssertion.new(self.klass, validatable_class, attribute)
|
11
|
-
define_methods_on_assertion_to_collect_options validatable_class, assertions.last
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
Validatable::Macros.public_instance_methods.sort.grep(/^validates_/).each do |validation_method|
|
16
|
-
next if validation_method == 'validates_true_for'
|
17
|
-
validatable_class = Validatable.const_get(validation_method.split(/_/).collect { |word| word.capitalize}.join)
|
18
|
-
define_method_for_validation_method(validation_method, validatable_class)
|
19
|
-
end
|
20
|
-
|
21
|
-
attr_accessor :klass
|
22
|
-
|
23
|
-
def initialize(klass)
|
24
|
-
self.klass = klass
|
25
|
-
end
|
26
|
-
|
27
|
-
def define_methods_on_assertion_to_collect_options(validatable_class, assertion)
|
28
|
-
validatable_class.all_understandings.each do |option|
|
29
|
-
next if option == :if
|
30
|
-
class << assertion; self; end.instance_eval do
|
31
|
-
define_method option do |value|
|
32
|
-
self.options.merge!(option=>value)
|
33
|
-
self
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
assertion
|
38
|
-
end
|
39
|
-
|
40
|
-
def assertions
|
41
|
-
@assertions ||= []
|
42
|
-
end
|
43
|
-
end
|
@@ -1,98 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
|
-
|
3
|
-
class Validatable::AssertionsTest < Test::Unit::TestCase
|
4
|
-
expect "Klass does not contain a ValidationType for Attribute" do
|
5
|
-
klass = Class.new do
|
6
|
-
include Validatable::Assertions
|
7
|
-
end
|
8
|
-
klass.new.create_message_for_assertion(stub(:klass=>"Klass", :validation_type=>"ValidationType", :attribute=>"Attribute", :options=>{}))
|
9
|
-
end
|
10
|
-
|
11
|
-
expect "Klass does not contain a ValidationType for Attribute" do
|
12
|
-
klass = Class.new do
|
13
|
-
include Validatable::Assertions
|
14
|
-
end
|
15
|
-
klass.new.create_message_for_assertion(stub(:klass=>"Klass", :validation_type=>"ValidationType", :attribute=>"Attribute", :options=>{}))
|
16
|
-
end
|
17
|
-
|
18
|
-
expect false do
|
19
|
-
klass = Class.new do
|
20
|
-
include Validatable::Assertions
|
21
|
-
end
|
22
|
-
assertion = stub(:validation_type=>stub(:=== => true), :attribute => "attribute", :options=>{:level => 1, :times => 2})
|
23
|
-
validation = stub(:validation_type=>"validation_type", :attribute => "attribute", :level => 2, :times => 2)
|
24
|
-
klass.new.validation_matching_proc(assertion).call(validation)
|
25
|
-
end
|
26
|
-
|
27
|
-
expect false do
|
28
|
-
klass = Class.new do
|
29
|
-
include Validatable::Assertions
|
30
|
-
end
|
31
|
-
assertion = stub(:validation_type=>stub(:=== => true), :attribute => "non matching attribute", :options=>{})
|
32
|
-
validation = stub(:validation_type=>"validation_type", :attribute => nil)
|
33
|
-
klass.new.validation_matching_proc(assertion).call(validation)
|
34
|
-
end
|
35
|
-
|
36
|
-
expect false do
|
37
|
-
klass = Class.new do
|
38
|
-
include Validatable::Assertions
|
39
|
-
end
|
40
|
-
assertion = stub(:validation_type=>"non matching validation_type", :options=>{})
|
41
|
-
validation = stub(:validation_type=>"validation_type")
|
42
|
-
klass.new.validation_matching_proc(assertion).call(validation)
|
43
|
-
end
|
44
|
-
|
45
|
-
expect true do
|
46
|
-
klass = Class.new do
|
47
|
-
include Validatable::Assertions
|
48
|
-
end
|
49
|
-
assertion = stub(:validation_type=>stub(:=== => true), :attribute => "attribute", :options=>{:level => 1, :times => 2})
|
50
|
-
validation = stub(:validation_type=>"validation_type", :attribute => "attribute", :level => 1, :times => 2)
|
51
|
-
klass.new.validation_matching_proc(assertion).call(validation)
|
52
|
-
end
|
53
|
-
|
54
|
-
expect true do
|
55
|
-
Class.new do
|
56
|
-
include Validatable::Assertions
|
57
|
-
end
|
58
|
-
|
59
|
-
Class.respond_to? :must_validate
|
60
|
-
end
|
61
|
-
|
62
|
-
expect "test_validates_presence_of_name" do
|
63
|
-
test_class = Class.new(Test::Unit::TestCase) do
|
64
|
-
include Validatable::Assertions
|
65
|
-
end
|
66
|
-
test_class.create_test_name(stub(:validation_type=>Validatable::ValidatesPresenceOf, :attribute=>:name))
|
67
|
-
end
|
68
|
-
|
69
|
-
expect true do
|
70
|
-
test_class = Class.new(Test::Unit::TestCase) do
|
71
|
-
include Validatable::Assertions
|
72
|
-
end
|
73
|
-
|
74
|
-
test_class.define_test_method :some_test do
|
75
|
-
true
|
76
|
-
end
|
77
|
-
|
78
|
-
test_class.instance_methods.include? "some_test"
|
79
|
-
end
|
80
|
-
|
81
|
-
expect true do
|
82
|
-
klass = Class.new do
|
83
|
-
include Validatable
|
84
|
-
end
|
85
|
-
test_class = Class.new Test::Unit::TestCase do
|
86
|
-
include Validatable::Assertions
|
87
|
-
|
88
|
-
klass.must_validate do
|
89
|
-
presence_of :anything
|
90
|
-
end
|
91
|
-
|
92
|
-
end
|
93
|
-
|
94
|
-
test_class.any_instance.expects(:add_failure)
|
95
|
-
test_class.new(:test_validates_presence_of_anything).test_validates_presence_of_anything
|
96
|
-
true
|
97
|
-
end
|
98
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
|
-
|
3
|
-
class ValidationAssertionCollectorTest < Test::Unit::TestCase
|
4
|
-
expect 1 do
|
5
|
-
assertions = ValidationAssertionCollector.gather(Class.new) do
|
6
|
-
presence_of :name
|
7
|
-
end
|
8
|
-
assertions.size
|
9
|
-
end
|
10
|
-
|
11
|
-
expect "save this message" do
|
12
|
-
assertions = ValidationAssertionCollector.gather(Class.new) do
|
13
|
-
presence_of(:name).message("ignore this message").message("save this message")
|
14
|
-
end
|
15
|
-
assertions.first.options[:message]
|
16
|
-
end
|
17
|
-
|
18
|
-
expect :class_being_validated do
|
19
|
-
assertions = ValidationAssertionCollector.gather(:class_being_validated) do
|
20
|
-
presence_of(:name)
|
21
|
-
end
|
22
|
-
assertions.first.klass
|
23
|
-
end
|
24
|
-
|
25
|
-
expect NoMethodError do
|
26
|
-
assertions = ValidationAssertionCollector.gather(Class.new) do
|
27
|
-
presence_of(:name).invalid_option
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
expect NoMethodError do
|
32
|
-
assertions = ValidationAssertionCollector.gather(Class.new) do
|
33
|
-
true_for(:name)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
expect NoMethodError do
|
38
|
-
assertions = ValidationAssertionCollector.gather(Class.new) do
|
39
|
-
presence_of(:name).if lambda { true }
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
expect Validatable::ValidatesPresenceOf do
|
44
|
-
assertions = ValidationAssertionCollector.gather(Class.new) do
|
45
|
-
presence_of(:name)
|
46
|
-
end
|
47
|
-
assertions.first.validation_type
|
48
|
-
end
|
49
|
-
end
|