From c5ce7d5ff430cbe81ba186739390b94104cc06a9 Mon Sep 17 00:00:00 2001 From: DualFroz Date: Thu, 10 Sep 2026 17:29:17 +0200 Subject: [PATCH] test: cover I18nBackendTest, test_lookup_returns_nil_for_unknown_key --- test/test_i18n_backend.rb | 53 ++++++++++++++++++++++ test/test_i18n_controller.rb | 85 ++++++++++++++++++++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 test/test_i18n_backend.rb create mode 100644 test/test_i18n_controller.rb diff --git a/test/test_i18n_backend.rb b/test/test_i18n_backend.rb new file mode 100644 index 0000000..3668586 --- /dev/null +++ b/test/test_i18n_backend.rb @@ -0,0 +1,53 @@ +require 'minitest/autorun' +require 'prism' +require 'tmpdir' + +class I18nBackendTest < Minitest::Test + def setup + @backend = Prism::I18n::Backend.new + end + + def test_lookup_returns_nil_for_unknown_key + assert_nil @backend.lookup(:en, 'missing.key') + end + + def test_store_and_lookup_nested_key + @backend.store_translations(:en, 'posts' => { 'title' => 'Title', 'body' => 'Body' }) + assert_equal 'Title', @backend.lookup(:en, 'posts.title') + assert_equal 'Body', @backend.lookup(:en, :'posts.body') + end + + def test_store_translations_deep_merges_instead_of_replacing + @backend.store_translations(:en, 'posts' => { 'title' => 'Title' }) + @backend.store_translations(:en, 'posts' => { 'body' => 'Body' }) + assert_equal 'Title', @backend.lookup(:en, 'posts.title') + assert_equal 'Body', @backend.lookup(:en, 'posts.body') + end + + def test_locales_lists_every_stored_locale + @backend.store_translations(:en, 'hello' => 'Hello') + @backend.store_translations(:pl, 'hello' => 'Czesc') + assert_equal [:en, :pl], @backend.locales.sort + end + + def test_lookup_returns_nil_when_key_path_hits_a_non_hash + @backend.store_translations(:en, 'hello' => 'Hello') + assert_nil @backend.lookup(:en, 'hello.nested') + end + + def test_load_file_reads_json_and_uses_basename_as_locale + Dir.mktmpdir do |dir| + path = File.join(dir, 'en.json') + File.write(path, '{"greeting": "Hi %{name}"}') + locale = @backend.load_file(path) + assert_equal :en, locale + assert_equal 'Hi %{name}', @backend.lookup(:en, 'greeting') + end + end + + def test_clear_removes_all_translations + @backend.store_translations(:en, 'hello' => 'Hello') + @backend.clear! + assert_empty @backend.locales + end +end diff --git a/test/test_i18n_controller.rb b/test/test_i18n_controller.rb new file mode 100644 index 0000000..e5a57ec --- /dev/null +++ b/test/test_i18n_controller.rb @@ -0,0 +1,85 @@ +require 'minitest/autorun' +require 'prism' +require 'support' + +class GreetingsController < Prism::Controller + def show + html(t('hello')) + end + + def remember + session[:locale] = params['locale'] + html(t('hello')) + end + + def stamp + html(l(Time.utc(2026, 3, 5, 8, 30, 0))) + end +end + +class GreetingsApp < Prism::Application + enable_sessions secret: 'i18n-controller-test-secret' + + get '/greet', to: 'greetings#show' + get '/greet/remember', to: 'greetings#remember' + get '/greet/stamp', to: 'greetings#stamp' +end + +class I18nControllerTest < Minitest::Test + include TestSupport + + def setup + Prism::I18n.reset! + Prism::I18n.store_translations(:en, 'hello' => 'Hello') + Prism::I18n.store_translations(:pl, 'hello' => 'Czesc') + end + + def teardown + Prism::I18n.reset! + end + + def call(method, path, **opts) + GreetingsApp.call(env_for(method, path, **opts)) + end + + def test_defaults_to_default_locale_with_no_hints + _, _, body = call('GET', '/greet') + assert_equal 'Hello', body.join + end + + def test_locale_query_param_overrides_default + _, _, body = call('GET', '/greet?locale=pl') + assert_equal 'Czesc', body.join + end + + def test_unknown_locale_query_param_is_ignored + _, _, body = call('GET', '/greet?locale=de') + assert_equal 'Hello', body.join + end + + def test_accept_language_header_is_used_when_no_param_given + _, _, body = call('GET', '/greet', headers: { 'Accept-Language' => 'pl,en;q=0.5' }) + assert_equal 'Czesc', body.join + end + + def test_locale_param_wins_over_accept_language_header + _, _, body = call('GET', '/greet?locale=en', headers: { 'Accept-Language' => 'pl' }) + assert_equal 'Hello', body.join + end + + def test_session_locale_is_sticky_across_requests + status, headers, body = call('GET', '/greet/remember?locale=pl') + assert_equal 200, status + assert_equal 'Czesc', body.join + line = headers['Set-Cookie'].split("\n").find { |c| c.start_with?('prism.session=') } + cookie = line.split(';').first + + _, _, body = call('GET', '/greet', cookies: cookie) + assert_equal 'Czesc', body.join + end + + def test_localize_helper_formats_time_in_view + _, _, body = call('GET', '/greet/stamp') + assert_equal '2026-03-05 08:30:00', body.join + end +end