require "rspec/expectations"

RSpec::Matchers.define :validate_attachment_of do |attr_name|
  match do |record| 
    matcher.matches?(record, attr_name)
  end

  chain :on do |validation_context|
    matcher.on(validation_context)
  end

  chain :with_message do |message|
    matcher.with_message(message)
  end

  private

  def matcher
    @matcher ||= ValidateAttachmentOfMatcher.new
  end

  class ValidateAttachmentOfMatcher
    def on(validation_context)
      @validation_context = validation_context
    end

    def with_message(message)
      @message = message
    end

    def matches?(record, attr_name)
      record.send(attr_name).purge
      record.valid?(validation_context)
      record.errors[attr_name].include? message
    end
    
    private

    attr_reader :validation_context

    def message
      @message || I18n.translate("activerecord.errors.messages.attached")
    end
  end
end
