RSpec::Matchers.define :allow_association_values do |*values|
  chain :for do |attribute|
    @attribute = attribute
  end

  match do |object|
    values.each do |value|
      setter = "#{@attribute}="
      foreign_key = "#{@attribute}_id"
      object.send(setter, value)
      object.valid?
      expect(object.errors[@attribute]).to match_array([])
      expect(object.errors[foreign_key]).to match_array([])

      if value.blank?
        expect(object).not_to validate_presence_of(@attribute)
      end
    end
  end
end

