wovnrb 3.5.0 → 3.6.0

Sign up to get free protection for your applications and to get access to all the features.
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