thoughtbot--shoulda-matchers/spec/unit/shoulda/matchers/active_model/disallow_value_matcher_spec.rb

87 lines
3.0 KiB
Ruby

require 'unit_spec_helper'
describe Shoulda::Matchers::ActiveModel::DisallowValueMatcher, type: :model do
context 'an attribute with a format validation' do
it 'does not match if the value is allowed' do
expect(validating_format(with: /abc/)).not_to matcher('abcde').for(:attr)
end
it 'matches if the value is not allowed' do
expect(validating_format(with: /abc/)).to matcher('xyz').for(:attr)
end
end
context "an attribute with a context-dependent validation" do
context "without the validation context" do
it "does not match" do
expect(validating_format(with: /abc/, on: :customisable)).not_to matcher("xyz").for(:attr)
end
end
context "with the validation context" do
it "disallows a bad value" do
expect(validating_format(with: /abc/, on: :customisable)).to matcher("xyz").for(:attr).on(:customisable)
end
it "does not match a good value" do
expect(validating_format(with: /abc/, on: :customisable)).not_to matcher("abcde").for(:attr).on(:customisable)
end
end
end
context 'an attribute with a format validation and a custom message' do
it 'does not match if the value and message are both correct' do
expect(validating_format(with: /abc/, message: 'good message')).
not_to matcher('abcde').for(:attr).with_message('good message')
end
it "delegates its failure message to its allow matcher's negative failure message" do
allow_matcher = double('allow_matcher',
failure_message_when_negated: 'allow matcher failure',
).as_null_object
allow(Shoulda::Matchers::ActiveModel::AllowValueMatcher).
to receive(:new).
and_return(allow_matcher)
matcher = matcher('abcde').for(:attr).with_message('good message')
matcher.matches?(validating_format(with: /abc/, message: 'good message'))
expect(matcher.failure_message).to eq 'allow matcher failure'
end
it 'matches if the message is correct but the value is not' do
expect(validating_format(with: /abc/, message: 'good message')).
to matcher('xyz').for(:attr).with_message('good message')
end
end
context 'an attribute where the message occurs on another attribute' do
it 'matches if the message is correct but the value is not' do
expect(record_with_custom_validation).to \
matcher('bad value').for(:attr).with_message(/some message/, against: :attr2)
end
it 'does not match if the value and message are both correct' do
expect(record_with_custom_validation).not_to \
matcher('good value').for(:attr).with_message(/some message/, against: :attr2)
end
def record_with_custom_validation
define_model :example, attr: :string, attr2: :string do
validate :custom_validation
def custom_validation
if self[:attr] != 'good value'
self.errors[:attr2] << 'some message'
end
end
end.new
end
end
def matcher(value)
described_class.new(value)
end
alias_method :disallow_value, :matcher
end