wovnrb 3.5.0 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/README.en.md +30 -13
  3. data/build.sh +7 -0
  4. data/docker/nginx/Dockerfile +18 -0
  5. data/docker/nginx/README.md +13 -0
  6. data/docker/nginx/build.sh +8 -0
  7. data/docker/nginx/scripts/configure_sshd.sh +25 -0
  8. data/docker/nginx/scripts/startup.sh +10 -0
  9. data/docker/nginx/wovnrb.conf +19 -0
  10. data/docker/rails/Dockerfile +9 -0
  11. data/docker/rails/Dockerfile.ECS +17 -0
  12. data/docker/rails/TestSite/Gemfile +0 -2
  13. data/docker/rails/TestSite/app/controllers/custom_response_controller.rb +1 -1
  14. data/docker/rails/TestSite/config/environments/development.rb +2 -0
  15. data/docker/rails/TestSite/config/environments/production.rb +2 -0
  16. data/docker/rails/TestSite/config/environments/test.rb +2 -0
  17. data/docker/rails/TestSite/public/index.html +1 -1
  18. data/docker/rails/TestSite/start.sh +2 -11
  19. data/docker/rails/TestSite/start_rails.sh +9 -0
  20. data/docker/rails/TestSite/yarn.lock +3 -3
  21. data/docker/scripts/jenkins/build.sh +45 -0
  22. data/docker/scripts/jenkins/tag_and_push_image.sh +30 -0
  23. data/docker/scripts/jenkins/taskdef.json +104 -0
  24. data/docker/scripts/jenkins/taskdef.json.bak +99 -0
  25. data/lib/wovnrb/api_translator.rb +6 -1
  26. data/lib/wovnrb/headers.rb +19 -2
  27. data/lib/wovnrb/services/html_converter.rb +17 -1
  28. data/lib/wovnrb/services/url.rb +136 -0
  29. data/lib/wovnrb/store.rb +8 -2
  30. data/lib/wovnrb/url_language_switcher.rb +124 -0
  31. data/lib/wovnrb/version.rb +1 -1
  32. data/lib/wovnrb.rb +3 -1
  33. data/test/lib/api_translator_test.rb +44 -0
  34. data/test/lib/services/html_converter_test.rb +210 -37
  35. data/test/lib/services/url_test.rb +308 -0
  36. data/test/lib/url_language_switcher_test.rb +798 -0
  37. data/test/lib/wovnrb_test.rb +2 -1
  38. data/test/test_helper.rb +4 -1
  39. metadata +22 -3
@@ -2,7 +2,7 @@ require 'test_helper'
2
2
 
3
3
  module Wovnrb
4
4
  class HtmlConverterTest < WovnMiniTest
5
- def test_build_api_compatible_html
5
+ test 'build API compatible html' do
6
6
  converter = prepare_html_converter('<html><body><a class="test">hello</a></body></html>', supported_langs: %w[en vi])
7
7
  converted_html, = converter.build_api_compatible_html
8
8
 
@@ -10,7 +10,7 @@ module Wovnrb
10
10
  assert_equal(expected_html, converted_html)
11
11
  end
12
12
 
