class NoBrainer::Matchers::Validations::HaveValidationMatcher

Public Class Methods

new(field, validation_type) click to toggle source
# File lib/matchers/validations.rb, line 7
def initialize(field, validation_type)
  @field = field.to_s
  @type = validation_type.to_s
  @options = {}
end

Public Instance Methods

description() click to toggle source
# File lib/matchers/validations.rb, line 45
def description
  desc = "have #{@type.inspect} validator on #{@field.inspect}"
  desc += " on #{@options[:on]}" if @options[:on]
  desc += " with message #{@expected_message.inspect}" if @expected_message
  desc
end
failure_message()
failure_message_for_should() click to toggle source
# File lib/matchers/validations.rb, line 34
def failure_message_for_should
  "Expected #{@klass.inspect} to #{description}; instead got #{@negative_result_message}"
end
Also aliased as: failure_message
failure_message_for_should_not() click to toggle source
# File lib/matchers/validations.rb, line 38
def failure_message_for_should_not
  "Expected #{@klass.inspect} to not #{description}; instead got #{@positive_result_message}"
end
Also aliased as: failure_message_when_negated
failure_message_when_negated()
matches?(actual) click to toggle source
# File lib/matchers/validations.rb, line 13
def matches?(actual)
  @klass = actual.is_a?(Class) ? actual : actual.class

  @validator = @klass.validators_on(@field).detect do |v|
    (v.kind.to_s == @type) && (!v.options[:on] || on_options_matches?(v))
  end

  if @validator
    @negative_result_message = "#{@type.inspect} validator on #{@field.inspect}"
    @positive_result_message = "#{@type.inspect} validator on #{@field.inspect}"
  else
    @negative_result_message = "no #{@type.inspect} validator on #{@field.inspect}"
    return false
  end

  @result = true
  check_on if @options[:on]
  check_expected_message if @expected_message
  @result
end
on(*on_method) click to toggle source
# File lib/matchers/validations.rb, line 52
def on(*on_method)
  @options[:on] = on_method.flatten
  self
end
with_message(message) click to toggle source
# File lib/matchers/validations.rb, line 57
def with_message(message)
  @expected_message = message
  self
end

Private Instance Methods

check_expected_message() click to toggle source
# File lib/matchers/validations.rb, line 87
def check_expected_message
  actual_message = @validator.options[:message]
  if actual_message.nil?
    @negative_result_message << ' with no custom message'
    @result = false
  elsif actual_message == @expected_message
    @positive_result_message << " with custom message '#{@expected_message}'"
  else
    @negative_result_message << " got message '#{actual_message}'"
    @result = false
  end
end
check_on() click to toggle source
# File lib/matchers/validations.rb, line 64
def check_on
  validator_on_methods = [@validator.options[:on]].flatten

  if validator_on_methods.any?
    message = " on methods: #{validator_on_methods}"

    if on_options_covered_by?(@validator)
      @positive_result_message += message
    else
      @negative_result_message += message
      @result = false
    end
  end
end
on_options_covered_by?(validator) click to toggle source
# File lib/matchers/validations.rb, line 83
def on_options_covered_by?(validator)
  ([@options[:on]].flatten - [validator.options[:on]].flatten).empty?
end
on_options_matches?(validator) click to toggle source
# File lib/matchers/validations.rb, line 79
def on_options_matches?(validator)
  @options[:on] && validator.options[:on] && on_options_covered_by?(validator)
end