class ErgomentumRspec::Matchers::ActiveModel::BeInvalidFor

Public Class Methods

name() click to toggle source

ActiveModel sometimes needs a non nil class name. Because we are using an anonymous class, which have no name by default, we have to override the name method.

# File lib/ergomentum_rspec/matchers/active_model/be_invalid_for.rb, line 23
def self.name
  "SomeClass"
end
new(value) click to toggle source
# File lib/ergomentum_rspec/matchers/active_model/be_invalid_for.rb, line 11
def initialize(value)
  @value = value
end

Public Instance Methods

and_add_error(expected_error_message) click to toggle source
# File lib/ergomentum_rspec/matchers/active_model/be_invalid_for.rb, line 42
def and_add_error(expected_error_message)
  @expected_error_message = expected_error_message
  self
end
description() click to toggle source
# File lib/ergomentum_rspec/matchers/active_model/be_invalid_for.rb, line 51
def description
  "'#{@value}' be a invalid value"
end
failure_message() click to toggle source
# File lib/ergomentum_rspec/matchers/active_model/be_invalid_for.rb, line 47
def failure_message
  @message
end
matches?(validator) click to toggle source
# File lib/ergomentum_rspec/matchers/active_model/be_invalid_for.rb, line 15
def matches?(validator)
  model = Class.new do
    include ::ActiveModel::Model
    include ::ActiveModel::Attributes

    # ActiveModel sometimes needs a non nil class name.
    # Because we are using an anonymous class, which have no name by default, we have to override the name
    # method.
    def self.name
      "SomeClass"
    end

    attribute :some_attribute
    validates :some_attribute, validator
  end.new(some_attribute: @value)
  if model.valid?
    @message = "expecting '#{@value}' to be invalid"
    false
  elsif model.errors.messages[:some_attribute].include?(@expected_error_message)
    true
  else
    @message = "expecting error message '#{@expected_error_message}' for invalid value '#{@value}' but got "\
               "'#{model.errors.messages[:some_attribute].join(', ')}'"
    false
  end
end