163 lines
5.4 KiB
Ruby
163 lines
5.4 KiB
Ruby
# encoding: UTF-8
|
||
require 'unit_spec_helper'
|
||
|
||
describe Shoulda::Matchers::ActiveModel::Helpers do
|
||
include Shoulda::Matchers::ActiveModel
|
||
after { I18n.backend.reload! }
|
||
|
||
describe 'default_error_message' do
|
||
context 'if the translation for the model attribute’s error exists' do
|
||
it 'provides the right error message for validate_presence_of' do
|
||
store_translations
|
||
|
||
assert_presence_validation_has_correct_message
|
||
end
|
||
|
||
it 'provides the right error message for validates_length_of' do
|
||
store_translations
|
||
|
||
assert_length_validation_has_correct_message
|
||
end
|
||
end
|
||
|
||
context 'if no translation for the model attribute’s error exists' do
|
||
context 'and the translation for the model’s error exists' do
|
||
it 'provides the right error message for validate_presence_of' do
|
||
store_translations(without: :model_attribute)
|
||
|
||
assert_presence_validation_has_correct_message
|
||
end
|
||
|
||
it 'provides the right error message for validates_length_of' do
|
||
store_translations(without: :model_attribute)
|
||
|
||
assert_length_validation_has_correct_message
|
||
end
|
||
end
|
||
|
||
context 'and no translation for the model’s error exists' do
|
||
context 'and the translation for the message exists' do
|
||
it 'provides the right error message for validate_presence_of' do
|
||
store_translations(without: [:model_attribute, :model])
|
||
|
||
assert_presence_validation_has_correct_message
|
||
end
|
||
|
||
it 'provides the right error message for validates_length_of' do
|
||
store_translations(without: [:model_attribute, :model])
|
||
|
||
assert_length_validation_has_correct_message
|
||
end
|
||
end
|
||
|
||
context 'and no translation for the message exists' do
|
||
context 'and the translation for the attribute exists' do
|
||
it 'provides the right error message for validate_presence_of' do
|
||
store_translations(without: [:model_attribute, :model, :message])
|
||
|
||
assert_presence_validation_has_correct_message
|
||
end
|
||
|
||
it 'provides the right error message for validates_length_of' do
|
||
store_translations(without: [:model_attribute, :model, :message])
|
||
|
||
assert_length_validation_has_correct_message
|
||
end
|
||
end
|
||
|
||
context 'and no translation for the attribute exists' do
|
||
it 'provides the general error message for validate_presence_of' do
|
||
assert_presence_validation_has_correct_message
|
||
end
|
||
|
||
it 'provides the general error message for validates_length_of' do
|
||
assert_length_validation_has_correct_message
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
context 'if ActiveModel::Errors#generate_message behavior has changed' do
|
||
it 'provides the right error message for validate_presence_of' do
|
||
stub_active_model_message_generation(type: :blank,
|
||
message: 'Behavior has diverged.')
|
||
assert_presence_validation_has_correct_message
|
||
end
|
||
end
|
||
end
|
||
|
||
def assert_presence_validation_has_correct_message
|
||
record = define_model :example, attr: :string do
|
||
validates_presence_of :attr
|
||
end.new
|
||
expect(record).to validate_presence_of(:attr)
|
||
end
|
||
|
||
def assert_length_validation_has_correct_message
|
||
record = define_model :example, attr: :string do
|
||
validates_length_of :attr, is: 40, allow_blank: true
|
||
end.new
|
||
expect(record).to validate_length_of(:attr).is_equal_to(40)
|
||
end
|
||
|
||
def store_translations(options = {without: []})
|
||
options[:without] = Array.wrap(options[:without] || [])
|
||
|
||
translations = {
|
||
activerecord: {
|
||
errors: {
|
||
models: {
|
||
example: {
|
||
attributes: {
|
||
attr: {}
|
||
}
|
||
}
|
||
},
|
||
messages: {}
|
||
}
|
||
},
|
||
errors: {
|
||
attributes: {
|
||
attr: {}
|
||
},
|
||
messages: {}
|
||
}
|
||
}
|
||
|
||
unless options[:without].include?(:model_attribute)
|
||
translations[:activerecord][:errors][:models][:example][:attributes][:attr][:blank] = "Don't you do that to me!"
|
||
translations[:activerecord][:errors][:models][:example][:attributes][:attr][:wrong_length] = "Don't you do that to me!"
|
||
end
|
||
|
||
unless options[:without].include?(:model)
|
||
translations[:activerecord][:errors][:models][:example][:blank] = 'Give it one more try!'
|
||
translations[:activerecord][:errors][:models][:example][:wrong_length] = 'Give it one more try!'
|
||
end
|
||
|
||
unless options[:without].include?(:message)
|
||
translations[:activerecord][:errors][:messages][:blank] = 'Oh no!'
|
||
translations[:activerecord][:errors][:messages][:wrong_length] = 'Oh no!'
|
||
end
|
||
|
||
unless options[:without].include?(:attribute)
|
||
translations[:errors][:attributes][:attr][:blank] = 'Seriously?'
|
||
translations[:errors][:attributes][:attr][:wrong_length] = 'Seriously?'
|
||
end
|
||
|
||
I18n.backend.store_translations(:en, translations)
|
||
end
|
||
|
||
def stub_active_model_message_generation(options = {})
|
||
attribute = options.delete(:attribute) || :attr
|
||
message = options.delete(:message)
|
||
type = options.delete(:type)
|
||
|
||
expect_any_instance_of(ActiveModel::Errors).
|
||
to receive(:generate_message).
|
||
with(attribute, type, {}).
|
||
at_least(1).
|
||
and_return(message)
|
||
end
|
||
end
|