2010-04-02 00:42:03 -04:00
# -*- coding: utf-8 -*-
2008-06-19 10:25:27 -04:00
require " cases/helper "
2009-03-20 17:40:37 -04:00
require 'models/person'
2008-06-19 10:25:27 -04:00
2009-03-20 11:07:49 -04:00
class I18nValidationTest < ActiveModel :: TestCase
2008-06-19 10:25:27 -04:00
def setup
2009-09-08 11:10:14 -04:00
Person . reset_callbacks ( :validate )
2009-03-20 17:40:37 -04:00
@person = Person . new
2010-01-06 20:37:42 -05:00
@old_load_path , @old_backend = I18n . load_path . dup , I18n . backend
2008-09-15 04:26:50 -04:00
I18n . load_path . clear
I18n . backend = I18n :: Backend :: Simple . new
2010-01-06 19:04:25 -05:00
I18n . backend . store_translations ( 'en' , :errors = > { :messages = > { :custom = > nil } } )
2008-06-19 10:25:27 -04:00
end
2008-08-25 21:16:58 -04:00
2008-06-19 10:25:27 -04:00
def teardown
2009-09-08 11:10:14 -04:00
Person . reset_callbacks ( :validate )
2008-09-15 04:26:50 -04:00
I18n . load_path . replace @old_load_path
I18n . backend = @old_backend
2008-06-19 10:25:27 -04:00
end
2008-08-25 21:16:58 -04:00
2010-04-02 00:42:03 -04:00
def test_full_message_encoding
I18n . backend . store_translations ( 'en' , :errors = > {
:messages = > { :too_short = > '猫舌' } } )
Person . validates_length_of :title , :within = > 3 .. 5
@person . valid?
assert_equal [ 'Title 猫舌' ] , @person . errors . full_messages
end
2009-10-20 20:20:01 -04:00
def test_errors_full_messages_translates_human_attribute_name_for_model_attributes
2010-01-06 19:04:25 -05:00
@person . errors . add ( :name , 'not found' )
Person . expects ( :human_attribute_name ) . with ( :name , :default = > 'Name' ) . returns ( " Person's name " )
assert_equal [ " Person's name not found " ] , @person . errors . full_messages
2009-10-20 20:20:01 -04:00
end
2009-12-31 08:14:29 -05:00
def test_errors_full_messages_uses_format
2010-05-03 02:44:32 -04:00
I18n . backend . store_translations ( 'en' , :errors = > { :format = > " Field %{attribute} %{message} " } )
2009-12-31 08:14:29 -05:00
@person . errors . add ( 'name' , 'empty' )
assert_equal [ " Field Name empty " ] , @person . errors . full_messages
end
2010-05-08 17:03:45 -04:00
# ActiveModel::Validations
2010-05-19 10:25:46 -04:00
# A set of common cases for ActiveModel::Validations message generation that
# are used to generate tests to keep things DRY
#
COMMON_CASES = [
# [ case, validation_options, generate_message_options]
[ " given no options " , { } , { } ] ,
[ " given custom message " , { :message = > " custom " } , { :message = > " custom " } ] ,
[ " given if condition " , { :if = > lambda { true } } , { } ] ,
[ " given unless condition " , { :unless = > lambda { false } } , { } ] ,
[ " given option that is not reserved " , { :format = > " jpg " } , { :format = > " jpg " } ]
]
2009-02-03 21:25:37 -05:00
# validates_confirmation_of w/ mocha
2008-06-27 09:00:55 -04:00
2010-05-19 10:25:46 -04:00
COMMON_CASES . each do | name , validation_options , generate_message_options |
test " validates_confirmation_of on generated message #{ name } " do
Person . validates_confirmation_of :title , validation_options
@person . title_confirmation = 'foo'
2012-04-24 01:05:41 -04:00
@person . errors . expects ( :generate_message ) . with ( :title_confirmation , :confirmation , generate_message_options . merge ( :attribute = > 'Title' ) )
2010-05-19 10:25:46 -04:00
@person . valid?
end
2009-02-03 21:25:37 -05:00
end
2008-08-25 21:16:58 -04:00
2009-02-03 21:25:37 -05:00
# validates_acceptance_of w/ mocha
2008-06-27 09:00:55 -04:00
2010-05-19 10:25:46 -04:00
COMMON_CASES . each do | name , validation_options , generate_message_options |
test " validates_acceptance_of on generated message #{ name } " do
Person . validates_acceptance_of :title , validation_options . merge ( :allow_nil = > false )
@person . errors . expects ( :generate_message ) . with ( :title , :accepted , generate_message_options )
@person . valid?
end
2009-02-03 21:25:37 -05:00
end
2008-08-25 21:16:58 -04:00
2009-02-03 21:25:37 -05:00
# validates_presence_of w/ mocha
2008-08-25 21:16:58 -04:00
2010-05-19 10:25:46 -04:00
COMMON_CASES . each do | name , validation_options , generate_message_options |
test " validates_presence_of on generated message #{ name } " do
Person . validates_presence_of :title , validation_options
@person . errors . expects ( :generate_message ) . with ( :title , :blank , generate_message_options )
@person . valid?
end
2009-02-03 21:25:37 -05:00
end
2008-08-25 21:16:58 -04:00
2010-05-19 10:25:46 -04:00
# validates_length_of :within too short w/ mocha
2008-06-27 09:00:55 -04:00
2010-05-19 10:25:46 -04:00
COMMON_CASES . each do | name , validation_options , generate_message_options |
test " validates_length_of for :withing on generated message when too short #{ name } " do
Person . validates_length_of :title , validation_options . merge ( :within = > 3 .. 5 )
@person . errors . expects ( :generate_message ) . with ( :title , :too_short , generate_message_options . merge ( :count = > 3 ) )
@person . valid?
end
2009-02-03 21:25:37 -05:00
end
2008-06-27 09:00:55 -04:00
2010-05-19 10:25:46 -04:00
# validates_length_of :within too long w/ mocha
2008-06-27 09:00:55 -04:00
2010-05-19 10:25:46 -04:00
COMMON_CASES . each do | name , validation_options , generate_message_options |
test " validates_length_of for :too_long generated message #{ name } " do
Person . validates_length_of :title , validation_options . merge ( :within = > 3 .. 5 )
@person . title = 'this title is too long'
@person . errors . expects ( :generate_message ) . with ( :title , :too_long , generate_message_options . merge ( :count = > 5 ) )
@person . valid?
end
2009-02-03 21:25:37 -05:00
end
2008-08-25 21:16:58 -04:00
2009-02-03 21:25:37 -05:00
# validates_length_of :is w/ mocha
2008-06-27 09:00:55 -04:00
2010-05-19 10:25:46 -04:00
COMMON_CASES . each do | name , validation_options , generate_message_options |
test " validates_length_of for :is on generated message #{ name } " do
Person . validates_length_of :title , validation_options . merge ( :is = > 5 )
@person . errors . expects ( :generate_message ) . with ( :title , :wrong_length , generate_message_options . merge ( :count = > 5 ) )
@person . valid?
end
2009-02-03 21:25:37 -05:00
end
2008-08-25 21:16:58 -04:00
2009-02-03 21:25:37 -05:00
# validates_format_of w/ mocha
2008-06-27 09:00:55 -04:00
2010-05-19 10:25:46 -04:00
COMMON_CASES . each do | name , validation_options , generate_message_options |
test " validates_format_of on generated message #{ name } " do
2012-06-07 18:08:51 -04:00
Person . validates_format_of :title , validation_options . merge ( :with = > / \ A[1-9][0-9]* \ z / )
2010-05-19 10:25:46 -04:00
@person . title = '72x'
@person . errors . expects ( :generate_message ) . with ( :title , :invalid , generate_message_options . merge ( :value = > '72x' ) )
@person . valid?
end
2009-02-03 21:25:37 -05:00
end
2008-08-25 21:16:58 -04:00
2009-02-03 21:25:37 -05:00
# validates_inclusion_of w/ mocha
2008-06-27 09:00:55 -04:00
2010-05-19 10:25:46 -04:00
COMMON_CASES . each do | name , validation_options , generate_message_options |
test " validates_inclusion_of on generated message #{ name } " do
Person . validates_inclusion_of :title , validation_options . merge ( :in = > %w( a b c ) )
@person . title = 'z'
@person . errors . expects ( :generate_message ) . with ( :title , :inclusion , generate_message_options . merge ( :value = > 'z' ) )
@person . valid?
end
2009-02-03 21:25:37 -05:00
end
2008-08-25 21:16:58 -04:00
2012-07-20 13:10:25 -04:00
# validates_inclusion_of using :within w/ mocha
COMMON_CASES . each do | name , validation_options , generate_message_options |
test " validates_inclusion_of using :within on generated message #{ name } " do
Person . validates_inclusion_of :title , validation_options . merge ( :within = > %w( a b c ) )
@person . title = 'z'
@person . errors . expects ( :generate_message ) . with ( :title , :inclusion , generate_message_options . merge ( :value = > 'z' ) )
@person . valid?
end
end
2009-02-03 21:25:37 -05:00
# validates_exclusion_of w/ mocha
2008-06-27 09:00:55 -04:00
2010-05-19 10:25:46 -04:00
COMMON_CASES . each do | name , validation_options , generate_message_options |
test " validates_exclusion_of generated message #{ name } " do
Person . validates_exclusion_of :title , validation_options . merge ( :in = > %w( a b c ) )
@person . title = 'a'
@person . errors . expects ( :generate_message ) . with ( :title , :exclusion , generate_message_options . merge ( :value = > 'a' ) )
@person . valid?
end
2009-02-03 21:25:37 -05:00
end
2008-08-25 21:16:58 -04:00
2012-07-20 13:10:25 -04:00
# validates_exclusion_of using :within w/ mocha
COMMON_CASES . each do | name , validation_options , generate_message_options |
test " validates_exclusion_of using :within generated message #{ name } " do
Person . validates_exclusion_of :title , validation_options . merge ( :within = > %w( a b c ) )
@person . title = 'a'
@person . errors . expects ( :generate_message ) . with ( :title , :exclusion , generate_message_options . merge ( :value = > 'a' ) )
@person . valid?
end
end
2009-02-03 21:25:37 -05:00
# validates_numericality_of without :only_integer w/ mocha
2008-06-27 09:00:55 -04:00
2010-05-19 10:25:46 -04:00
COMMON_CASES . each do | name , validation_options , generate_message_options |
test " validates_numericality_of generated message #{ name } " do
Person . validates_numericality_of :title , validation_options
@person . title = 'a'
@person . errors . expects ( :generate_message ) . with ( :title , :not_a_number , generate_message_options . merge ( :value = > 'a' ) )
@person . valid?
end
2009-02-03 21:25:37 -05:00
end
2008-08-25 21:16:58 -04:00
2009-02-03 21:25:37 -05:00
# validates_numericality_of with :only_integer w/ mocha
2008-06-27 09:00:55 -04:00
2010-05-19 10:25:46 -04:00
COMMON_CASES . each do | name , validation_options , generate_message_options |
test " validates_numericality_of for :only_integer on generated message #{ name } " do
Person . validates_numericality_of :title , validation_options . merge ( :only_integer = > true )
@person . title = '0.0'
@person . errors . expects ( :generate_message ) . with ( :title , :not_an_integer , generate_message_options . merge ( :value = > '0.0' ) )
@person . valid?
end
2009-02-03 21:25:37 -05:00
end
2008-08-25 21:16:58 -04:00
2009-02-03 21:25:37 -05:00
# validates_numericality_of :odd w/ mocha
2008-06-27 09:00:55 -04:00
2010-05-19 10:25:46 -04:00
COMMON_CASES . each do | name , validation_options , generate_message_options |
test " validates_numericality_of for :odd on generated message #{ name } " do
Person . validates_numericality_of :title , validation_options . merge ( :only_integer = > true , :odd = > true )
@person . title = 0
@person . errors . expects ( :generate_message ) . with ( :title , :odd , generate_message_options . merge ( :value = > 0 ) )
@person . valid?
end
2009-02-03 21:25:37 -05:00
end
2008-08-25 21:16:58 -04:00
2009-02-03 21:25:37 -05:00
# validates_numericality_of :less_than w/ mocha
2008-06-27 09:00:55 -04:00
2010-05-19 10:25:46 -04:00
COMMON_CASES . each do | name , validation_options , generate_message_options |
test " validates_numericality_of for :less_than on generated message #{ name } " do
Person . validates_numericality_of :title , validation_options . merge ( :only_integer = > true , :less_than = > 0 )
@person . title = 1
@person . errors . expects ( :generate_message ) . with ( :title , :less_than , generate_message_options . merge ( :value = > 1 , :count = > 0 ) )
@person . valid?
end
2009-02-03 21:25:37 -05:00
end
2008-06-27 09:00:55 -04:00
2008-08-25 21:16:58 -04:00
2010-05-19 10:25:46 -04:00
# To make things DRY this macro is defined to define 3 tests for every validation case.
def self . set_expectations_for_validation ( validation , error_type , & block_that_sets_validation )
2012-04-23 17:16:05 -04:00
if error_type == :confirmation
attribute = :title_confirmation
else
attribute = :title
end
2010-05-19 10:25:46 -04:00
# test "validates_confirmation_of finds custom model key translation when blank"
test " #{ validation } finds custom model key translation when #{ error_type } " do
2012-04-23 17:16:05 -04:00
I18n . backend . store_translations 'en' , :activemodel = > { :errors = > { :models = > { :person = > { :attributes = > { attribute = > { error_type = > 'custom message' } } } } } }
2010-05-19 10:25:46 -04:00
I18n . backend . store_translations 'en' , :errors = > { :messages = > { error_type = > 'global message' } }
2008-08-25 21:16:58 -04:00
2010-05-19 10:25:46 -04:00
yield ( @person , { } )
@person . valid?
2012-04-23 17:16:05 -04:00
assert_equal [ 'custom message' ] , @person . errors [ attribute ]
2010-05-19 10:25:46 -04:00
end
2008-08-25 21:16:58 -04:00
2010-05-19 10:25:46 -04:00
# test "validates_confirmation_of finds custom model key translation with interpolation when blank"
test " #{ validation } finds custom model key translation with interpolation when #{ error_type } " do
2012-04-23 17:16:05 -04:00
I18n . backend . store_translations 'en' , :activemodel = > { :errors = > { :models = > { :person = > { :attributes = > { attribute = > { error_type = > 'custom message with %{extra}' } } } } } }
2010-05-19 10:25:46 -04:00
I18n . backend . store_translations 'en' , :errors = > { :messages = > { error_type = > 'global message' } }
2008-08-25 21:16:58 -04:00
2010-05-19 10:25:46 -04:00
yield ( @person , { :extra = > " extra information " } )
@person . valid?
2012-04-23 17:16:05 -04:00
assert_equal [ 'custom message with extra information' ] , @person . errors [ attribute ]
2010-05-19 10:25:46 -04:00
end
2008-08-25 21:16:58 -04:00
2010-05-19 10:25:46 -04:00
# test "validates_confirmation_of finds global default key translation when blank"
test " #{ validation } finds global default key translation when #{ error_type } " do
I18n . backend . store_translations 'en' , :errors = > { :messages = > { error_type = > 'global message' } }
2008-08-25 21:16:58 -04:00
2010-05-19 10:25:46 -04:00
yield ( @person , { } )
@person . valid?
2012-04-23 17:16:05 -04:00
assert_equal [ 'global message' ] , @person . errors [ attribute ]
2010-05-19 10:25:46 -04:00
end
2008-06-19 10:25:27 -04:00
end
2008-08-25 21:16:58 -04:00
2010-05-19 10:25:46 -04:00
# validates_confirmation_of w/o mocha
2008-08-25 21:16:58 -04:00
2010-05-19 10:25:46 -04:00
set_expectations_for_validation " validates_confirmation_of " , :confirmation do | person , options_to_merge |
Person . validates_confirmation_of :title , options_to_merge
person . title_confirmation = 'foo'
2008-06-19 10:25:27 -04:00
end
2008-08-25 21:16:58 -04:00
2010-05-19 10:25:46 -04:00
# validates_acceptance_of w/o mocha
2008-08-25 21:16:58 -04:00
2010-05-19 10:25:46 -04:00
set_expectations_for_validation " validates_acceptance_of " , :accepted do | person , options_to_merge |
Person . validates_acceptance_of :title , options_to_merge . merge ( :allow_nil = > false )
2008-06-19 10:25:27 -04:00
end
2008-08-25 21:16:58 -04:00
2010-05-19 10:25:46 -04:00
# validates_presence_of w/o mocha
2008-08-25 21:16:58 -04:00
2010-05-19 10:25:46 -04:00
set_expectations_for_validation " validates_presence_of " , :blank do | person , options_to_merge |
Person . validates_presence_of :title , options_to_merge
2008-06-19 10:25:27 -04:00
end
2008-08-25 21:16:58 -04:00
2008-06-27 09:00:55 -04:00
# validates_length_of :within w/o mocha
2008-08-25 21:16:58 -04:00
2010-05-19 10:25:46 -04:00
set_expectations_for_validation " validates_length_of " , :too_short do | person , options_to_merge |
Person . validates_length_of :title , options_to_merge . merge ( :within = > 3 .. 5 )
2008-06-19 10:25:27 -04:00
end
2008-08-25 21:16:58 -04:00
2010-05-19 10:25:46 -04:00
set_expectations_for_validation " validates_length_of " , :too_long do | person , options_to_merge |
Person . validates_length_of :title , options_to_merge . merge ( :within = > 3 .. 5 )
person . title = " too long "
2008-06-19 10:25:27 -04:00
end
2008-08-25 21:16:58 -04:00
2008-06-27 09:00:55 -04:00
# validates_length_of :is w/o mocha
2008-08-25 21:16:58 -04:00
2010-05-19 10:25:46 -04:00
set_expectations_for_validation " validates_length_of " , :wrong_length do | person , options_to_merge |
Person . validates_length_of :title , options_to_merge . merge ( :is = > 5 )
2008-06-19 10:25:27 -04:00
end
2008-08-25 21:16:58 -04:00
2008-06-27 09:00:55 -04:00
# validates_format_of w/o mocha
2008-08-25 21:16:58 -04:00
2010-05-19 10:25:46 -04:00
set_expectations_for_validation " validates_format_of " , :invalid do | person , options_to_merge |
2012-06-07 18:08:51 -04:00
Person . validates_format_of :title , options_to_merge . merge ( :with = > / \ A[1-9][0-9]* \ z / )
2008-06-19 10:25:27 -04:00
end
2008-08-25 21:16:58 -04:00
2008-06-27 09:00:55 -04:00
# validates_inclusion_of w/o mocha
2008-08-25 21:16:58 -04:00
2010-05-19 10:25:46 -04:00
set_expectations_for_validation " validates_inclusion_of " , :inclusion do | person , options_to_merge |
Person . validates_inclusion_of :title , options_to_merge . merge ( :in = > %w( a b c ) )
2008-06-19 10:25:27 -04:00
end
2008-08-25 21:16:58 -04:00
2008-06-27 09:00:55 -04:00
# validates_exclusion_of w/o mocha
2008-08-25 21:16:58 -04:00
2010-05-19 10:25:46 -04:00
set_expectations_for_validation " validates_exclusion_of " , :exclusion do | person , options_to_merge |
Person . validates_exclusion_of :title , options_to_merge . merge ( :in = > %w( a b c ) )
person . title = 'a'
2008-06-19 10:25:27 -04:00
end
2008-08-25 21:16:58 -04:00
2008-06-27 09:00:55 -04:00
# validates_numericality_of without :only_integer w/o mocha
2008-08-25 21:16:58 -04:00
2010-05-19 10:25:46 -04:00
set_expectations_for_validation " validates_numericality_of " , :not_a_number do | person , options_to_merge |
Person . validates_numericality_of :title , options_to_merge
person . title = 'a'
2008-06-23 08:33:29 -04:00
end
2008-08-25 21:16:58 -04:00
2008-06-27 09:00:55 -04:00
# validates_numericality_of with :only_integer w/o mocha
2008-08-25 21:16:58 -04:00
2010-05-19 10:25:46 -04:00
set_expectations_for_validation " validates_numericality_of " , :not_an_integer do | person , options_to_merge |
Person . validates_numericality_of :title , options_to_merge . merge ( :only_integer = > true )
person . title = '1.0'
2008-06-19 10:25:27 -04:00
end
2008-08-25 21:16:58 -04:00
2008-06-27 09:00:55 -04:00
# validates_numericality_of :odd w/o mocha
2008-08-25 21:16:58 -04:00
2010-05-19 10:25:46 -04:00
set_expectations_for_validation " validates_numericality_of " , :odd do | person , options_to_merge |
Person . validates_numericality_of :title , options_to_merge . merge ( :only_integer = > true , :odd = > true )
person . title = 0
2008-06-19 10:25:27 -04:00
end
2008-08-25 21:16:58 -04:00
2008-06-27 09:00:55 -04:00
# validates_numericality_of :less_than w/o mocha
2008-08-25 21:16:58 -04:00
2010-05-19 10:25:46 -04:00
set_expectations_for_validation " validates_numericality_of " , :less_than do | person , options_to_merge |
Person . validates_numericality_of :title , options_to_merge . merge ( :only_integer = > true , :less_than = > 0 )
person . title = 1
2008-06-19 10:25:27 -04:00
end
2008-08-25 21:16:58 -04:00
2009-10-20 20:20:01 -04:00
# test with validates_with
2008-08-31 06:14:24 -04:00
def test_validations_with_message_symbol_must_translate
2010-01-06 19:04:25 -05:00
I18n . backend . store_translations 'en' , :errors = > { :messages = > { :custom_error = > " I am a custom error " } }
2009-03-20 17:40:37 -04:00
Person . validates_presence_of :title , :message = > :custom_error
@person . title = nil
@person . valid?
assert_equal [ " I am a custom error " ] , @person . errors [ :title ]
2008-08-31 06:14:24 -04:00
end
def test_validates_with_message_symbol_must_translate_per_attribute
2010-01-30 07:07:48 -05:00
I18n . backend . store_translations 'en' , :activemodel = > { :errors = > { :models = > { :person = > { :attributes = > { :title = > { :custom_error = > " I am a custom error " } } } } } }
2009-03-20 17:40:37 -04:00
Person . validates_presence_of :title , :message = > :custom_error
@person . title = nil
@person . valid?
assert_equal [ " I am a custom error " ] , @person . errors [ :title ]
2008-08-31 06:14:24 -04:00
end
def test_validates_with_message_symbol_must_translate_per_model
2010-01-30 07:07:48 -05:00
I18n . backend . store_translations 'en' , :activemodel = > { :errors = > { :models = > { :person = > { :custom_error = > " I am a custom error " } } } }
2009-03-20 17:40:37 -04:00
Person . validates_presence_of :title , :message = > :custom_error
@person . title = nil
@person . valid?
assert_equal [ " I am a custom error " ] , @person . errors [ :title ]
2008-08-31 06:14:24 -04:00
end
def test_validates_with_message_string
2009-03-20 17:40:37 -04:00
Person . validates_presence_of :title , :message = > " I am a custom error "
@person . title = nil
@person . valid?
assert_equal [ " I am a custom error " ] , @person . errors [ :title ]
2008-08-31 06:14:24 -04:00
end
2009-09-08 11:10:14 -04:00
end