From 3cd72e1c52a54efa31dd870ab4fca65af06df0d1 Mon Sep 17 00:00:00 2001 From: Bryan Zerrudo Date: Tue, 10 Oct 2023 12:50:10 +0900 Subject: [PATCH] feat: [ST-2310] Support `use_cookie_lang` setting (#237) * feat: Add `use_cookie_lang` * style: Lint * fix: Infinite redirect * test: For differing target and cookie lang * test: For `use_cookie_lang: false` * chore: Version bump --- lib/wovnrb.rb | 7 +++ lib/wovnrb/store.rb | 3 +- lib/wovnrb/version.rb | 2 +- test/lib/wovnrb_test.rb | 112 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 122 insertions(+), 2 deletions(-) diff --git a/lib/wovnrb.rb b/lib/wovnrb.rb index cd4f8b7..1abc131 100644 --- a/lib/wovnrb.rb +++ b/lib/wovnrb.rb @@ -35,6 +35,13 @@ def call(env) default_lang = @store.settings['default_lang'] return @app.call(env) if @store.settings['test_mode'] && @store.settings['test_url'] != headers.url + cookie_lang = Rack::Request.new(env).cookies['wovn_selected_lang'] + request_lang = headers.lang_code + if @store.settings['use_cookie_lang'] && cookie_lang.present? && request_lang != cookie_lang && request_lang == @store.default_lang + redirect_headers = headers.redirect(cookie_lang) + return [302, redirect_headers, ['']] + end + # redirect if the path is set to the default language (for SEO purposes) if explicit_default_lang?(headers) redirect_headers = headers.redirect(default_lang) diff --git a/lib/wovnrb/store.rb b/lib/wovnrb/store.rb index 74a8b7c..61630f6 100644 --- a/lib/wovnrb/store.rb +++ b/lib/wovnrb/store.rb @@ -41,7 +41,8 @@ def self.default_settings 'compress_api_requests' => true, 'translate_canonical_tag' => true, 'custom_domain_langs' => {}, - 'insert_hreflangs' => true + 'insert_hreflangs' => true, + 'use_cookie_lang' => false ) end diff --git a/lib/wovnrb/version.rb b/lib/wovnrb/version.rb index 3d881a6..478c634 100644 --- a/lib/wovnrb/version.rb +++ b/lib/wovnrb/version.rb @@ -1,3 +1,3 @@ module Wovnrb - VERSION = '3.10.3'.freeze + VERSION = '3.11.0'.freeze end diff --git a/test/lib/wovnrb_test.rb b/test/lib/wovnrb_test.rb index a9f203f..0ee2781 100644 --- a/test/lib/wovnrb_test.rb +++ b/test/lib/wovnrb_test.rb @@ -239,6 +239,7 @@ def test_call_with_path_ignored_should_not_change_environment 'rack.request.form_input' => '', 'rack.request.form_hash' => {}, 'rack.request.form_pairs' => [], + 'rack.request.cookie_hash' => {}, 'HTTP_HOST' => 'test.com', 'REQUEST_URI' => '/en/ignored', 'PATH_INFO' => '/en/ignored' @@ -247,6 +248,117 @@ def test_call_with_path_ignored_should_not_change_environment assert_call_affects_env(settings, env, mock_api: false, affected: false) end + def test_call__with_use_cookie_lang_true__cookie_lang_is_target_lang__should_redirect + settings = { + 'project_token' => '123456', + 'url_pattern' => 'path', + 'default_lang' => 'ja', + 'supported_langs' => %w[ja en], + 'use_cookie_lang' => true + } + env = Wovnrb.get_env( + { + 'url' => 'http://test.com/foo', + 'HTTP_COOKIE' => 'wovn_selected_lang=en' + } + ) + + sut = Wovnrb::Interceptor.new(get_app, settings) + status, res_headers, _body = sut.call(env) + + assert_equal(302, status) + assert_equal('http://test.com/en/foo', res_headers['location']) + end + + def test_call__with_use_cookie_lang_true__cookie_lang_is_default_lang__should_not_redirect + settings = { + 'project_token' => '123456', + 'url_pattern' => 'path', + 'default_lang' => 'ja', + 'supported_langs' => %w[ja en], + 'use_cookie_lang' => true + } + env = Wovnrb.get_env( + { + 'url' => 'http://test.com/foo', + 'HTTP_COOKIE' => 'wovn_selected_lang=ja' + } + ) + + sut = Wovnrb::Interceptor.new(get_app, settings) + status, res_headers, _body = sut.call(env) + + assert_equal(200, status) + assert_nil(res_headers['location']) + end + + def test_call__with_use_cookie_lang_true__cookie_lang_is_different_target_lang__should_not_redirect + settings = { + 'project_token' => '123456', + 'url_pattern' => 'path', + 'default_lang' => 'ja', + 'supported_langs' => %w[ja en fr], + 'use_cookie_lang' => true + } + env = Wovnrb.get_env( + { + 'url' => 'http://test.com/en/foo', + 'HTTP_COOKIE' => 'wovn_selected_lang=fr' + } + ) + + mock_translation_api_response('', '') + sut = Wovnrb::Interceptor.new(get_app, settings) + status, res_headers, _body = sut.call(env) + + assert_equal(200, status) + assert_nil(res_headers['location']) + end + + def test_call__with_use_cookie_lang_true__cookie_lang_is_empty__should_not_redirect + settings = { + 'project_token' => '123456', + 'url_pattern' => 'path', + 'default_lang' => 'ja', + 'supported_langs' => %w[ja en], + 'use_cookie_lang' => true + } + env = Wovnrb.get_env( + { + 'url' => 'http://test.com/foo', + 'HTTP_COOKIE' => '' + } + ) + + sut = Wovnrb::Interceptor.new(get_app, settings) + status, res_headers, _body = sut.call(env) + + assert_equal(200, status) + assert_nil(res_headers['location']) + end + + def test_call__with_use_cookie_lang_false__should_not_redirect + settings = { + 'project_token' => '123456', + 'url_pattern' => 'path', + 'default_lang' => 'ja', + 'supported_langs' => %w[ja en], + 'use_cookie_lang' => false + } + env = Wovnrb.get_env( + { + 'url' => 'http://test.com/foo', + 'HTTP_COOKIE' => 'wovn_selected_lang=en' + } + ) + + sut = Wovnrb::Interceptor.new(get_app, settings) + status, res_headers, _body = sut.call(env) + + assert_equal(200, status) + assert_nil(res_headers['location']) + end + private def assert_call_affects_env(settings, env, mock_api:, affected:)