require "abstract_unit" module I18n class CustomExceptionHandler def self.call(exception, locale, key, options) "from CustomExceptionHandler" end end end class TranslationHelperTest < ActiveSupport::TestCase include ActionView::Helpers::TranslationHelper attr_reader :request, :view setup do I18n.backend.store_translations(:en, translations: { templates: { found: { foo: "Foo" }, array: { foo: { bar: "Foo Bar" } }, default: { foo: "Foo" } }, foo: "Foo", hello: "Hello World", html: "Hello World", hello_html: "Hello World", interpolated_html: "Hello %{word}", array_html: %w(foo bar), array: %w(foo bar), count_html: { one: "One %{count}", other: "Other %{count}" } } ) @view = ::ActionView::Base.new(ActionController::Base.view_paths, {}) end teardown do I18n.backend.reload! end def test_delegates_setting_to_i18n assert_called_with(I18n, :translate, [:foo, locale: "en", raise: true], returns: "") do translate :foo, locale: "en" end end def test_delegates_localize_to_i18n @time = Time.utc(2008, 7, 8, 12, 18, 38) assert_called_with(I18n, :localize, [@time]) do localize @time end end def test_returns_missing_translation_message_without_span_wrap old_value = ActionView::Base.debug_missing_translation ActionView::Base.debug_missing_translation = false expected = "translation missing: en.translations.missing" assert_equal expected, translate(:"translations.missing") ensure ActionView::Base.debug_missing_translation = old_value end def test_returns_missing_translation_message_wrapped_into_span expected = 'Missing' assert_equal expected, translate(:"translations.missing") assert_equal true, translate(:"translations.missing").html_safe? end def test_returns_missing_translation_message_with_unescaped_interpolation expected = 'Missing' assert_equal expected, translate(:"translations.missing", name: "Kir", year: "2015", vulnerable: %{" onclick="alert()"}) assert translate(:"translations.missing").html_safe? end def test_returns_missing_translation_message_does_filters_out_i18n_options expected = 'Missing' assert_equal expected, translate(:"translations.missing", year: "2015", default: []) expected = 'Missing' assert_equal expected, translate(:"translations.missing", year: "2015", scope: %i(scoped)) end def test_raises_missing_translation_message_with_raise_config_option ActionView::Base.raise_on_missing_translations = true assert_raise(I18n::MissingTranslationData) do translate("translations.missing") end ensure ActionView::Base.raise_on_missing_translations = false end def test_raises_missing_translation_message_with_raise_option assert_raise(I18n::MissingTranslationData) do translate(:"translations.missing", raise: true) end end def test_uses_custom_exception_handler_when_specified old_exception_handler = I18n.exception_handler I18n.exception_handler = I18n::CustomExceptionHandler assert_equal "from CustomExceptionHandler", translate(:"translations.missing", raise: false) ensure I18n.exception_handler = old_exception_handler end def test_uses_custom_exception_handler_when_specified_for_html old_exception_handler = I18n.exception_handler I18n.exception_handler = I18n::CustomExceptionHandler assert_equal "from CustomExceptionHandler", translate(:"translations.missing_html", raise: false) ensure I18n.exception_handler = old_exception_handler end def test_translation_returning_an_array expected = %w(foo bar) assert_equal expected, translate(:"translations.array") end def test_finds_translation_scoped_by_partial assert_equal "Foo", view.render(file: "translations/templates/found").strip end def test_finds_array_of_translations_scoped_by_partial assert_equal "Foo Bar", @view.render(file: "translations/templates/array").strip end def test_default_lookup_scoped_by_partial assert_equal "Foo", view.render(file: "translations/templates/default").strip end def test_missing_translation_scoped_by_partial expected = 'Missing' assert_equal expected, view.render(file: "translations/templates/missing").strip end def test_translate_does_not_mark_plain_text_as_safe_html assert_equal false, translate(:'translations.hello').html_safe? end def test_translate_marks_translations_named_html_as_safe_html assert translate(:'translations.html').html_safe? end def test_translate_marks_translations_with_a_html_suffix_as_safe_html assert translate(:'translations.hello_html').html_safe? end def test_translate_escapes_interpolations_in_translations_with_a_html_suffix word_struct = Struct.new(:to_s) assert_equal "Hello <World>", translate(:'translations.interpolated_html', word: "") assert_equal "Hello <World>", translate(:'translations.interpolated_html', word: word_struct.new("")) end def test_translate_with_html_count assert_equal "One 1", translate(:'translations.count_html', count: 1) assert_equal "Other 2", translate(:'translations.count_html', count: 2) assert_equal "Other <One>", translate(:'translations.count_html', count: "") end def test_translation_returning_an_array_ignores_html_suffix assert_equal ["foo", "bar"], translate(:'translations.array_html') end def test_translate_with_default_named_html translation = translate(:'translations.missing', default: :'translations.hello_html') assert_equal "Hello World", translation assert_equal true, translation.html_safe? end def test_translate_with_missing_default translation = translate(:'translations.missing', default: :'translations.missing_html') expected = 'Missing Html' assert_equal expected, translation assert_equal true, translation.html_safe? end def test_translate_with_missing_default_and_raise_option assert_raise(I18n::MissingTranslationData) do translate(:'translations.missing', default: :'translations.missing_html', raise: true) end end def test_translate_with_two_defaults_named_html translation = translate(:'translations.missing', default: [:'translations.missing_html', :'translations.hello_html']) assert_equal "Hello World", translation assert_equal true, translation.html_safe? end def test_translate_with_last_default_named_html translation = translate(:'translations.missing', default: [:'translations.missing', :'translations.hello_html']) assert_equal "Hello World", translation assert_equal true, translation.html_safe? end def test_translate_with_last_default_not_named_html translation = translate(:'translations.missing', default: [:'translations.missing_html', :'translations.foo']) assert_equal "Foo", translation assert_equal false, translation.html_safe? end def test_translate_with_string_default translation = translate(:'translations.missing', default: "A Generic String") assert_equal "A Generic String", translation end def test_translate_with_object_default translation = translate(:'translations.missing', default: 123) assert_equal 123, translation end def test_translate_with_array_of_string_defaults translation = translate(:'translations.missing', default: ["A Generic String", "Second generic string"]) assert_equal "A Generic String", translation end def test_translate_with_array_of_defaults_with_nil translation = translate(:'translations.missing', default: [:'also_missing', nil, "A Generic String"]) assert_equal "A Generic String", translation end def test_translate_with_array_of_array_default translation = translate(:'translations.missing', default: [[]]) assert_equal [], translation end def test_translate_does_not_change_options options = {} translate(:'translations.missing', options) assert_equal({}, options) end end