thoughtbot--shoulda-matchers/lib/shoulda/matchers/active_model/ensure_exclusion_of_matcher.rb

95 lines
2.3 KiB
Ruby
Raw Normal View History

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
@maximum = range.last
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