diff --git a/test/test_i18n_translator.rb b/test/test_i18n_translator.rb new file mode 100644 index 0000000..3eb225c --- /dev/null +++ b/test/test_i18n_translator.rb @@ -0,0 +1,82 @@ +require 'minitest/autorun' +require 'prism' + +class I18nTranslatorTest < Minitest::Test + def setup + @backend = Prism::I18n::Backend.new + @backend.store_translations(:en, { + 'greeting' => 'Hello, %{name}!', + 'apples' => { 'zero' => 'no apples', 'one' => 'one apple', 'other' => '%{count} apples' }, + 'cars' => { 'one' => 'one car', 'other' => '%{count} cars' }, + 'nav' => { 'home' => 'Home' } + }) + @backend.store_translations(:pl, 'nav' => { 'home' => 'Strona glowna' }) + @translator = Prism::I18n::Translator.new(@backend, default_locale: :en) + end + + def test_translate_plain_string + assert_equal 'Home', @translator.translate('nav.home', locale: :en) + end + + def test_translate_interpolates_named_placeholders + assert_equal 'Hello, Ada!', @translator.translate('greeting', locale: :en, name: 'Ada') + end + + def test_translate_missing_interpolation_argument_raises + assert_raises(Prism::I18n::Translator::MissingInterpolationError) do + @translator.translate('greeting', locale: :en) + end + end + + def test_translate_missing_key_raises_by_default + assert_raises(Prism::I18n::Translator::MissingTranslationError) do + @translator.translate('nowhere.at.all', locale: :en) + end + end + + def test_translate_missing_key_uses_default_when_given + assert_equal 'fallback text', @translator.translate('nowhere.at.all', locale: :en, default: 'fallback text') + end + + def test_translate_pluralizes_zero_one_other + assert_equal 'no apples', @translator.translate('apples', locale: :en, count: 0) + assert_equal 'one apple', @translator.translate('apples', locale: :en, count: 1) + assert_equal '5 apples', @translator.translate('apples', locale: :en, count: 5) + end + + def test_translate_pluralizes_zero_as_other_when_no_zero_key + assert_equal '0 cars', @translator.translate('cars', locale: :en, count: 0) + end + + def test_translate_falls_back_to_default_locale_for_missing_key_in_requested_locale + assert_equal 'Hello, Ada!', @translator.translate('greeting', locale: :pl, name: 'Ada') + end + + def test_translate_prefers_requested_locale_over_fallback + assert_equal 'Strona glowna', @translator.translate('nav.home', locale: :pl) + end + + def test_custom_fallback_chain_is_tried_before_default_locale + backend = Prism::I18n::Backend.new + backend.store_translations(:en, 'only_en' => 'English only') + backend.store_translations(:'pt-BR', 'greeting' => 'Ola') + translator = Prism::I18n::Translator.new(backend, default_locale: :en, fallbacks: { pt: [:'pt-BR'] }) + assert_equal 'Ola', translator.translate('greeting', locale: :pt) + end + + def test_localize_time_with_default_format + time = Time.utc(2026, 3, 5, 8, 30, 0) + assert_equal '2026-03-05 08:30:00', @translator.localize(time, locale: :en) + end + + def test_localize_date_with_default_format + date = Date.new(2026, 3, 5) + assert_equal '2026-03-05', @translator.localize(date, locale: :en) + end + + def test_localize_uses_named_format_from_backend + @backend.store_translations(:en, 'time' => { 'formats' => { 'short' => '%d.%m.%Y' } }) + time = Time.utc(2026, 3, 5, 8, 30, 0) + assert_equal '05.03.2026', @translator.localize(time, locale: :en, format: :short) + end +end