lib/matchers/validations/uniqueness_of.rb
module Mongoid
module Matchers
module Validations
class ValidateUniquenessOfMatcher < HaveValidationMatcher
def initialize(field)
super(field, :uniqueness)
end
def scoped_to(*scope)
@scope = [scope].flatten.map(&:to_sym)
self
end
alias scoped_on scoped_to
def case_insensitive
@case_insensitive = true
self
end
def allow_blank?(allow_blank)
@allow_blank = allow_blank
self
end
def matches?(actual)
return false unless @result = super(actual)
check_scope if @scope
check_allow_blank if @allow_blank
check_case_sensitivity if @case_insensitive
@result
end
def description
options_desc = []
options_desc << " scoped to #{@scope.inspect}" if @scope
options_desc << ' allowing blank values' if @allow_blank
options_desc << ' allowing case insensitive values' if @case_insensitive
super << options_desc.to_sentence
end
private
def check_allow_blank
if @validator.options[:allow_blank] == @allow_blank
@positive_result_message << ' with blank values allowed'
else
@negative_result_message << ' with no blank values allowed'
@result = false
end
end
def check_scope
message = " scope to #{@validator.options[:scope]}"
if [@validator.options[:scope]].flatten.map(&:to_sym) == @scope
@positive_result_message << message
else
@negative_result_message << message
@result = false
end
end
def check_case_sensitivity
if @validator.options[:case_sensitive] == false
@positive_result_message << ' with case insensitive values'
else
@negative_result_message << ' without case insensitive values'
@result = false
end
end
end
def validate_uniqueness_of(field)
ValidateUniquenessOfMatcher.new(field)
end
end
end
end