1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
# frozen_string_literal: true
require "cases/helper"
require "models/person"
require "models/topic"
require "models/person_with_validator"
require "validators/namespace/email_validator"
class ValidatesTest < ActiveModel::TestCase
setup :reset_callbacks
teardown :reset_callbacks
def reset_callbacks
Person.clear_validators!
Topic.clear_validators!
PersonWithValidator.clear_validators!
end
def test_validates_with_messages_empty
Person.validates :title, presence: { message: "" }
person = Person.new
assert !person.valid?, "person should not be valid."
end
def test_validates_with_built_in_validation
Person.validates :title, numericality: true
person = Person.new
person.valid?
assert_equal ["is not a number"], person.errors[:title]
end
def test_validates_with_attribute_specified_as_string
Person.validates "title", numericality: true
person = Person.new
person.valid?
assert_equal ["is not a number"], person.errors[:title]
person = Person.new
person.title = 123
assert person.valid?
end
def test_validates_with_built_in_validation_and_options
Person.validates :salary, numericality: { message: "my custom message" }
person = Person.new
person.valid?
assert_equal ["my custom message"], person.errors[:salary]
end
def test_validates_with_validator_class
Person.validates :karma, email: true
person = Person.new
person.valid?
assert_equal ["is not an email"], person.errors[:karma]
end
def test_validates_with_namespaced_validator_class
Person.validates :karma, 'namespace/email': true
person = Person.new
person.valid?
assert_equal ["is not an email"], person.errors[:karma]
end
def test_validates_with_if_as_local_conditions
Person.validates :karma, presence: true, email: { unless: :condition_is_true }
person = Person.new
person.valid?
assert_equal ["can't be blank"], person.errors[:karma]
end
def test_validates_with_if_as_shared_conditions
Person.validates :karma, presence: true, email: true, if: :condition_is_true
person = Person.new
person.valid?
assert_equal ["can't be blank", "is not an email"], person.errors[:karma].sort
end
def test_validates_with_unless_shared_conditions
Person.validates :karma, presence: true, email: true, unless: :condition_is_true
person = Person.new
assert person.valid?
end
def test_validates_with_allow_nil_shared_conditions
Person.validates :karma, length: { minimum: 20 }, email: true, allow_nil: true
person = Person.new
assert person.valid?
end
def test_validates_with_regexp
Person.validates :karma, format: /positive|negative/
person = Person.new
assert person.invalid?
assert_equal ["is invalid"], person.errors[:karma]
person.karma = "positive"
assert person.valid?
end
def test_validates_with_array
Person.validates :gender, inclusion: %w(m f)
person = Person.new
assert person.invalid?
assert_equal ["is not included in the list"], person.errors[:gender]
person.gender = "m"
assert person.valid?
end
def test_validates_with_range
Person.validates :karma, length: 6..20
person = Person.new
assert person.invalid?
assert_equal ["is too short (minimum is 6 characters)"], person.errors[:karma]
person.karma = "something"
assert person.valid?
end
def test_validates_with_validator_class_and_options
Person.validates :karma, email: { message: "my custom message" }
person = Person.new
person.valid?
assert_equal ["my custom message"], person.errors[:karma]
end
def test_validates_with_unknown_validator
assert_raise(ArgumentError) { Person.validates :karma, unknown: true }
end
def test_validates_with_included_validator
PersonWithValidator.validates :title, presence: true
person = PersonWithValidator.new
person.valid?
assert_equal ["Local validator"], person.errors[:title]
end
def test_validates_with_included_validator_and_options
PersonWithValidator.validates :title, presence: { custom: " please" }
person = PersonWithValidator.new
person.valid?
assert_equal ["Local validator please"], person.errors[:title]
end
def test_validates_with_included_validator_and_wildcard_shortcut
# Shortcut for PersonWithValidator.validates :title, like: { with: "Mr." }
PersonWithValidator.validates :title, like: "Mr."
person = PersonWithValidator.new
person.title = "Ms. Pacman"
person.valid?
assert_equal ["does not appear to be like Mr."], person.errors[:title]
end
def test_defining_extra_default_keys_for_validates
Topic.validates :title, confirmation: true, message: "Y U NO CONFIRM"
topic = Topic.new
topic.title = "What's happening"
topic.title_confirmation = "Not this"
assert !topic.valid?
assert_equal ["Y U NO CONFIRM"], topic.errors[:title_confirmation]
end
end
|