2011-10-16 17:49:58 +00:00
|
|
|
module Shoulda # :nodoc:
|
|
|
|
module Matchers
|
|
|
|
module ActiveModel # :nodoc:
|
|
|
|
|
|
|
|
# Ensure that the attribute's value is not in the range specified
|
|
|
|
#
|
|
|
|
# Options:
|
2012-08-19 09:07:05 +00:00
|
|
|
# * <tt>in_array</tt> - the array of not allowed values for this attribute
|
2011-10-16 17:49:58 +00:00
|
|
|
# * <tt>in_range</tt> - the range of not allowed values for this attribute
|
|
|
|
# * <tt>with_message</tt> - value the test expects to find in
|
|
|
|
# <tt>errors.on(:attribute)</tt>. Regexp or string. Defaults to the
|
|
|
|
# translation for :exclusion.
|
|
|
|
#
|
|
|
|
# Example:
|
|
|
|
# it { should ensure_exclusion_of(:age).in_range(30..60) }
|
|
|
|
#
|
|
|
|
def ensure_exclusion_of(attr)
|
|
|
|
EnsureExclusionOfMatcher.new(attr)
|
|
|
|
end
|
|
|
|
|
|
|
|
class EnsureExclusionOfMatcher < ValidationMatcher # :nodoc:
|
2012-08-19 09:07:05 +00:00
|
|
|
def in_array(array)
|
|
|
|
@array = array
|
|
|
|
self
|
|
|
|
end
|
2011-10-16 17:49:58 +00:00
|
|
|
|
|
|
|
def in_range(range)
|
|
|
|
@range = range
|
|
|
|
@minimum = range.first
|
2013-03-30 18:03:38 +00:00
|
|
|
@maximum = range.max
|
2011-10-16 17:49:58 +00:00
|
|
|
self
|
|
|
|
end
|
|
|
|
|
|
|
|
def with_message(message)
|
|
|
|
@expected_message = message if message
|
|
|
|
self
|
|
|
|
end
|
|
|
|
|
|
|
|
def description
|
2012-08-19 09:07:05 +00:00
|
|
|
"ensure exclusion of #{@attribute} in #{inspect_message}"
|
2011-10-16 17:49:58 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def matches?(subject)
|
|
|
|
super(subject)
|
|
|
|
|
2012-08-19 09:07:05 +00:00
|
|
|
if @range
|
|
|
|
allows_lower_value &&
|
|
|
|
disallows_minimum_value &&
|
|
|
|
allows_higher_value &&
|
|
|
|
disallows_maximum_value
|
|
|
|
elsif @array
|
|
|
|
disallows_all_values_in_array?
|
|
|
|
end
|
2011-10-16 17:49:58 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
2012-08-19 09:07:05 +00:00
|
|
|
def disallows_all_values_in_array?
|
|
|
|
@array.all? do |value|
|
|
|
|
disallows_value_of(value, expected_message)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2011-10-16 17:49:58 +00:00
|
|
|
def allows_lower_value
|
2012-04-24 21:33:47 +00:00
|
|
|
@minimum == 0 || allows_value_of(@minimum - 1, expected_message)
|
2011-10-16 17:49:58 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def allows_higher_value
|
2012-04-24 21:33:47 +00:00
|
|
|
allows_value_of(@maximum + 1, expected_message)
|
2011-10-16 17:49:58 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def disallows_minimum_value
|
2012-04-24 21:33:47 +00:00
|
|
|
disallows_value_of(@minimum, expected_message)
|
2011-10-16 17:49:58 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def disallows_maximum_value
|
2012-04-24 21:33:47 +00:00
|
|
|
disallows_value_of(@maximum, expected_message)
|
|
|
|
end
|
|
|
|
|
|
|
|
def expected_message
|
|
|
|
@expected_message || :exclusion
|
2011-10-16 17:49:58 +00:00
|
|
|
end
|
|
|
|
|
2012-08-19 09:07:05 +00:00
|
|
|
def inspect_message
|
|
|
|
if @range
|
|
|
|
@range.inspect
|
|
|
|
else
|
|
|
|
@array.inspect
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2011-10-16 17:49:58 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|