13
- def test_build_api_compatible_html_with_custom_lang_param_name
13
+ test 'build API compatible html - with custom lang param name' do
14
14
  settings = {
15
15
  supported_langs: %w[en vi],
16
16
  url_lang_pattern: 'query',
@@ -23,7 +23,7 @@ module Wovnrb
23
23
  assert_equal(expected_html, converted_html)
24
24
  end
25
25
 
26
- def test_build_api_compatible_html_not_fail_for_big_content
26
+ test 'build API compatible html - excessively large HTML' do
27
27
  long_string = 'a' * 60_000
28
28
  converter = prepare_html_converter("<html><body><p>#{long_string}</p></body></html>", supported_langs: %w[en vi])
29
29
  converted_html, = converter.build_api_compatible_html
@@ -32,7 +32,7 @@ module Wovnrb
32
32
  assert_equal(expected_html, converted_html)
33
33
  end
34
34
 
35
- def test_build_api_compatible_html_ignored_content_should_not_be_sent
35
+ test 'build API compatible html - ignored content should not be sent' do
36
36
  html = [
37
37
  '<html><body>',
38
38
  '<p>Hello <span wovn-ignore>WOVN</span><p>',
@@ -49,7 +49,7 @@ module Wovnrb
49
49
  assert_equal(expected_convert_html, converted_html)
50
50
  end
51
51
 
52
- def test_build_api_compatible_html_form_should_not_be_sent
52
+ test 'build API compatible html - do not send html form' do
53
53
  html = [
54
54
  '<html><body>',
55
55
  '<form action="/test" method="POST">',
@@ -66,7 +66,7 @@ module Wovnrb
66
66
  assert_equal(expected_convert_html, converted_html)
67
67
  end
68
68
 
69
- def test_build_api_compatible_html_hidden_input_should_not_be_sent
69
+ test 'build API compatible html - do not send hidden form input' do
70
70
  html = [
71
71
  '<html><body>',
72
72
  '<input id="user-id" type="hidden" value="secret-id">',
@@ -91,7 +91,7 @@ module Wovnrb
91
91
  assert_equal(expected_convert_html, converted_html)
92
92
  end
93
93
 
94
- def test_transform_html
94
+ test 'Transform HTML' do
95
95
  converter = prepare_html_converter('<html><body><a>hello</a></body></html>', supported_langs: %w[en vi])
96
96
  translated_html = converter.build
97
97
 
@@ -99,7 +99,7 @@ module Wovnrb
99
99
  assert_equal(expected_html, translated_html)
100
100
  end
101
101
 
102
- def test_transform_html_with_empty_supported_langs
102
+ test 'Transform HTML - with empty supported langs' do
103
103
  converter = prepare_html_converter('<html><body><a>hello</a></body></html>', supported_langs: [])
104
104
  translated_html = converter.build
105
105
 
@@ -107,7 +107,7 @@ module Wovnrb
107
107
  assert_equal(expected_html, translated_html)
108
108
  end
109
109
 
110
- def test_transform_html_with_head_tag
110
+ test 'Transform HTML - with head tag' do
111
111
  converter = prepare_html_converter('<html><head><title>TITLE</title></head><body><a>hello</a></body></html>', supported_langs: %w[en vi])
112
112
  translated_html = converter.build
113
113
 
@@ -115,7 +115,7 @@ module Wovnrb
115
115
  assert_equal(expected_html, translated_html)
116
116
  end
117
117
 
118
- def test_transform_html_without_body
118
+ test 'Transform HTML - without body' do
119
119
  converter = prepare_html_converter('<html>hello<a>world</a></html>', supported_langs: [])
120
120
  translated_html = converter.build
121
121
 
@@ -123,7 +123,7 @@ module Wovnrb
123
123
  assert_equal(expected_html, translated_html)
124
124
  end
125
125
 
126
- def test_transform_html_on_default_lang_with_query_pattern_and_supported_lang
126
+ test 'Transform HTML - default lang - with query pattern and supported langs defined' do
127
127
  dom = get_dom('<html>hello<a>world</a></html>')
128
128
  settings = {
129
129
  'default_lang' => 'en',
@@ -131,14 +131,101 @@ module Wovnrb
131
131
  'url_pattern' => 'query'
132
132
  }
133
133
  store, headers = store_headers_factory(settings)
134
- converter = HtmlConverter.new(dom, store, headers)
134
+ url_lang_switcher = Wovnrb::UrlLanguageSwitcher.new(store)
135
+ converter = HtmlConverter.new(dom, store, headers, url_lang_switcher)
135
136
  translated_html = converter.build
136
137
 
137
138
  expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/?wovn=ja\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?wovn=vi\"></head><body>hello<a>world</a></body></html>"
138
139
  assert_equal(expected_html, translated_html)
139
140
  end
140
141
 
141
- def test_transform_html_on_default_lang_with_path_pattern_and_supported_lang
142
+ test 'Transform HTML - canonical tag - target lang - should translate' do
143
+ dom = get_dom('<html><head><link rel="canonical" href="http://my-site.com/" /></head><body></body></html>')
144
+ settings = {
145
+ 'default_lang' => 'en',
146
+ 'supported_langs' => %w[en ja vi],
147
+ 'url_pattern' => 'path',
148
+ 'translate_canonical_tag' => true
149
+ }
150
+ store, headers = store_headers_factory(settings, 'http://my-site.com/vi/')
151
+ url_lang_switcher = Wovnrb::UrlLanguageSwitcher.new(store)
152
+ converter = HtmlConverter.new(dom, store, headers, url_lang_switcher)
153
+ translated_html = converter.build
154
+
155
+ expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=vi&amp;defaultLang=en&amp;urlPattern=path&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"canonical\" href=\"http://my-site.com/vi/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/ja/\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/vi/\"></head><body></body></html>"
156
+ assert_equal(expected_html, translated_html)
157
+ end
158
+
159
+ test 'Transform HTML - canonical tag - default lang - path pattern - no need to translate' do
160
+ dom = get_dom('<html><head><link rel="canonical" href="http://my-site.com/" /></head><body></body></html>')
161
+ settings = {
162
+ 'default_lang' => 'en',
163
+ 'supported_langs' => %w[en ja vi],
164
+ 'url_pattern' => 'path',
165
+ 'translate_canonical_tag' => true
166
+ }
167
+ store, headers = store_headers_factory(settings, 'http://my-site.com/')
168
+ url_lang_switcher = Wovnrb::UrlLanguageSwitcher.new(store)
169
+ converter = HtmlConverter.new(dom, store, headers, url_lang_switcher)
170
+ translated_html = converter.build
171
+
172
+ expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=path&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"canonical\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/ja/\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/vi/\"></head><body></body></html>"
173
+ assert_equal(expected_html, translated_html)
174
+ end
175
+
176
+ test 'Transform HTML - canonical tag - default lang - query pattern - no need to translate' do
177
+ dom = get_dom('<html><head><link rel="canonical" href="http://my-site.com/" /></head><body></body></html>')
178
+ settings = {
179
+ 'default_lang' => 'en',
180
+ 'supported_langs' => %w[en ja vi],
181
+ 'url_pattern' => 'query',
182
+ 'translate_canonical_tag' => true
183
+ }
184
+ store, headers = store_headers_factory(settings, 'http://my-site.com/')
185
+ url_lang_switcher = Wovnrb::UrlLanguageSwitcher.new(store)
186
+ converter = HtmlConverter.new(dom, store, headers, url_lang_switcher)
187
+ translated_html = converter.build
188
+
189
+ expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"canonical\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/?wovn=ja\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?wovn=vi\"></head><body></body></html>"
190
+ assert_equal(expected_html, translated_html)
191
+ end
192
+
193
+ test 'Transform HTML - canonical tag - default lang - has default lang alias - should use alias' do
194
+ dom = get_dom('<html><head><link rel="canonical" href="http://my-site.com/" /></head><body></body></html>')
195
+ settings = {
196
+ 'default_lang' => 'en',
197
+ 'supported_langs' => %w[en ja vi],
198
+ 'url_pattern' => 'query',
199
+ 'translate_canonical_tag' => true,
200
+ 'custom_lang_aliases' => { 'en' => 'english' }
201
+ }
202
+ store, headers = store_headers_factory(settings, 'http://my-site.com/')
203
+ url_lang_switcher = Wovnrb::UrlLanguageSwitcher.new(store)
204
+ converter = HtmlConverter.new(dom, store, headers, url_lang_switcher)
205
+ translated_html = converter.build
206
+
207
+ expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={&quot;en&quot;:&quot;english&quot;}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"canonical\" href=\"http://my-site.com/?wovn=english\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/?wovn=ja\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/?wovn=vi\"></head><body></body></html>"
208
+ assert_equal(expected_html, translated_html)
209
+ end
210
+
211
+ test 'Transform HTML - canonical tag - disabled - do not translate' do
212
+ dom = get_dom('<html><head><link rel="canonical" href="http://my-site.com/" /></head><body></body></html>')
213
+ settings = {
214
+ 'default_lang' => 'en',
215
+ 'supported_langs' => %w[en ja vi],
216
+ 'url_pattern' => 'path',
217
+ 'translate_canonical_tag' => false
218
+ }
219
+ store, headers = store_headers_factory(settings, 'http://my-site.com/vi/')
220
+ url_lang_switcher = Wovnrb::UrlLanguageSwitcher.new(store)
221
+ converter = HtmlConverter.new(dom, store, headers, url_lang_switcher)
222
+ translated_html = converter.build
223
+
224
+ expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=vi&amp;defaultLang=en&amp;urlPattern=path&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"canonical\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/ja/\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/vi/\"></head><body></body></html>"
225
+ assert_equal(expected_html, translated_html)
226
+ end
227
+
228
+ test 'Transform HTML - default lang - with path pattern and supported langs defined' do
142
229
  dom = get_dom('<html>hello<a>world</a></html>')
143
230
  settings = {
144
231
  'default_lang' => 'en',
@@ -146,14 +233,15 @@ module Wovnrb
146
233
  'url_pattern' => 'path'
147
234
  }
148
235
  store, headers = store_headers_factory(settings)
149
- converter = HtmlConverter.new(dom, store, headers)
236
+ url_lang_switcher = Wovnrb::UrlLanguageSwitcher.new(store)
237
+ converter = HtmlConverter.new(dom, store, headers, url_lang_switcher)
150
238
  translated_html = converter.build
151
239
 
152
240
  expected_html = "<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=path&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><link rel=\"alternate\" hreflang=\"en\" href=\"http://my-site.com/\"><link rel=\"alternate\" hreflang=\"ja\" href=\"http://my-site.com/ja/\"><link rel=\"alternate\" hreflang=\"vi\" href=\"http://my-site.com/vi/\"></head><body>hello<a>world</a></body></html>"
153
241
  assert_equal(expected_html, translated_html)
154
242
  end
155
243
 
156
- def test_replace_snippet
244
+ test 'replace_snippet' do
157
245
  converter = prepare_html_converter('<html><head>
158
246
  <script src="/a"></script>
159
247
  <script src="//j.wovn.io/1" async="true">
@@ -161,21 +249,46 @@ module Wovnrb
161
249
  <script src="https//cdn.wovn.io/" data-wovnio="key=2wpv0n async></script>
162
250
  <script src="https://wovn.global.ssl.fastly.net/widget/abcdef></script>
163
251
  </head></html>')
164
- converter.send(:replace_snippet)
165
-
166
- expected_html = "<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script><script src=\"/a\"></script></head><body></body></html>"
167
- assert_equal(expected_html.gsub(/\s+/, ''), converter.send(:html).gsub(/\s+/, ''))
252
+ translated_html = converter.build
253
+ dom = Helpers::NokogumboHelper.parse_html(translated_html)
254
+ scripts = dom.css('script')
255
+ assert_equal(2, scripts.length)
256
+ expected_wovn_script = "<script src=\"https://j.wovn.io/1\" async=\"true\" data-wovnio=\"key=123456&amp;backend=true&amp;currentLang=en&amp;defaultLang=en&amp;urlPattern=query&amp;langCodeAliases={}&amp;langParamName=wovn&amp;version=WOVN.rb_#{VERSION}\" data-wovnio-type=\"fallback_snippet\"></script>"
257
+ assert_equal(expected_wovn_script, scripts.first.to_html)
168
258
  end
169
259
 
170
- def test_replace_hreflangs
260
+ test 'replace_hreflangs' do
171
261
  converter = prepare_html_converter('<html><head><link rel="alternate" hreflang="en" href="https://wovn.io/en/"></head></html>')
172
- converter.send(:replace_hreflangs)
173
-
174
- expected_html = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><link rel="alternate" hreflang="en" href="http://my-site.com/"><link rel="alternate" hreflang="fr" href="http://my-site.com/?wovn=fr"><link rel="alternate" hreflang="ja" href="http://my-site.com/?wovn=ja"><link rel="alternate" hreflang="vi" href="http://my-site.com/?wovn=vi"></head><body></body></html>'
175
- assert_equal(expected_html, converter.send(:html))
262
+ translated_html = converter.build
263
+ dom = Helpers::NokogumboHelper.parse_html(translated_html)
264
+ href_langs = dom.css('link[rel="alternate"]')
265
+ assert_equal(4, href_langs.length)
266
+ expected_href_langs = {
267
+ 'en' =>
268
+ {
269
+ 'href' => 'http://my-site.com/'
270
+ },
271
+ 'fr' =>
272
+ {
273
+ 'href' => 'http://my-site.com/?wovn=fr'
274
+ },
275
+ 'ja' =>
276
+ {
277
+ 'href' => 'http://my-site.com/?wovn=ja'
278
+ },
279
+ 'vi' =>
280
+ {
281
+ 'href' => 'http://my-site.com/?wovn=vi'
282
+ }
283
+ }
284
+ href_langs.each do |node|
285
+ assertions = expected_href_langs[node['hreflang']]
286
+ assert_not_nil(assertions)
287
+ assert_equal(assertions['href'], node['href'])
288
+ end
176
289
  end
177
290
 
178
- def test_inject_lang_html_tag_with_no_lang_in_html_tag
291
+ test 'inject_lang_html_tag - with no lang in HTML tag - should inject' do
179
292
  settings = default_store_settings
180
293
  store = Wovnrb::Store.instance
181
294
  store.update_settings(settings)
@@ -184,13 +297,14 @@ module Wovnrb
184
297
  Wovnrb.get_env('url' => 'http://my-site.com/'),
185
298
  Wovnrb.get_settings(settings)
186
299
  )
187
- converter = HtmlConverter.new(get_dom('<html><body>hello</body></html>'), store, headers)
188
- converter.send(:inject_lang_html_tag)
189
- expected_html = '<html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body>hello</body></html>'
190
- assert_equal(expected_html, converter.send(:html))
300
+ url_lang_switcher = Wovnrb::UrlLanguageSwitcher.new(store)
301
+ converter = HtmlConverter.new(get_dom('<html><body>hello</body></html>'), store, headers, url_lang_switcher)
302
+ translated_html = converter.build
303
+ dom = Helpers::NokogumboHelper.parse_html(translated_html)
304
+ assert_equal('en', dom.at_css('html')['lang'])
191
305
  end
192
306
 
193
- def test_inject_lang_html_tag_with_lang_in_html_tag
307
+ test 'inject_lang_html_tag - with lang in HTML tag - do not override' do
194
308
  settings = default_store_settings
195
309
  store = Wovnrb::Store.instance
196
310
  store.update_settings(settings)
@@ -199,26 +313,85 @@ module Wovnrb
199
313
  Wovnrb.get_env('url' => 'http://my-site.com/'),
200
314
  Wovnrb.get_settings(settings)
201
315
  )
202
- converter = HtmlConverter.new(get_dom('<html lang="th"><body>hello</body></html>'), store, headers)
203
- converter.send(:inject_lang_html_tag)
204
- expected_html = '<html lang="th"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body>hello</body></html>'
205
- assert_equal(expected_html, converter.send(:html))
316
+ url_lang_switcher = Wovnrb::UrlLanguageSwitcher.new(store)
317
+ converter = HtmlConverter.new(get_dom('<html lang="th"><body>hello</body></html>'), store, headers, url_lang_switcher)
318
+ translated_html = converter.build
319
+ dom = Helpers::NokogumboHelper.parse_html(translated_html)
320
+ assert_equal('th', dom.at_css('html')['lang'])
321
+ end
322
+
323
+ test 'translate_canonical_tag' do
324
+ settings = default_store_settings
325
+ store = Wovnrb::Store.instance
326
+ store.update_settings(settings)
327
+
328
+ headers = Wovnrb::Headers.new(
329
+ Wovnrb.get_env('url' => 'http://my-site.com/?wovn=fr'),
330
+ store.settings
331
+ )
332
+ url_lang_switcher = Wovnrb::UrlLanguageSwitcher.new(store)
333
+ converter = HtmlConverter.new(get_dom('<html lang="th"><head><link rel="canonical" href="http://my-site.com" /></head><body>hello</body></html>'), store, headers, url_lang_switcher)
334
+ translated_html = converter.build
335
+ dom = Helpers::NokogumboHelper.parse_html(translated_html)
336
+ canonical_tag = dom.at_css('link[rel="canonical"]')
337
+ assert_not_nil(canonical_tag)
338
+ assert_equal('http://my-site.com?wovn=fr', canonical_tag['href'])
339
+ end
340
+
341
+ test 'translate_canonical_tag - path pattern' do
342
+ settings = default_store_settings
343
+ settings['url_pattern'] = 'path'
344
+ store = Wovnrb::Store.instance
345
+ store.update_settings(settings)
346
+
347
+ headers = Wovnrb::Headers.new(
348
+ Wovnrb.get_env('url' => 'http://my-site.com/fr/'),
349
+ store.settings
350
+ )
351
+ url_lang_switcher = Wovnrb::UrlLanguageSwitcher.new(store)
352
+ converter = HtmlConverter.new(get_dom('<html lang="th"><head><link rel="canonical" href="http://my-site.com/" /></head><body>hello</body></html>'), store, headers, url_lang_switcher)
353
+ translated_html = converter.build
354
+ dom = Helpers::NokogumboHelper.parse_html(translated_html)
355
+ canonical_tag = dom.at_css('link[rel="canonical"]')
356
+ assert_not_nil(canonical_tag)
357
+ assert_equal('http://my-site.com/fr/', canonical_tag['href'])
358
+ end
359
+
360
+ test 'translate_canonical_tag - canonical tag is already translated' do
361
+ # NOTE: this behavior is not correct, but it is the same as html-swapper
362
+ settings = default_store_settings
363
+ settings['url_pattern'] = 'path'
364
+ store = Wovnrb::Store.instance
365
+ store.update_settings(settings)
366
+
367
+ headers = Wovnrb::Headers.new(
368
+ Wovnrb.get_env('url' => 'http://my-site.com/fr/'),
369
+ store.settings
370
+ )
371
+ url_lang_switcher = Wovnrb::UrlLanguageSwitcher.new(store)
372
+ converter = HtmlConverter.new(get_dom('<html lang="th"><head><link rel="canonical" href="http://my-site.com/fr/" /></head><body>hello</body></html>'), store, headers, url_lang_switcher)
373
+ translated_html = converter.build
374
+ dom = Helpers::NokogumboHelper.parse_html(translated_html)
375
+ canonical_tag = dom.at_css('link[rel="canonical"]')
376
+ assert_not_nil(canonical_tag)
377
+ assert_equal('http://my-site.com/fr/fr/', canonical_tag['href'])
206
378
  end
207
379
 
208
380
  private
209
381
 
210
382
  def prepare_html_converter(input_html, store_options = {})
211
383
  store, headers = store_headers_factory(store_options)
212
- HtmlConverter.new(get_dom(input_html), store, headers)
384
+ url_lang_switcher = Wovnrb::UrlLanguageSwitcher.new(store)
385
+ HtmlConverter.new(get_dom(input_html), store, headers, url_lang_switcher)
213
386
  end
214
387
 
215
- def store_headers_factory(setting_opts = {})
388
+ def store_headers_factory(setting_opts = {}, url = 'http://my-site.com')
216
389
  settings = default_store_settings.merge(setting_opts)
217
390
  store = Wovnrb::Store.instance
218
391
  store.update_settings(settings)
219
392
 
220
393
  headers = Wovnrb::Headers.new(
221
- Wovnrb.get_env('url' => 'http://my-site.com'),
394
+ Wovnrb.get_env('url' => url),
222
395
  store.settings
223
396
  )
224
397