shoulda-matchers 3.0.0 → 3.0.1
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.
- checksums.yaml +4 -4
- data/.yardopts +3 -1
- data/Gemfile +1 -2
- data/Gemfile.lock +8 -2
- data/NEWS.md +29 -1
- data/README.md +3 -11
- data/doc_config/yard/templates/default/fulldoc/html/css/global.css +17 -0
- data/doc_config/yard/templates/default/fulldoc/html/css/style.css +3 -4
- data/doc_config/yard/templates/default/layout/html/breadcrumb.erb +1 -1
- data/doc_config/yard/templates/default/layout/html/footer.erb +6 -0
- data/docs/errors/NonCaseSwappableValueError.md +111 -0
- data/gemfiles/4.0.0.gemfile +1 -2
- data/gemfiles/4.0.0.gemfile.lock +5 -2
- data/gemfiles/4.0.1.gemfile +1 -2
- data/gemfiles/4.0.1.gemfile.lock +5 -2
- data/gemfiles/4.1.gemfile +1 -2
- data/gemfiles/4.1.gemfile.lock +5 -2
- data/gemfiles/4.2.gemfile +1 -2
- data/gemfiles/4.2.gemfile.lock +5 -2
- data/lib/shoulda/matchers/action_controller/respond_with_matcher.rb +1 -5
- data/lib/shoulda/matchers/active_model/allow_value_matcher.rb +26 -4
- data/lib/shoulda/matchers/active_model/numericality_matchers/comparison_matcher.rb +9 -8
- data/lib/shoulda/matchers/active_model/numericality_matchers/even_number_matcher.rb +14 -8
- data/lib/shoulda/matchers/active_model/numericality_matchers/numeric_type_matcher.rb +47 -12
- data/lib/shoulda/matchers/active_model/numericality_matchers/odd_number_matcher.rb +15 -9
- data/lib/shoulda/matchers/active_model/numericality_matchers/only_integer_matcher.rb +14 -7
- data/lib/shoulda/matchers/active_model/validate_inclusion_of_matcher.rb +16 -4
- data/lib/shoulda/matchers/active_model/validate_numericality_of_matcher.rb +67 -5
- data/lib/shoulda/matchers/active_record/validate_uniqueness_of_matcher.rb +35 -0
- data/lib/shoulda/matchers/util.rb +2 -0
- data/lib/shoulda/matchers/util/word_wrap.rb +178 -0
- data/lib/shoulda/matchers/version.rb +1 -1
- data/lib/shoulda/matchers/warn.rb +1 -10
- data/spec/acceptance_spec_helper.rb +2 -10
- data/spec/doublespeak_spec_helper.rb +1 -17
- data/spec/spec_helper.rb +23 -0
- data/spec/unit/shoulda/matchers/active_model/numericality_matchers/comparison_matcher_spec.rb +1 -1
- data/spec/unit/shoulda/matchers/active_model/numericality_matchers/even_number_matcher_spec.rb +5 -2
- data/spec/unit/shoulda/matchers/active_model/numericality_matchers/odd_number_matcher_spec.rb +5 -2
- data/spec/unit/shoulda/matchers/active_model/numericality_matchers/only_integer_matcher_spec.rb +5 -1
- data/spec/unit/shoulda/matchers/active_model/validate_inclusion_of_matcher_spec.rb +91 -4
- data/spec/unit/shoulda/matchers/active_model/validate_numericality_of_matcher_spec.rb +292 -2
- data/spec/unit/shoulda/matchers/active_record/validate_uniqueness_of_matcher_spec.rb +16 -2
- data/spec/unit/shoulda/matchers/util/word_wrap_spec.rb +197 -0
- data/spec/unit_spec_helper.rb +1 -16
- data/tasks/documentation.rb +10 -17
- metadata +9 -2
data/gemfiles/4.2.gemfile
CHANGED
@@ -7,8 +7,7 @@ gem "bundler", "~> 1.1"
|
|
7
7
|
gem "pry", :github => "pry/pry"
|
8
8
|
gem "pry-byebug"
|
9
9
|
gem "rake", "~> 10.0"
|
10
|
-
gem "rspec
|
11
|
-
gem "rspec-expectations", ">= 3.2.0", "< 4"
|
10
|
+
gem "rspec", "~> 3.2"
|
12
11
|
gem "yard"
|
13
12
|
gem "redcarpet"
|
14
13
|
gem "pygments.rb"
|
data/gemfiles/4.2.gemfile.lock
CHANGED
@@ -141,6 +141,10 @@ GEM
|
|
141
141
|
rake (10.4.2)
|
142
142
|
rdoc (4.2.0)
|
143
143
|
redcarpet (3.3.2)
|
144
|
+
rspec (3.3.0)
|
145
|
+
rspec-core (~> 3.3.0)
|
146
|
+
rspec-expectations (~> 3.3.0)
|
147
|
+
rspec-mocks (~> 3.3.0)
|
144
148
|
rspec-core (3.3.2)
|
145
149
|
rspec-support (~> 3.3.0)
|
146
150
|
rspec-expectations (3.3.1)
|
@@ -219,8 +223,7 @@ DEPENDENCIES
|
|
219
223
|
rails (~> 4.2.0)
|
220
224
|
rake (~> 10.0)
|
221
225
|
redcarpet
|
222
|
-
rspec
|
223
|
-
rspec-expectations (>= 3.2.0, < 4)
|
226
|
+
rspec (~> 3.2)
|
224
227
|
rspec-rails (>= 3.2.0, < 4)
|
225
228
|
sass-rails (~> 5.0)
|
226
229
|
sdoc (~> 0.4.0)
|
@@ -133,11 +133,7 @@ module Shoulda
|
|
133
133
|
when :missing then 404
|
134
134
|
when :error then 500..599
|
135
135
|
when Symbol
|
136
|
-
|
137
|
-
::Rack::Utils::SYMBOL_TO_STATUS_CODE[potential_symbol]
|
138
|
-
else
|
139
|
-
::ActionController::Base::SYMBOL_TO_STATUS_CODE[potential_symbol]
|
140
|
-
end
|
136
|
+
::Rack::Utils::SYMBOL_TO_STATUS_CODE[potential_symbol]
|
141
137
|
else
|
142
138
|
potential_symbol
|
143
139
|
end
|
@@ -91,9 +91,9 @@ module Shoulda
|
|
91
91
|
# end
|
92
92
|
# end
|
93
93
|
#
|
94
|
-
# * You're attempting to assert that
|
95
|
-
# string that contains non-numeric characters, yet the writer method
|
96
|
-
# that attribute strips out non-numeric characters:
|
94
|
+
# * You're attempting to assert that a numeric attribute should not allow
|
95
|
+
# a string that contains non-numeric characters, yet the writer method
|
96
|
+
# for that attribute strips out non-numeric characters:
|
97
97
|
#
|
98
98
|
# class Foo
|
99
99
|
# include ActiveModel::Model
|
@@ -326,7 +326,29 @@ module Shoulda
|
|
326
326
|
attr_accessor :model, :attribute, :expected_value, :actual_value
|
327
327
|
|
328
328
|
def message
|
329
|
-
|
329
|
+
Shoulda::Matchers.word_wrap <<-MESSAGE
|
330
|
+
The allow_value matcher attempted to set :#{attribute} on #{model.name} to
|
331
|
+
#{expected_value.inspect}, but when the attribute was read back, it
|
332
|
+
had stored #{actual_value.inspect} instead.
|
333
|
+
|
334
|
+
This creates a problem because it means that the model is behaving in a way that
|
335
|
+
is interfering with the test -- there's a mismatch between the test that was
|
336
|
+
written and test that was actually run.
|
337
|
+
|
338
|
+
There are a couple of reasons why this could be happening:
|
339
|
+
|
340
|
+
* The writer method for :#{attribute} has been overridden and contains custom
|
341
|
+
logic to prevent certain values from being set or change which values are
|
342
|
+
stored.
|
343
|
+
* ActiveRecord is typecasting the incoming value.
|
344
|
+
|
345
|
+
Regardless, the fact you're seeing this message usually indicates a larger
|
346
|
+
problem. Please file an issue on the GitHub repo for shoulda-matchers,
|
347
|
+
including details about your model and the test you've written, and we can point
|
348
|
+
you in the right direction:
|
349
|
+
|
350
|
+
https://github.com/thoughtbot/shoulda-matchers/issues
|
351
|
+
MESSAGE
|
330
352
|
end
|
331
353
|
end
|
332
354
|
|
@@ -20,7 +20,6 @@ module Shoulda
|
|
20
20
|
@value = value
|
21
21
|
@operator = operator
|
22
22
|
@message = ERROR_MESSAGES[operator]
|
23
|
-
@comparison_combos = comparison_combos
|
24
23
|
@strict = false
|
25
24
|
end
|
26
25
|
|
@@ -80,11 +79,7 @@ module Shoulda
|
|
80
79
|
def submatchers
|
81
80
|
@_submatchers ||=
|
82
81
|
comparison_combos.map do |diff, submatcher_method_name|
|
83
|
-
matcher = __send__(
|
84
|
-
submatcher_method_name,
|
85
|
-
(@value + diff).to_s,
|
86
|
-
nil
|
87
|
-
)
|
82
|
+
matcher = __send__(submatcher_method_name, diff, nil)
|
88
83
|
matcher.with_message(@message, values: { count: @value })
|
89
84
|
matcher
|
90
85
|
end
|
@@ -127,8 +122,14 @@ module Shoulda
|
|
127
122
|
end
|
128
123
|
|
129
124
|
def diffs_to_compare
|
130
|
-
|
131
|
-
[-
|
125
|
+
diff_to_compare = @numericality_matcher.diff_to_compare
|
126
|
+
values = [-1, 0, 1].map { |sign| @value + (diff_to_compare * sign) }
|
127
|
+
|
128
|
+
if @numericality_matcher.given_numeric_column?
|
129
|
+
values
|
130
|
+
else
|
131
|
+
values.map(&:to_s)
|
132
|
+
end
|
132
133
|
end
|
133
134
|
|
134
135
|
def comparison_expectation
|
@@ -6,14 +6,6 @@ module Shoulda
|
|
6
6
|
class EvenNumberMatcher < NumericTypeMatcher
|
7
7
|
NON_EVEN_NUMBER_VALUE = 1
|
8
8
|
|
9
|
-
def initialize(attribute, options = {})
|
10
|
-
@attribute = attribute
|
11
|
-
@disallow_value_matcher =
|
12
|
-
DisallowValueMatcher.new(NON_EVEN_NUMBER_VALUE.to_s).
|
13
|
-
for(@attribute).
|
14
|
-
with_message(:even)
|
15
|
-
end
|
16
|
-
|
17
9
|
def allowed_type
|
18
10
|
'even numbers'
|
19
11
|
end
|
@@ -21,6 +13,20 @@ module Shoulda
|
|
21
13
|
def diff_to_compare
|
22
14
|
2
|
23
15
|
end
|
16
|
+
|
17
|
+
protected
|
18
|
+
|
19
|
+
def wrap_disallow_value_matcher(matcher)
|
20
|
+
matcher.with_message(:even)
|
21
|
+
end
|
22
|
+
|
23
|
+
def disallowed_value
|
24
|
+
if @numeric_type_matcher.given_numeric_column?
|
25
|
+
NON_EVEN_NUMBER_VALUE
|
26
|
+
else
|
27
|
+
NON_EVEN_NUMBER_VALUE.to_s
|
28
|
+
end
|
29
|
+
end
|
24
30
|
end
|
25
31
|
end
|
26
32
|
end
|
@@ -1,29 +1,37 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
1
3
|
module Shoulda
|
2
4
|
module Matchers
|
3
5
|
module ActiveModel
|
4
6
|
module NumericalityMatchers
|
5
7
|
# @private
|
6
8
|
class NumericTypeMatcher
|
7
|
-
|
8
|
-
|
9
|
-
|
9
|
+
extend Forwardable
|
10
|
+
|
11
|
+
def_delegators :disallow_value_matcher, :matches?, :failure_message,
|
12
|
+
:failure_message_when_negated
|
10
13
|
|
11
|
-
def
|
12
|
-
@
|
14
|
+
def initialize(numeric_type_matcher, attribute, options = {})
|
15
|
+
@numeric_type_matcher = numeric_type_matcher
|
16
|
+
@attribute = attribute
|
17
|
+
@options = options
|
18
|
+
@message = nil
|
19
|
+
@context = nil
|
20
|
+
@strict = false
|
13
21
|
end
|
14
22
|
|
15
23
|
def with_message(message)
|
16
|
-
@
|
24
|
+
@message = message
|
17
25
|
self
|
18
26
|
end
|
19
27
|
|
20
28
|
def strict
|
21
|
-
@
|
29
|
+
@strict = true
|
22
30
|
self
|
23
31
|
end
|
24
32
|
|
25
33
|
def on(context)
|
26
|
-
@
|
34
|
+
@context = context
|
27
35
|
self
|
28
36
|
end
|
29
37
|
|
@@ -35,12 +43,39 @@ module Shoulda
|
|
35
43
|
raise NotImplementedError
|
36
44
|
end
|
37
45
|
|
38
|
-
|
39
|
-
|
46
|
+
protected
|
47
|
+
|
48
|
+
attr_reader :attribute
|
49
|
+
|
50
|
+
def wrap_disallow_value_matcher(matcher)
|
51
|
+
raise NotImplementedError
|
52
|
+
end
|
53
|
+
|
54
|
+
def disallowed_value
|
55
|
+
raise NotImplementedError
|
40
56
|
end
|
41
57
|
|
42
|
-
|
43
|
-
|
58
|
+
private
|
59
|
+
|
60
|
+
def disallow_value_matcher
|
61
|
+
@_disallow_value_matcher ||= begin
|
62
|
+
DisallowValueMatcher.new(disallowed_value).tap do |matcher|
|
63
|
+
matcher.for(attribute)
|
64
|
+
wrap_disallow_value_matcher(matcher)
|
65
|
+
|
66
|
+
if @message
|
67
|
+
matcher.with_message(@message)
|
68
|
+
end
|
69
|
+
|
70
|
+
if @strict
|
71
|
+
matcher.strict
|
72
|
+
end
|
73
|
+
|
74
|
+
if @context
|
75
|
+
matcher.on(@context)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
44
79
|
end
|
45
80
|
end
|
46
81
|
end
|
@@ -4,15 +4,7 @@ module Shoulda
|
|
4
4
|
module NumericalityMatchers
|
5
5
|
# @private
|
6
6
|
class OddNumberMatcher < NumericTypeMatcher
|
7
|
-
NON_ODD_NUMBER_VALUE
|
8
|
-
|
9
|
-
def initialize(attribute, options = {})
|
10
|
-
@attribute = attribute
|
11
|
-
@disallow_value_matcher =
|
12
|
-
DisallowValueMatcher.new(NON_ODD_NUMBER_VALUE.to_s).
|
13
|
-
for(@attribute).
|
14
|
-
with_message(:odd)
|
15
|
-
end
|
7
|
+
NON_ODD_NUMBER_VALUE = 2
|
16
8
|
|
17
9
|
def allowed_type
|
18
10
|
'odd numbers'
|
@@ -21,6 +13,20 @@ module Shoulda
|
|
21
13
|
def diff_to_compare
|
22
14
|
2
|
23
15
|
end
|
16
|
+
|
17
|
+
protected
|
18
|
+
|
19
|
+
def wrap_disallow_value_matcher(matcher)
|
20
|
+
matcher.with_message(:odd)
|
21
|
+
end
|
22
|
+
|
23
|
+
def disallowed_value
|
24
|
+
if @numeric_type_matcher.given_numeric_column?
|
25
|
+
NON_ODD_NUMBER_VALUE
|
26
|
+
else
|
27
|
+
NON_ODD_NUMBER_VALUE.to_s
|
28
|
+
end
|
29
|
+
end
|
24
30
|
end
|
25
31
|
end
|
26
32
|
end
|
@@ -5,13 +5,6 @@ module Shoulda
|
|
5
5
|
# @private
|
6
6
|
class OnlyIntegerMatcher < NumericTypeMatcher
|
7
7
|
NON_INTEGER_VALUE = 0.1
|
8
|
-
def initialize(attribute)
|
9
|
-
@attribute = attribute
|
10
|
-
@disallow_value_matcher =
|
11
|
-
DisallowValueMatcher.new(NON_INTEGER_VALUE.to_s).
|
12
|
-
for(attribute).
|
13
|
-
with_message(:not_an_integer)
|
14
|
-
end
|
15
8
|
|
16
9
|
def allowed_type
|
17
10
|
'integers'
|
@@ -20,6 +13,20 @@ module Shoulda
|
|
20
13
|
def diff_to_compare
|
21
14
|
1
|
22
15
|
end
|
16
|
+
|
17
|
+
protected
|
18
|
+
|
19
|
+
def wrap_disallow_value_matcher(matcher)
|
20
|
+
matcher.with_message(:not_an_integer)
|
21
|
+
end
|
22
|
+
|
23
|
+
def disallowed_value
|
24
|
+
if @numeric_type_matcher.given_numeric_column?
|
25
|
+
NON_INTEGER_VALUE
|
26
|
+
else
|
27
|
+
NON_INTEGER_VALUE.to_s
|
28
|
+
end
|
29
|
+
end
|
23
30
|
end
|
24
31
|
end
|
25
32
|
end
|
@@ -263,9 +263,12 @@ module Shoulda
|
|
263
263
|
|
264
264
|
# @private
|
265
265
|
class ValidateInclusionOfMatcher < ValidationMatcher
|
266
|
-
ARBITRARY_OUTSIDE_STRING = '
|
266
|
+
ARBITRARY_OUTSIDE_STRING = 'shoulda-matchers test string'
|
267
267
|
ARBITRARY_OUTSIDE_FIXNUM = 123456789
|
268
268
|
ARBITRARY_OUTSIDE_DECIMAL = BigDecimal.new('0.123456789')
|
269
|
+
ARBITRARY_OUTSIDE_DATE = Date.jd(9999999)
|
270
|
+
ARBITRARY_OUTSIDE_DATETIME = DateTime.jd(9999999)
|
271
|
+
ARBITRARY_OUTSIDE_TIME = Time.at(9999999999)
|
269
272
|
BOOLEAN_ALLOWS_BOOLEAN_MESSAGE = <<EOT
|
270
273
|
You are using `validate_inclusion_of` to assert that a boolean column allows
|
271
274
|
boolean values and disallows non-boolean ones. Be aware that it is not possible
|
@@ -447,6 +450,12 @@ EOT
|
|
447
450
|
[ARBITRARY_OUTSIDE_FIXNUM]
|
448
451
|
when :decimal
|
449
452
|
[ARBITRARY_OUTSIDE_DECIMAL]
|
453
|
+
when :date
|
454
|
+
[ARBITRARY_OUTSIDE_DATE]
|
455
|
+
when :datetime
|
456
|
+
[ARBITRARY_OUTSIDE_DATETIME]
|
457
|
+
when :time
|
458
|
+
[ARBITRARY_OUTSIDE_TIME]
|
450
459
|
else
|
451
460
|
[ARBITRARY_OUTSIDE_STRING]
|
452
461
|
end
|
@@ -492,9 +501,9 @@ EOT
|
|
492
501
|
|
493
502
|
def column_type_to_attribute_type(type)
|
494
503
|
case type
|
495
|
-
when :boolean, :decimal then type
|
496
504
|
when :integer, :float then :fixnum
|
497
|
-
|
505
|
+
when :timestamp then :datetime
|
506
|
+
else type
|
498
507
|
end
|
499
508
|
end
|
500
509
|
|
@@ -503,7 +512,10 @@ EOT
|
|
503
512
|
when true, false then :boolean
|
504
513
|
when BigDecimal then :decimal
|
505
514
|
when Fixnum then :fixnum
|
506
|
-
|
515
|
+
when Date then :date
|
516
|
+
when DateTime then :datetime
|
517
|
+
when Time then :time
|
518
|
+
else :unknown
|
507
519
|
end
|
508
520
|
end
|
509
521
|
end
|
@@ -179,7 +179,7 @@ module Shoulda
|
|
179
179
|
#
|
180
180
|
# ##### is_greater_than
|
181
181
|
#
|
182
|
-
# Use `is_greater_than` to test usage of
|
182
|
+
# Use `is_greater_than` to test usage of the `:greater_than` option.
|
183
183
|
# This asserts that the attribute can take a number which is greater than
|
184
184
|
# the given value and cannot take a number less than or equal to it.
|
185
185
|
#
|
@@ -315,18 +315,19 @@ module Shoulda
|
|
315
315
|
@submatchers = []
|
316
316
|
@diff_to_compare = DEFAULT_DIFF_TO_COMPARE
|
317
317
|
@strict = false
|
318
|
+
|
318
319
|
add_disallow_value_matcher
|
319
320
|
end
|
320
321
|
|
321
322
|
def strict
|
322
|
-
@submatchers.each(&:strict)
|
323
323
|
@strict = true
|
324
|
+
@submatchers.each(&:strict)
|
324
325
|
self
|
325
326
|
end
|
326
327
|
|
327
328
|
def only_integer
|
328
329
|
prepare_submatcher(
|
329
|
-
NumericalityMatchers::OnlyIntegerMatcher.new(@attribute)
|
330
|
+
NumericalityMatchers::OnlyIntegerMatcher.new(self, @attribute)
|
330
331
|
)
|
331
332
|
self
|
332
333
|
end
|
@@ -342,14 +343,14 @@ module Shoulda
|
|
342
343
|
|
343
344
|
def odd
|
344
345
|
prepare_submatcher(
|
345
|
-
NumericalityMatchers::OddNumberMatcher.new(@attribute)
|
346
|
+
NumericalityMatchers::OddNumberMatcher.new(self, @attribute)
|
346
347
|
)
|
347
348
|
self
|
348
349
|
end
|
349
350
|
|
350
351
|
def even
|
351
352
|
prepare_submatcher(
|
352
|
-
NumericalityMatchers::EvenNumberMatcher.new(@attribute)
|
353
|
+
NumericalityMatchers::EvenNumberMatcher.new(self, @attribute)
|
353
354
|
)
|
354
355
|
self
|
355
356
|
end
|
@@ -391,6 +392,19 @@ module Shoulda
|
|
391
392
|
|
392
393
|
def matches?(subject)
|
393
394
|
@subject = subject
|
395
|
+
|
396
|
+
if given_numeric_column?
|
397
|
+
remove_disallow_value_matcher
|
398
|
+
end
|
399
|
+
|
400
|
+
if @submatchers.empty?
|
401
|
+
raise IneffectiveTestError.create(
|
402
|
+
model: @subject.class,
|
403
|
+
attribute: @attribute,
|
404
|
+
column_type: column_type
|
405
|
+
)
|
406
|
+
end
|
407
|
+
|
394
408
|
first_failing_submatcher.nil?
|
395
409
|
end
|
396
410
|
|
@@ -417,8 +431,18 @@ module Shoulda
|
|
417
431
|
first_failing_submatcher.failure_message_when_negated
|
418
432
|
end
|
419
433
|
|
434
|
+
def given_numeric_column?
|
435
|
+
[:integer, :float, :decimal].include?(column_type)
|
436
|
+
end
|
437
|
+
|
420
438
|
private
|
421
439
|
|
440
|
+
def column_type
|
441
|
+
if @subject.class.respond_to?(:columns_hash)
|
442
|
+
@subject.class.columns_hash[@attribute.to_s].type
|
443
|
+
end
|
444
|
+
end
|
445
|
+
|
422
446
|
def add_disallow_value_matcher
|
423
447
|
disallow_value_matcher = DisallowValueMatcher.new(NON_NUMERIC_VALUE).
|
424
448
|
for(@attribute).
|
@@ -427,8 +451,13 @@ module Shoulda
|
|
427
451
|
add_submatcher(disallow_value_matcher)
|
428
452
|
end
|
429
453
|
|
454
|
+
def remove_disallow_value_matcher
|
455
|
+
@submatchers.shift
|
456
|
+
end
|
457
|
+
|
430
458
|
def prepare_submatcher(submatcher)
|
431
459
|
add_submatcher(submatcher)
|
460
|
+
|
432
461
|
if submatcher.respond_to?(:diff_to_compare)
|
433
462
|
update_diff_to_compare(submatcher)
|
434
463
|
end
|
@@ -476,6 +505,39 @@ module Shoulda
|
|
476
505
|
arr
|
477
506
|
end
|
478
507
|
end
|
508
|
+
|
509
|
+
class IneffectiveTestError < Shoulda::Matchers::Error
|
510
|
+
attr_accessor :model, :attribute, :column_type
|
511
|
+
|
512
|
+
def message
|
513
|
+
Shoulda::Matchers.word_wrap <<-MESSAGE
|
514
|
+
You are attempting to use validate_numericality_of, but the attribute you're
|
515
|
+
testing, :#{attribute}, is #{a_or_an(column_type)} column. One of the things
|
516
|
+
that the numericality matcher does is to assert that setting :#{attribute} to a
|
517
|
+
string that doesn't look like #{a_or_an(column_type)} will cause your
|
518
|
+
#{humanized_model_name} to become invalid. In this case, it's impossible to make
|
519
|
+
this assertion since :#{attribute} will typecast any incoming value to
|
520
|
+
#{a_or_an(column_type)}. This means that it's already guaranteed to be numeric!
|
521
|
+
Since this matcher isn't doing anything, you can remove it from your model
|
522
|
+
tests, and in fact, you can remove the validation from your model as it isn't
|
523
|
+
doing anything either.
|
524
|
+
MESSAGE
|
525
|
+
end
|
526
|
+
|
527
|
+
private
|
528
|
+
|
529
|
+
def humanized_model_name
|
530
|
+
model.name.humanize.downcase
|
531
|
+
end
|
532
|
+
|
533
|
+
def a_or_an(next_word)
|
534
|
+
if next_word =~ /[aeiou]/
|
535
|
+
"an #{next_word}"
|
536
|
+
else
|
537
|
+
"a #{next_word}"
|
538
|
+
end
|
539
|
+
end
|
540
|
+
end
|
479
541
|
end
|
480
542
|
end
|
481
543
|
end
|