Skip to content

Commit

Permalink
feat: [ST-2310] Support use_cookie_lang setting (#237)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
bryanzerrudo authored Oct 10, 2023
1 parent 33e84d6 commit 3cd72e1
Show file tree
Hide file tree
Showing 4 changed files with 122 additions and 2 deletions.
7 changes: 7 additions & 0 deletions lib/wovnrb.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
3 changes: 2 additions & 1 deletion lib/wovnrb/store.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion lib/wovnrb/version.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
module Wovnrb
VERSION = '3.10.3'.freeze
VERSION = '3.11.0'.freeze
end
112 changes: 112 additions & 0 deletions test/lib/wovnrb_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand All @@ -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:)
Expand Down

0 comments on commit 3cd72e1

Please sign in to comment.