shoulda-matchers 3.0.1 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +3 -3
- data/CONTRIBUTING.md +60 -28
- data/Gemfile +1 -0
- data/Gemfile.lock +15 -12
- data/NEWS.md +111 -0
- data/README.md +94 -6
- data/Rakefile +10 -8
- data/custom_plan.rb +88 -0
- data/gemfiles/4.0.0.gemfile +1 -0
- data/gemfiles/4.0.0.gemfile.lock +21 -18
- data/gemfiles/4.0.1.gemfile +1 -0
- data/gemfiles/4.0.1.gemfile.lock +21 -18
- data/gemfiles/4.1.gemfile +1 -0
- data/gemfiles/4.1.gemfile.lock +21 -18
- data/gemfiles/4.2.gemfile +1 -0
- data/gemfiles/4.2.gemfile.lock +24 -21
- data/lib/shoulda/matchers/action_controller/permit_matcher.rb +6 -11
- data/lib/shoulda/matchers/active_model.rb +10 -1
- data/lib/shoulda/matchers/active_model/allow_value_matcher.rb +258 -180
- data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_changed_value_error.rb +45 -0
- data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_does_not_exist_error.rb +23 -0
- data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setter.rb +236 -0
- data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setter_and_validator.rb +62 -0
- data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setters.rb +40 -0
- data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setters_and_validators.rb +48 -0
- data/lib/shoulda/matchers/active_model/allow_value_matcher/successful_check.rb +14 -0
- data/lib/shoulda/matchers/active_model/allow_value_matcher/successful_setting.rb +14 -0
- data/lib/shoulda/matchers/active_model/disallow_value_matcher.rb +34 -14
- data/lib/shoulda/matchers/active_model/helpers.rb +9 -17
- data/lib/shoulda/matchers/active_model/numericality_matchers/comparison_matcher.rb +13 -6
- data/lib/shoulda/matchers/active_model/numericality_matchers/even_number_matcher.rb +13 -2
- data/lib/shoulda/matchers/active_model/numericality_matchers/numeric_type_matcher.rb +19 -35
- data/lib/shoulda/matchers/active_model/numericality_matchers/odd_number_matcher.rb +13 -2
- data/lib/shoulda/matchers/active_model/numericality_matchers/only_integer_matcher.rb +12 -2
- data/lib/shoulda/matchers/active_model/qualifiers.rb +12 -0
- data/lib/shoulda/matchers/active_model/qualifiers/ignore_interference_by_writer.rb +101 -0
- data/lib/shoulda/matchers/active_model/qualifiers/ignoring_interference_by_writer.rb +21 -0
- data/lib/shoulda/matchers/active_model/validate_absence_of_matcher.rb +30 -32
- data/lib/shoulda/matchers/active_model/validate_acceptance_of_matcher.rb +5 -8
- data/lib/shoulda/matchers/active_model/validate_confirmation_of_matcher.rb +22 -22
- data/lib/shoulda/matchers/active_model/validate_exclusion_of_matcher.rb +27 -16
- data/lib/shoulda/matchers/active_model/validate_inclusion_of_matcher.rb +58 -15
- data/lib/shoulda/matchers/active_model/validate_length_of_matcher.rb +22 -12
- data/lib/shoulda/matchers/active_model/validate_numericality_of_matcher.rb +165 -87
- data/lib/shoulda/matchers/active_model/validate_presence_of_matcher.rb +7 -9
- data/lib/shoulda/matchers/active_model/validation_matcher.rb +111 -49
- data/lib/shoulda/matchers/active_model/validation_matcher/build_description.rb +60 -0
- data/lib/shoulda/matchers/active_model/validator.rb +71 -52
- data/lib/shoulda/matchers/active_record/define_enum_for_matcher.rb +19 -5
- data/lib/shoulda/matchers/active_record/validate_uniqueness_of_matcher.rb +450 -124
- data/lib/shoulda/matchers/util.rb +43 -0
- data/lib/shoulda/matchers/util/word_wrap.rb +59 -31
- data/lib/shoulda/matchers/version.rb +1 -1
- data/script/update_gem_in_all_appraisals +1 -1
- data/script/update_gems_in_all_appraisals +1 -1
- data/spec/acceptance/multiple_libraries_integration_spec.rb +5 -2
- data/spec/acceptance/rails_integration_spec.rb +6 -2
- data/spec/spec_helper.rb +1 -3
- data/spec/support/acceptance/helpers/step_helpers.rb +4 -1
- data/spec/support/tests/current_bundle.rb +21 -7
- data/spec/support/unit/active_record/create_table.rb +54 -0
- data/spec/support/unit/attribute.rb +47 -0
- data/spec/support/unit/capture.rb +6 -0
- data/spec/support/unit/change_value.rb +111 -0
- data/spec/support/unit/create_model_arguments/basic.rb +135 -0
- data/spec/support/unit/create_model_arguments/has_many.rb +15 -0
- data/spec/support/unit/create_model_arguments/uniqueness_matcher.rb +74 -0
- data/spec/support/unit/helpers/active_record_versions.rb +1 -1
- data/spec/support/unit/helpers/class_builder.rb +61 -47
- data/spec/support/unit/helpers/database_helpers.rb +5 -3
- data/spec/support/unit/helpers/model_builder.rb +77 -97
- data/spec/support/unit/helpers/validation_matcher_scenario_helpers.rb +44 -0
- data/spec/support/unit/load_environment.rb +12 -0
- data/spec/support/unit/matchers/fail_with_message_including_matcher.rb +2 -2
- data/spec/support/unit/matchers/fail_with_message_matcher.rb +12 -1
- data/spec/support/unit/model_creation_strategies/active_model.rb +111 -0
- data/spec/support/unit/model_creation_strategies/active_record.rb +77 -0
- data/spec/support/unit/model_creators.rb +19 -0
- data/spec/support/unit/model_creators/active_model.rb +39 -0
- data/spec/support/unit/model_creators/active_record.rb +43 -0
- data/spec/support/unit/model_creators/active_record/has_and_belongs_to_many.rb +95 -0
- data/spec/support/unit/model_creators/active_record/has_many.rb +67 -0
- data/spec/support/unit/model_creators/active_record/uniqueness_matcher.rb +42 -0
- data/spec/support/unit/model_creators/basic.rb +97 -0
- data/spec/support/unit/rails_application.rb +1 -1
- data/spec/support/unit/record_validating_confirmation_builder.rb +3 -7
- data/spec/support/unit/shared_examples/ignoring_interference_by_writer.rb +79 -0
- data/spec/support/unit/validation_matcher_scenario.rb +62 -0
- data/spec/unit/shoulda/matchers/active_model/allow_mass_assignment_of_matcher_spec.rb +4 -0
- data/spec/unit/shoulda/matchers/active_model/allow_value_matcher_spec.rb +575 -140
- data/spec/unit/shoulda/matchers/active_model/validate_absence_of_matcher_spec.rb +115 -15
- data/spec/unit/shoulda/matchers/active_model/validate_acceptance_of_matcher_spec.rb +42 -4
- data/spec/unit/shoulda/matchers/active_model/validate_confirmation_of_matcher_spec.rb +92 -6
- data/spec/unit/shoulda/matchers/active_model/validate_exclusion_of_matcher_spec.rb +122 -10
- data/spec/unit/shoulda/matchers/active_model/validate_inclusion_of_matcher_spec.rb +306 -58
- data/spec/unit/shoulda/matchers/active_model/validate_length_of_matcher_spec.rb +122 -3
- data/spec/unit/shoulda/matchers/active_model/validate_numericality_of_matcher_spec.rb +805 -131
- data/spec/unit/shoulda/matchers/active_model/validate_presence_of_matcher_spec.rb +196 -29
- data/spec/unit/shoulda/matchers/active_record/define_enum_for_matcher_spec.rb +82 -40
- data/spec/unit/shoulda/matchers/active_record/validate_uniqueness_of_matcher_spec.rb +600 -101
- data/spec/unit/shoulda/matchers/util/word_wrap_spec.rb +88 -33
- data/spec/unit_spec_helper.rb +10 -22
- data/zeus.json +11 -0
- metadata +64 -23
- data/lib/shoulda/matchers/active_model/strict_validator.rb +0 -51
- data/spec/support/unit/shared_examples/numerical_type_submatcher.rb +0 -15
- data/spec/unit/shoulda/matchers/active_model/numericality_matchers/comparison_matcher_spec.rb +0 -288
- data/spec/unit/shoulda/matchers/active_model/numericality_matchers/even_number_matcher_spec.rb +0 -100
- data/spec/unit/shoulda/matchers/active_model/numericality_matchers/odd_number_matcher_spec.rb +0 -100
- data/spec/unit/shoulda/matchers/active_model/numericality_matchers/only_integer_matcher_spec.rb +0 -100
@@ -1,51 +0,0 @@
|
|
1
|
-
module Shoulda
|
2
|
-
module Matchers
|
3
|
-
module ActiveModel
|
4
|
-
# @private
|
5
|
-
module StrictValidator
|
6
|
-
def allow_description(allowed_values)
|
7
|
-
"doesn't raise when #{attribute} is set to #{allowed_values}"
|
8
|
-
end
|
9
|
-
|
10
|
-
def expected_message_from(attribute_message)
|
11
|
-
"#{human_attribute_name} #{attribute_message}"
|
12
|
-
end
|
13
|
-
|
14
|
-
def formatted_messages
|
15
|
-
[messages.first.message]
|
16
|
-
end
|
17
|
-
|
18
|
-
def messages_description
|
19
|
-
if has_messages?
|
20
|
-
': ' + messages.first.message.inspect
|
21
|
-
else
|
22
|
-
' no exception'
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def expected_messages_description(expected_message)
|
27
|
-
if expected_message
|
28
|
-
"exception to include #{expected_message.inspect}"
|
29
|
-
else
|
30
|
-
'an exception to have been raised'
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
protected
|
35
|
-
|
36
|
-
def collect_messages
|
37
|
-
validation_exceptions
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
41
|
-
|
42
|
-
def validation_exceptions
|
43
|
-
record.valid?(context)
|
44
|
-
[]
|
45
|
-
rescue ::ActiveModel::StrictValidationFailed => exception
|
46
|
-
[exception]
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
shared_examples 'a numerical type submatcher' do
|
2
|
-
it 'implements the allowed_type method' do
|
3
|
-
expect(subject).to respond_to(:allowed_type).with(0).arguments
|
4
|
-
expect { subject.allowed_type }.not_to raise_error
|
5
|
-
end
|
6
|
-
|
7
|
-
it 'implements the diff_to_compare' do
|
8
|
-
expect(subject).to respond_to(:diff_to_compare).with(0).arguments
|
9
|
-
expect { subject.diff_to_compare }.not_to raise_error
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'returns itself when given a message' do
|
13
|
-
expect(subject.with_message('some message')).to eq subject
|
14
|
-
end
|
15
|
-
end
|
data/spec/unit/shoulda/matchers/active_model/numericality_matchers/comparison_matcher_spec.rb
DELETED
@@ -1,288 +0,0 @@
|
|
1
|
-
require 'unit_spec_helper'
|
2
|
-
|
3
|
-
describe Shoulda::Matchers::ActiveModel::NumericalityMatchers::ComparisonMatcher do
|
4
|
-
it_behaves_like 'a numerical submatcher' do
|
5
|
-
subject { build_matcher }
|
6
|
-
end
|
7
|
-
|
8
|
-
shared_examples_for 'strict qualifier' do
|
9
|
-
context 'asserting strict validation when validating strictly' do
|
10
|
-
it 'accepts' do
|
11
|
-
record = instance_with_validations(
|
12
|
-
validation_qualifier => 1,
|
13
|
-
strict: true
|
14
|
-
)
|
15
|
-
matcher = build_matcher(operator: operator, value: 1).strict
|
16
|
-
expect(record).to matcher
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
context 'asserting non-strict validation when validating strictly' do
|
21
|
-
it 'rejects' do
|
22
|
-
pending 'This needs to be fixed'
|
23
|
-
record = instance_with_validations(
|
24
|
-
validation_qualifier => 1,
|
25
|
-
strict: true
|
26
|
-
)
|
27
|
-
matcher = build_matcher(operator: operator, value: 1)
|
28
|
-
expect(record).not_to matcher
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
context 'asserting strict validation when not validating strictly' do
|
33
|
-
it 'rejects' do
|
34
|
-
record = instance_with_validations(validation_qualifier => 1)
|
35
|
-
matcher = build_matcher(operator: operator, value: 1).strict
|
36
|
-
expect(record).not_to matcher
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
context 'when initialized without correct numerical matcher' do
|
42
|
-
it 'raises an ArgumentError' do
|
43
|
-
numericality_matcher = double
|
44
|
-
expect { described_class.new(numericality_matcher, 0, :>) }.
|
45
|
-
to raise_error(ArgumentError)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
describe 'is_greater_than' do
|
50
|
-
include_examples 'strict qualifier'
|
51
|
-
|
52
|
-
it do
|
53
|
-
record = instance_with_validations(greater_than: 1.5)
|
54
|
-
matcher = build_matcher(operator: :>, value: 2)
|
55
|
-
expect(record).not_to matcher
|
56
|
-
end
|
57
|
-
|
58
|
-
it do
|
59
|
-
record = instance_with_validations(greater_than: 2)
|
60
|
-
matcher = build_matcher(operator: :>, value: 2)
|
61
|
-
expect(record).to matcher
|
62
|
-
end
|
63
|
-
|
64
|
-
it do
|
65
|
-
record = instance_with_validations(greater_than: 2.5)
|
66
|
-
matcher = build_matcher(operator: :>, value: 2)
|
67
|
-
expect(record).not_to matcher
|
68
|
-
end
|
69
|
-
|
70
|
-
it do
|
71
|
-
record = instance_without_validations
|
72
|
-
matcher = build_matcher(operator: :>, value: 2)
|
73
|
-
expect(record).not_to matcher
|
74
|
-
end
|
75
|
-
|
76
|
-
def operator
|
77
|
-
:>
|
78
|
-
end
|
79
|
-
|
80
|
-
def validation_qualifier
|
81
|
-
:greater_than
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
describe 'is_greater_than_or_equal_to' do
|
86
|
-
include_examples 'strict qualifier'
|
87
|
-
|
88
|
-
it do
|
89
|
-
record = instance_with_validations(greater_than_or_equal_to: 1.5)
|
90
|
-
matcher = build_matcher(operator: :>=, value: 2)
|
91
|
-
expect(record).not_to matcher
|
92
|
-
end
|
93
|
-
|
94
|
-
it do
|
95
|
-
record = instance_with_validations(greater_than_or_equal_to: 2)
|
96
|
-
matcher = build_matcher(operator: :>=, value: 2)
|
97
|
-
expect(record).to matcher
|
98
|
-
end
|
99
|
-
|
100
|
-
it do
|
101
|
-
record = instance_with_validations(greater_than_or_equal_to: 2.5)
|
102
|
-
matcher = build_matcher(operator: :>=, value: 2)
|
103
|
-
expect(record).not_to matcher
|
104
|
-
end
|
105
|
-
|
106
|
-
it do
|
107
|
-
record = instance_without_validations
|
108
|
-
matcher = build_matcher(operator: :>=, value: 2)
|
109
|
-
expect(record).not_to matcher
|
110
|
-
end
|
111
|
-
|
112
|
-
def operator
|
113
|
-
:>=
|
114
|
-
end
|
115
|
-
|
116
|
-
def validation_qualifier
|
117
|
-
:greater_than_or_equal_to
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
describe 'is_less_than' do
|
122
|
-
include_examples 'strict qualifier'
|
123
|
-
|
124
|
-
it do
|
125
|
-
record = instance_with_validations(less_than: 1.5)
|
126
|
-
matcher = build_matcher(operator: :<, value: 2)
|
127
|
-
expect(record).not_to matcher
|
128
|
-
end
|
129
|
-
|
130
|
-
it do
|
131
|
-
record = instance_with_validations(less_than: 2)
|
132
|
-
matcher = build_matcher(operator: :<, value: 2)
|
133
|
-
expect(record).to matcher
|
134
|
-
end
|
135
|
-
|
136
|
-
it do
|
137
|
-
record = instance_with_validations(less_than: 2.5)
|
138
|
-
matcher = build_matcher(operator: :<, value: 2)
|
139
|
-
expect(record).not_to matcher
|
140
|
-
end
|
141
|
-
|
142
|
-
it do
|
143
|
-
record = instance_without_validations
|
144
|
-
matcher = build_matcher(operator: :<, value: 2)
|
145
|
-
expect(record).not_to matcher
|
146
|
-
end
|
147
|
-
|
148
|
-
def operator
|
149
|
-
:<
|
150
|
-
end
|
151
|
-
|
152
|
-
def validation_qualifier
|
153
|
-
:less_than
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
describe 'is_less_than_or_equal_to' do
|
158
|
-
include_examples 'strict qualifier'
|
159
|
-
|
160
|
-
it do
|
161
|
-
record = instance_with_validations(less_than_or_equal_to: 1.5)
|
162
|
-
matcher = build_matcher(operator: :<=, value: 2)
|
163
|
-
expect(record).not_to matcher
|
164
|
-
end
|
165
|
-
|
166
|
-
it do
|
167
|
-
record = instance_with_validations(less_than_or_equal_to: 2)
|
168
|
-
matcher = build_matcher(operator: :<=, value: 2)
|
169
|
-
expect(record).to matcher
|
170
|
-
end
|
171
|
-
|
172
|
-
it do
|
173
|
-
record = instance_with_validations(less_than_or_equal_to: 2.5)
|
174
|
-
matcher = build_matcher(operator: :<=, value: 2)
|
175
|
-
expect(record).not_to matcher
|
176
|
-
end
|
177
|
-
|
178
|
-
it do
|
179
|
-
record = instance_without_validations
|
180
|
-
matcher = build_matcher(operator: :<=, value: 2)
|
181
|
-
expect(record).not_to matcher
|
182
|
-
end
|
183
|
-
|
184
|
-
def operator
|
185
|
-
:<=
|
186
|
-
end
|
187
|
-
|
188
|
-
def validation_qualifier
|
189
|
-
:less_than_or_equal_to
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
|
-
describe 'is_equal_to' do
|
194
|
-
include_examples 'strict qualifier'
|
195
|
-
|
196
|
-
it do
|
197
|
-
record = instance_with_validations(equal_to: 1.5)
|
198
|
-
matcher = build_matcher(operator: :==, value: 2)
|
199
|
-
expect(record).not_to matcher
|
200
|
-
end
|
201
|
-
|
202
|
-
it do
|
203
|
-
record = instance_with_validations(equal_to: 2)
|
204
|
-
matcher = build_matcher(operator: :==, value: 2)
|
205
|
-
expect(record).to matcher
|
206
|
-
end
|
207
|
-
|
208
|
-
it do
|
209
|
-
record = instance_with_validations(equal_to: 2.5)
|
210
|
-
matcher = build_matcher(operator: :==, value: 2)
|
211
|
-
expect(record).not_to matcher
|
212
|
-
end
|
213
|
-
|
214
|
-
it do
|
215
|
-
record = instance_without_validations
|
216
|
-
matcher = build_matcher(operator: :==, value: 2)
|
217
|
-
expect(record).not_to matcher
|
218
|
-
end
|
219
|
-
|
220
|
-
def operator
|
221
|
-
:==
|
222
|
-
end
|
223
|
-
|
224
|
-
def validation_qualifier
|
225
|
-
:equal_to
|
226
|
-
end
|
227
|
-
end
|
228
|
-
|
229
|
-
describe 'with_message' do
|
230
|
-
it 'verifies the message for the validation' do
|
231
|
-
instance = instance_with_validations(equal_to: 0, message: 'Must be zero')
|
232
|
-
matcher = build_matcher.with_message('Must be zero')
|
233
|
-
expect(instance).to matcher
|
234
|
-
end
|
235
|
-
end
|
236
|
-
|
237
|
-
describe '#comparison_description' do
|
238
|
-
tests = [
|
239
|
-
{ operator: :>, value: 0, expectation: 'greater than 0' },
|
240
|
-
{ operator: :>=, value: -1.0, expectation: 'greater than or equal to -1.0' },
|
241
|
-
{ operator: :==, value: 2.2, expectation: 'equal to 2.2' },
|
242
|
-
{ operator: :<, value: -3, expectation: 'less than -3' },
|
243
|
-
{ operator: :<=, value: 4, expectation: 'less than or equal to 4' },
|
244
|
-
]
|
245
|
-
|
246
|
-
tests.each do |test|
|
247
|
-
context "with :#{test[:operator]} as operator and #{test[:value]} as value" do
|
248
|
-
it do
|
249
|
-
matcher = build_matcher(operator: test[:operator], value: test[:value])
|
250
|
-
expect(matcher.comparison_description).to eq test[:expectation]
|
251
|
-
end
|
252
|
-
end
|
253
|
-
end
|
254
|
-
end
|
255
|
-
|
256
|
-
def model_with_validations(options = {})
|
257
|
-
define_model :example, attribute_name => :string do |model|
|
258
|
-
model.validates_numericality_of(attribute_name, options)
|
259
|
-
model.attr_accessible(attribute_name)
|
260
|
-
end
|
261
|
-
end
|
262
|
-
|
263
|
-
def instance_with_validations(options = {})
|
264
|
-
model_with_validations(options).new(attribute_name => '1')
|
265
|
-
end
|
266
|
-
|
267
|
-
def model_without_validations
|
268
|
-
define_model :example, attribute_name => :string do |model|
|
269
|
-
model.attr_accessible(attribute_name)
|
270
|
-
end
|
271
|
-
end
|
272
|
-
|
273
|
-
def instance_without_validations
|
274
|
-
model_without_validations.new
|
275
|
-
end
|
276
|
-
|
277
|
-
def attribute_name
|
278
|
-
:attr
|
279
|
-
end
|
280
|
-
|
281
|
-
def build_matcher(operator: :==, value: 0)
|
282
|
-
described_class.new(numericality_matcher, value, operator).for(attribute_name)
|
283
|
-
end
|
284
|
-
|
285
|
-
def numericality_matcher
|
286
|
-
double(diff_to_compare: 1, given_numeric_column?: nil)
|
287
|
-
end
|
288
|
-
end
|
data/spec/unit/shoulda/matchers/active_model/numericality_matchers/even_number_matcher_spec.rb
DELETED
@@ -1,100 +0,0 @@
|
|
1
|
-
require 'unit_spec_helper'
|
2
|
-
|
3
|
-
describe Shoulda::Matchers::ActiveModel::NumericalityMatchers::EvenNumberMatcher do
|
4
|
-
subject { described_class.new(numericality_matcher, :attr) }
|
5
|
-
|
6
|
-
it_behaves_like 'a numerical submatcher'
|
7
|
-
it_behaves_like 'a numerical type submatcher'
|
8
|
-
|
9
|
-
it 'allows even number' do
|
10
|
-
expect(subject.allowed_type).to eq 'even numbers'
|
11
|
-
end
|
12
|
-
|
13
|
-
describe '#diff_to_compare' do
|
14
|
-
it { expect(subject.diff_to_compare).to eq 2 }
|
15
|
-
end
|
16
|
-
|
17
|
-
context 'when the model has an even validation' do
|
18
|
-
it 'matches' do
|
19
|
-
match = subject
|
20
|
-
expect(validating_even_number).to match
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
context 'when the model does not have an even validation' do
|
25
|
-
it 'does not match' do
|
26
|
-
match = subject
|
27
|
-
expect(not_validating_even_number).not_to match
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'fails with the ActiveRecord :even message' do
|
31
|
-
match = subject
|
32
|
-
expect {
|
33
|
-
expect(not_validating_even_number).to match
|
34
|
-
}.to fail_with_message_including('Expected errors to include "must be even"')
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
context 'with custom validation message' do
|
39
|
-
it 'only accepts even number values for that attribute with that message' do
|
40
|
-
expect(validating_even_number(message: 'custom')).to subject.with_message(/custom/)
|
41
|
-
end
|
42
|
-
|
43
|
-
it 'fails even number values for that attribute with another message' do
|
44
|
-
expect(validating_even_number(message: 'custom')).not_to subject.with_message(/wrong/)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
context 'asserting strict validation when validating strictly' do
|
49
|
-
it 'accepts' do
|
50
|
-
expect(validating_even_number(strict: true)).to subject.strict
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
context 'asserting non-strict validation when validating strictly' do
|
55
|
-
it 'rejects' do
|
56
|
-
pending 'This needs to be fixed'
|
57
|
-
expect(validating_even_number(strict: true)).not_to subject
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
context 'asserting strict validation when not validating strictly' do
|
62
|
-
it 'rejects' do
|
63
|
-
expect(validating_even_number).not_to subject.strict
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
context 'qualified with on and validating with on' do
|
68
|
-
it 'accepts' do
|
69
|
-
expect(validating_even_number(on: :customizable)).
|
70
|
-
to subject.on(:customizable)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
context 'qualified with on but not validating with on' do
|
75
|
-
it 'accepts since the validation never considers a context' do
|
76
|
-
expect(validating_even_number).to subject.on(:customizable)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
context 'not qualified with on but validating with on' do
|
81
|
-
it 'rejects since the validation never runs' do
|
82
|
-
expect(validating_even_number(on: :customizable)).
|
83
|
-
not_to subject
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def numericality_matcher
|
88
|
-
double(:numericality_matcher, given_numeric_column?: nil)
|
89
|
-
end
|
90
|
-
|
91
|
-
def validating_even_number(options = {})
|
92
|
-
define_model :example, attr: :string do
|
93
|
-
validates_numericality_of :attr, { even: true }.merge(options)
|
94
|
-
end.new
|
95
|
-
end
|
96
|
-
|
97
|
-
def not_validating_even_number
|
98
|
-
define_model(:example, attr: :string).new
|
99
|
-
end
|
100
|
-
end
|