wovnrb 1.1.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +1 -0
  3. data/.gitignore +2 -0
  4. data/.rubocop.yml +1 -0
  5. data/.rubocop_todo.yml +308 -0
  6. data/Rakefile +13 -14
  7. data/lib/wovnrb.rb +43 -98
  8. data/lib/wovnrb/api_translator.rb +143 -0
  9. data/lib/wovnrb/headers.rb +78 -92
  10. data/lib/wovnrb/helpers/nokogumbo_helper.rb +1 -1
  11. data/lib/wovnrb/lang.rb +93 -125
  12. data/lib/wovnrb/railtie.rb +5 -7
  13. data/lib/wovnrb/services/glob.rb +3 -3
  14. data/lib/wovnrb/services/html_converter.rb +192 -0
  15. data/lib/wovnrb/services/html_replace_marker.rb +38 -0
  16. data/lib/wovnrb/services/wovn_logger.rb +8 -4
  17. data/lib/wovnrb/settings.rb +5 -3
  18. data/lib/wovnrb/store.rb +35 -26
  19. data/lib/wovnrb/text_caches/cache_base.rb +3 -2
  20. data/lib/wovnrb/text_caches/memory_cache.rb +2 -2
  21. data/lib/wovnrb/version.rb +1 -1
  22. data/test/fixtures/html/test.html +8 -0
  23. data/test/fixtures/html/test_translated.html +8 -0
  24. data/test/lib/api_translator_test.rb +109 -0
  25. data/test/lib/headers_test.rb +84 -55
  26. data/test/lib/lang_test.rb +157 -357
  27. data/test/lib/services/glob_test.rb +1 -1
  28. data/test/lib/services/html_converter_test.rb +166 -0
  29. data/test/lib/services/html_replace_marker_test.rb +75 -0
  30. data/test/lib/services/wovn_logger_test.rb +6 -6
  31. data/test/lib/store_test.rb +25 -69
  32. data/test/lib/text_caches/cache_base_test.rb +1 -1
  33. data/test/lib/text_caches/memory_cache_test.rb +10 -11
  34. data/test/lib/wovnrb_test.rb +77 -310
  35. data/test/test_helper.rb +22 -32
  36. data/wovnrb.gemspec +35 -44
  37. metadata +86 -205
  38. data/ext/dom/Makefile +0 -239
  39. data/lib/wovnrb/api_data.rb +0 -59
  40. data/lib/wovnrb/html_replacers/image_replacer.rb +0 -69
  41. data/lib/wovnrb/html_replacers/input_replacer.rb +0 -38
  42. data/lib/wovnrb/html_replacers/link_replacer.rb +0 -78
  43. data/lib/wovnrb/html_replacers/meta_replacer.rb +0 -28
  44. data/lib/wovnrb/html_replacers/replacer_base.rb +0 -49
  45. data/lib/wovnrb/html_replacers/script_replacer.rb +0 -39
  46. data/lib/wovnrb/html_replacers/text_replacer.rb +0 -21
  47. data/lib/wovnrb/html_replacers/unified_values/dst_swapping_targets_creator.rb +0 -76
  48. data/lib/wovnrb/html_replacers/unified_values/element_category.rb +0 -242
  49. data/lib/wovnrb/html_replacers/unified_values/node_swapping_targets_creator.rb +0 -134
  50. data/lib/wovnrb/html_replacers/unified_values/text_replacer.rb +0 -35
  51. data/lib/wovnrb/html_replacers/unified_values/text_scraper.rb +0 -152
  52. data/lib/wovnrb/html_replacers/unified_values/values_stack.rb +0 -65
  53. data/lib/wovnrb/services/url.rb +0 -12
  54. data/lib/wovnrb/services/value_agent.rb +0 -9
  55. data/test/fixtures/unified_values/site_html/simple_actual.html +0 -96
  56. data/test/fixtures/unified_values/site_html/simple_expected.json +0 -251
  57. data/test/fixtures/unified_values/site_html/wovn.io_actual.html +0 -686
  58. data/test/fixtures/unified_values/site_html/wovn.io_expected.json +0 -543
  59. data/test/fixtures/unified_values/site_html/www.yahoo.co.jp_actual.html +0 -1024
  60. data/test/fixtures/unified_values/site_html/www.yahoo.co.jp_expected.json +0 -3345
  61. data/test/fixtures/unified_values/small_html/block_inside_inline_actual.html +0 -12
  62. data/test/fixtures/unified_values/small_html/block_inside_inline_expected.json +0 -22
  63. data/test/fixtures/unified_values/small_html/br_tag_actual.html +0 -10
  64. data/test/fixtures/unified_values/small_html/br_tag_expected.json +0 -12
  65. data/test/fixtures/unified_values/small_html/comment_tag_actual.html +0 -12
  66. data/test/fixtures/unified_values/small_html/comment_tag_expected.json +0 -10
  67. data/test/fixtures/unified_values/small_html/complex_text_with_html_entity_actual.html +0 -7
  68. data/test/fixtures/unified_values/small_html/complex_text_with_html_entity_expected.json +0 -11
  69. data/test/fixtures/unified_values/small_html/deep_nested_block_actual.html +0 -14
  70. data/test/fixtures/unified_values/small_html/deep_nested_block_expected.json +0 -8
  71. data/test/fixtures/unified_values/small_html/deep_nested_inline_actual.html +0 -20
  72. data/test/fixtures/unified_values/small_html/deep_nested_inline_expected.json +0 -20
  73. data/test/fixtures/unified_values/small_html/empty_tag_actual.html +0 -10
  74. data/test/fixtures/unified_values/small_html/empty_tag_expected.json +0 -12
  75. data/test/fixtures/unified_values/small_html/empty_text_actual.html +0 -12
  76. data/test/fixtures/unified_values/small_html/empty_text_expected.json +0 -1
  77. data/test/fixtures/unified_values/small_html/ignore_tag_actual.html +0 -12
  78. data/test/fixtures/unified_values/small_html/ignore_tag_expected.json +0 -16
  79. data/test/fixtures/unified_values/small_html/ignored_class_actual.html +0 -10
  80. data/test/fixtures/unified_values/small_html/ignored_class_expected.json +0 -13
  81. data/test/fixtures/unified_values/small_html/img_actual.html +0 -12
  82. data/test/fixtures/unified_values/small_html/img_expected.json +0 -23
  83. data/test/fixtures/unified_values/small_html/nested_and_complex_wovn_ignore_actual.html +0 -10
  84. data/test/fixtures/unified_values/small_html/nested_and_complex_wovn_ignore_expected.json +0 -16
  85. data/test/fixtures/unified_values/small_html/nested_text_value_actual.html +0 -10
  86. data/test/fixtures/unified_values/small_html/nested_text_value_expected.json +0 -12
  87. data/test/fixtures/unified_values/small_html/nested_text_value_mixed_plan_text_actual.html +0 -10
  88. data/test/fixtures/unified_values/small_html/nested_text_value_mixed_plan_text_expected.json +0 -14
  89. data/test/fixtures/unified_values/small_html/option_tag_actual.html +0 -9
  90. data/test/fixtures/unified_values/small_html/option_tag_expected.json +0 -13
  91. data/test/fixtures/unified_values/small_html/text_different_inline_each_other_actual.html +0 -10
  92. data/test/fixtures/unified_values/small_html/text_different_inline_each_other_expected.json +0 -22
  93. data/test/fixtures/unified_values/small_html/text_in_svg_actual.html +0 -9
  94. data/test/fixtures/unified_values/small_html/text_in_svg_expected.json +0 -8
  95. data/test/fixtures/unified_values/small_html/text_with_html_entity_actual.html +0 -6
  96. data/test/fixtures/unified_values/small_html/text_with_html_entity_expected.json +0 -8
  97. data/test/fixtures/unified_values/small_html/unknown_or_custom_tag_actual.html +0 -12
  98. data/test/fixtures/unified_values/small_html/unknown_or_custom_tag_expected.json +0 -24
  99. data/test/fixtures/unified_values/small_html/unnecessay_top_end_tag_actual.html +0 -12
  100. data/test/fixtures/unified_values/small_html/unnecessay_top_end_tag_expected.json +0 -14
  101. data/test/fixtures/unified_values/small_html/wovn_ignore_actual.html +0 -10
  102. data/test/fixtures/unified_values/small_html/wovn_ignore_expected.json +0 -13
  103. data/test/lib/api_data_test.rb +0 -83
  104. data/test/lib/html_replacers/image_replacer_test.rb +0 -165
  105. data/test/lib/html_replacers/input_replacer_test.rb +0 -140
  106. data/test/lib/html_replacers/link_replacer_test.rb +0 -328
  107. data/test/lib/html_replacers/meta_replacer_test.rb +0 -157
  108. data/test/lib/html_replacers/replacer_base_test.rb +0 -128
  109. data/test/lib/html_replacers/script_replacer_test.rb +0 -139
  110. data/test/lib/html_replacers/text_replacer_test.rb +0 -99
  111. data/test/lib/html_replacers/unified_values/dst_swapping_targets_creator_test.rb +0 -137
  112. data/test/lib/html_replacers/unified_values/element_category_test.rb +0 -49
  113. data/test/lib/html_replacers/unified_values/node_swapping_targets_creator_test.rb +0 -137
  114. data/test/lib/html_replacers/unified_values/text_replacer_test.rb +0 -270
  115. data/test/lib/html_replacers/unified_values/text_scraper_test.rb +0 -121
  116. data/test/lib/html_replacers/unified_values/values_stack_test.rb +0 -122
  117. data/test/lib/services/url_test.rb +0 -9
  118. data/test/lib/services/value_agent_test.rb +0 -32
  119. data/test/services/url_test.rb +0 -163
  120. data/values/values +0 -1
@@ -0,0 +1,38 @@
1
+ module Wovnrb
2
+ class HtmlReplaceMarker
3
+ KEY_PREFIX = '__wovn-backend-ignored-key-'.freeze
4
+
5
+ def initialize
6
+ @current_key_number = 0
7
+ @mapped_values = []
8
+ end
9
+
10
+ # Add argument's value to mapping information with comment style key
11
+ def add_comment_value(value)
12
+ key = "<!-- #{generate_key} -->"
13
+ @mapped_values << [key, value]
14
+
15
+ key
16
+ end
17
+
18
+ def revert(marked_html)
19
+ i = @mapped_values.size
20
+ while i > 0
21
+ i -= 1
22
+ key, value = @mapped_values[i]
23
+ marked_html = marked_html.sub(key, value)
24
+ end
25
+
26
+ marked_html
27
+ end
28
+
29
+ private
30
+
31
+ def generate_key
32
+ next_key = "#{KEY_PREFIX}#{@current_key_number}"
33
+ @current_key_number += 1
34
+
35
+ next_key
36
+ end
37
+ end
38
+ end
@@ -5,6 +5,12 @@ module Wovnrb
5
5
  class WovnLogger
6
6
  include Singleton
7
7
 
8
+ class << self
9
+ def error(message)
10
+ instance.error(message)
11
+ end
12
+ end
13
+
8
14
  def initialize
9
15
  path = Store.instance.settings['log_path']
10
16
  if path
@@ -26,9 +32,7 @@ module Wovnrb
26
32
 
27
33
  def set_logger(logger)
28
34
  [:error].each do |method|
29
- unless logger.respond_to? method
30
- raise 'not suite for logger'
31
- end
35
+ raise 'not suite for logger' unless logger.respond_to? method
32
36
  end
33
37
 
34
38
  @logger = logger
@@ -42,4 +46,4 @@ module Wovnrb
42
46
  end
43
47
  end
44
48
  end
45
- end
49
+ end
@@ -8,12 +8,14 @@ module Wovnrb
8
8
  def [](key)
9
9
  return @dynamic_settings[key] if @dynamic_settings.key?(key)
10
10
  return ignore_globs if key == 'ignore_globs'
11
+
11
12
  super(key)
12
13
  end
13
14
 
14
15
  def ignore_globs
15
16
  ignore_paths = self['ignore_paths']
16
- return [] unless ignore_paths.kind_of?(Array)
17
+ return [] unless ignore_paths.is_a?(Array)
18
+
17
19
  ignore_paths.map { |pattern| Glob.new(pattern) }
18
20
  end
19
21
 
@@ -31,7 +33,7 @@ module Wovnrb
31
33
 
32
34
  DYNAMIC_KEYS = {
33
35
  'wovn_token' => 'project_token',
34
- 'wovn_ignore_paths' => 'ignore_paths',
35
- }
36
+ 'wovn_ignore_paths' => 'ignore_paths'
37
+ }.freeze
36
38
  end
37
39
  end
data/lib/wovnrb/store.rb CHANGED
@@ -13,7 +13,7 @@ module Wovnrb
13
13
  include Singleton
14
14
 
15
15
  def self.default_settings
16
- Settings.new.merge({
16
+ Settings.new.merge(
17
17
  'project_token' => '',
18
18
  'log_path' => 'log/wovn_error.log',
19
19
  'ignore_paths' => [],
@@ -22,7 +22,7 @@ module Wovnrb
22
22
  'url_pattern_reg' => "/(?<lang>[^/.?]+)",
23
23
  'query' => [],
24
24
  'ignore_class' => [],
25
- 'api_url' => 'https://api.wovn.io/v0/values',
25
+ 'api_url' => 'https://wovn.global.ssl.fastly.net/v0/',
26
26
  'api_timeout_seconds' => 0.5,
27
27
  'default_lang' => 'en',
28
28
  'supported_langs' => ['en'],
@@ -30,11 +30,11 @@ module Wovnrb
30
30
  'test_url' => '',
31
31
  'cache_megabytes' => nil,
32
32
  'ttl_seconds' => nil,
33
- 'use_proxy' => false, # use env['HTTP_X_FORWARDED_HOST'] instead of env['HTTP_HOST'] and env['SERVER_NAME'] when this setting is true.
33
+ 'use_proxy' => false, # use env['HTTP_X_FORWARDED_HOST'] instead of env['HTTP_HOST'] and env['SERVER_NAME'] when this setting is true.
34
34
  'custom_lang_aliases' => {},
35
- 'wovn_dev_mode' => false,
36
- 'translate_fragment' => true
37
- })
35
+ 'translate_fragment' => true,
36
+ 'wovn_dev_mode' => false
37
+ )
38
38
  end
39
39
 
40
40
  def initialize
@@ -54,7 +54,7 @@ module Wovnrb
54
54
  #
55
55
  # @return [Boolean] Returns true if the token is valid, and false if it is not
56
56
  def valid_token?(token)
57
- return !token.nil? && (token.length == 5 || token.length == 6)
57
+ !token.nil? && (token.length == 5 || token.length == 6)
58
58
  end
59
59
 
60
60
  # Returns true or false based on whether the settings are valid or not, logs any invalid settings to ../error.log
@@ -62,8 +62,8 @@ module Wovnrb
62
62
  # @return [Boolean] Returns true if the settings are valid, and false if they are not
63
63
  def valid_settings?
64
64
  valid = true
65
- errors = [];
66
- #if valid_token?(!settings.has_key?('project_token') || settings['project_token'].length < 5 || settings['project_token'].length > 6
65
+ errors = []
66
+ # if valid_token?(!settings.has_key?('project_token') || settings['project_token'].length < 5 || settings['project_token'].length > 6
67
67
  if !valid_token?(settings['project_token'])
68
68
  errors.push("Project token #{settings['project_token']} is not valid.")
69
69
  end
@@ -98,7 +98,7 @@ module Wovnrb
98
98
  WovnLogger.instance.error(e)
99
99
  end
100
100
  end
101
- return valid
101
+ valid
102
102
  end
103
103
 
104
104
  # Returns the settings object, pulling from Rails config the first time this is called
@@ -148,34 +148,43 @@ module Wovnrb
148
148
  @settings['url_pattern_reg'] = "^(?<lang>[^.]+)\."
149
149
  end
150
150
 
151
- if @settings['test_mode'] != true || @settings['test_mode'] != 'on'
152
- @settings['test_mode'] = false
153
- else
154
- @settings['test_mode'] = true
155
- end
151
+ @settings['test_mode'] = if @settings['test_mode'] != true || @settings['test_mode'] != 'on'
152
+ false
153
+ else
154
+ true
155
+ end
156
+ end
156
157
 
157
- if wovn_dev_mode? && @settings['api_url'] == Store.default_settings['api_url']
158
- @settings['api_url'] = "#{wovn_protocol}://api.#{wovn_host}/v0/values"
159
- end
158
+ def custom_lang_aliases
159
+ @setttings['custom_lang_aliases'] || {}
160
160
  end
161
161
 
162
- def wovn_dev_mode?
163
- @settings['wovn_dev_mode']
162
+ def default_lang
163
+ @settings['default_lang']
164
164
  end
165
165
 
166
- def wovn_protocol
167
- wovn_dev_mode? ? 'http' : 'https'
166
+ def default_lang_alias
167
+ custom_alias = custom_lang_aliases[default_lang]
168
+ custom_alias || default_lang
169
+ end
170
+
171
+ def supported_langs
172
+ @settings['supported_langs'] || []
168
173
  end
169
174
 
170
175
  def wovn_host
171
- wovn_dev_mode? ? 'dev-wovn.io:3000' : 'wovn.io'
176
+ if @settings['wovn_dev_mode']
177
+ 'dev-wovn.io:3000'
178
+ else
179
+ 'wovn.io'
180
+ end
172
181
  end
173
182
 
174
183
  private
175
184
 
176
- def stringify_keys!(h)
177
- h.keys.each do |k|
178
- h[k.to_s] = h.delete(k)
185
+ def stringify_keys!(hash)
186
+ hash.keys.each do |k|
187
+ hash[k.to_s] = hash.delete(k)
179
188
  end
180
189
  end
181
190
  end
@@ -13,11 +13,12 @@ module Wovnrb
13
13
  @@singleton_cache = nil
14
14
  def self.get_single
15
15
  raise 'cache is not initialized' unless @@singleton_cache
16
+
16
17
  @@singleton_cache
17
18
  end
18
19
 
19
20
  def self.set_single(config)
20
- @@singleton_cache = self.build(config)
21
+ @@singleton_cache = build(config)
21
22
  end
22
23
 
23
24
  def self.reset_cache
@@ -49,4 +50,4 @@ module Wovnrb
49
50
  raise NotImplementedError.new('put is not defined')
50
51
  end
51
52
  end
52
- end
53
+ end
@@ -41,11 +41,11 @@ module Wovnrb
41
41
  end
42
42
 
43
43
  def compress(value)
44
- LZ4::compress(value)
44
+ LZ4.compress(value)
45
45
  end
46
46
 
47
47
  def decompress(value)
48
- LZ4::decompress(value, value.bytesize, 'UTF-8')
48
+ LZ4.decompress(value, value.bytesize, 'UTF-8')
49
49
  end
50
50
  end
51
51
  end
@@ -1,3 +1,3 @@
1
1
  module Wovnrb
2
- VERSION = "1.1.0"
2
+ VERSION = '2.0.0'.freeze
3
3
  end
@@ -0,0 +1,8 @@
1
+ <html>
2
+ <head>
3
+ <title>Original Content</title>
4
+ </head>
5
+ <body>
6
+ <p>This is a test.</p>
7
+ </body>
8
+ </html>
@@ -0,0 +1,8 @@
1
+ <html>
2
+ <head>
3
+ <title>Translated Content</title>
4
+ </head>
5
+ <body>
6
+ <p>This is a test.</p>
7
+ </body>
8
+ </html>
@@ -0,0 +1,109 @@
1
+ require 'test_helper'
2
+
3
+ module Wovnrb
4
+ class ApiTranslatorTest < WovnMiniTest
5
+ def test_translate
6
+ assert_translation('test.html', 'test_translated.html', true)
7
+ end
8
+
9
+ def test_translate_falls_back_to_original_body_if_exception
10
+ Net::HTTP.any_instance.expects(:request).raises
11
+ assert_translation('test.html', 'test_translated.html', false, nil)
12
+ end
13
+
14
+ def test_translate_falls_back_to_original_body_if_api_error
15
+ assert_translation('test.html', 'test_translated.html', false, status_code: 500)
16
+ end
17
+
18
+ def test_translate_falls_back_to_original_body_if_api_response_is_not_compressed
19
+ assert_translation('test.html', 'test_translated.html', false, encoding: 'unknown')
20
+ end
21
+
22
+ private
23
+
24
+ def assert_translation(original_html_fixture, translated_html_fixture, success_expected, response = { encoding: 'gzip', status_code: 200 })
25
+ original_html = File.read("test/fixtures/html/#{original_html_fixture}")
26
+ translated_html = File.read("test/fixtures/html/#{translated_html_fixture}")
27
+ actual_translated_html = translate(original_html, translated_html, response)
28
+
29
+ if success_expected
30
+ assert_equal(actual_translated_html, translated_html)
31
+ else
32
+ assert_equal(actual_translated_html, original_html)
33
+ end
34
+ end
35
+
36
+ def translate(original_html, translated_html, response)
37
+ settings = {
38
+ 'project_token' => '123456',
39
+ 'custom_lang_aliases' => { 'ja' => 'Japanese' },
40
+ 'default_lang' => 'en',
41
+ 'url_pattern' => 'subdomain',
42
+ 'url_pattern_reg' => '^(?<lang>[^.]+).'
43
+ }
44
+ store = Wovnrb::Store.instance
45
+ store.update_settings(settings)
46
+ headers = Wovnrb::Headers.new(
47
+ Wovnrb.get_env('url' => 'http://fr.wovn.io/test'),
48
+ Wovnrb.get_settings(settings)
49
+ )
50
+ api_translator = ApiTranslator.new(store, headers)
51
+ translation_request_stub = stub_translation_api_request(store, headers, original_html, translated_html, response)
52
+
53
+ actual_translated_html = api_translator.translate(original_html)
54
+ assert_requested(translation_request_stub, times: 1) if translation_request_stub
55
+ actual_translated_html
56
+ end
57
+
58
+ def stub_translation_api_request(store, headers, original_html, translated_html, response)
59
+ if response
60
+ cache_key = generate_cache_key(store, original_html)
61
+ api_url = "wovn.global.ssl.fastly.net/v0/translation?cache_key=#{cache_key}"
62
+ compressed_data = compress(generate_data(original_html))
63
+ headers = {
64
+ 'Accept' => '*/*',
65
+ 'Accept-Encoding' => 'gzip',
66
+ 'Content-Length' => compressed_data.bytesize,
67
+ 'Content-Type' => 'application/octet-stream',
68
+ 'User-Agent' => 'Ruby'
69
+ }
70
+ compressed_response = compress("{\"body\":\"#{translated_html.gsub("\n", '\n')}\"}")
71
+ response_headers = { 'Content-Encoding' => response[:encoding] || 'gzip' }
72
+ stub = stub_request(:post, api_url)
73
+ .with(body: compressed_data, headers: headers)
74
+ .to_return(status: response[:status_code] || 200, body: compressed_response, headers: response_headers)
75
+
76
+ stub
77
+ end
78
+ end
79
+
80
+ def generate_cache_key(store, original_html)
81
+ settings_hash = Digest::MD5.hexdigest(JSON.dump(store.settings))
82
+ body_hash = Digest::MD5.hexdigest(original_html)
83
+ escaped_key = CGI.escape("token=123456&settings_hash=#{settings_hash}&body_hash=#{body_hash}&path=/test&lang=fr")
84
+
85
+ "(#{escaped_key})"
86
+ end
87
+
88
+ def generate_data(original_html)
89
+ data = {
90
+ 'url' => 'http://wovn.io/test',
91
+ 'token' => '123456',
92
+ 'lang_code' => 'fr',
93
+ 'url_pattern' => 'subdomain',
94
+ 'product' => 'WOVN.rb',
95
+ 'version' => VERSION,
96
+ 'body' => original_html,
97
+ 'custom_lang_aliases' => '{"ja":"Japanese"}'
98
+ }
99
+
100
+ data.map { |key, value| "#{key}=#{CGI.escape(value)}" }.join('&')
101
+ end
102
+
103
+ def compress(string)
104
+ gzip = Zlib::GzipWriter.new(StringIO.new)
105
+ gzip << string
106
+ gzip.close.string
107
+ end
108
+ end
109
+ end
@@ -1,12 +1,7 @@
1
1
  require 'test_helper'
2
- require 'wovnrb/headers'
3
- require 'wovnrb/lang'
4
- require 'minitest/autorun'
5
- require 'pry'
6
2
 
7
3
  module Wovnrb
8
4
  class LangTest < WovnMiniTest
9
-
10
5
  #########################
11
6
  # INITIALIZE
12
7
  #########################
@@ -16,13 +11,6 @@ module Wovnrb
16
11
  refute_nil(h)
17
12
  end
18
13
 
19
- # def test_initialize_env
20
- # env = Wovnrb.get_env
21
- # h = Wovnrb::Headers.new(env, {})
22
- # binding.pry
23
- # #assert_equal(''
24
- # end
25
-
26
14
  def test_initialize_with_simple_url
27
15
  h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'https://wovn.io'), Wovnrb.get_settings)
28
16
  assert_equal('wovn.io/', h.url)
@@ -110,6 +98,47 @@ module Wovnrb
110
98
  assert_equal('https', h.protocol)
111
99
  end
112
100
 
101
+ def test_pathname_with_trailing_slash_if_present_when_trailing_slash_is_not_present
102
+ env = Wovnrb.get_env('REQUEST_URI' => 'http://page.com/test')
103
+ headers = Wovnrb::Headers.new(env, Wovnrb.get_settings)
104
+
105
+ assert_equal('/test', headers.pathname_with_trailing_slash_if_present)
106
+ end
107
+
108
+ def test_pathname_with_trailing_slash_if_present_with_default_lang_when_trailing_slash_is_present
109
+ env = Wovnrb.get_env('REQUEST_URI' => 'http://page.com/test/')
110
+ headers = Wovnrb::Headers.new(env, Wovnrb.get_settings)
111
+
112
+ assert_equal('/test/', headers.pathname_with_trailing_slash_if_present)
113
+ end
114
+
115
+ def test_pathname_with_trailing_slash_if_present_with_subdomain_lang_when_trailing_slash_is_present
116
+ headers = Wovnrb::Headers.new(
117
+ Wovnrb.get_env('REQUEST_URI' => 'http://ja.page.com/test/'),
118
+ Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).')
119
+ )
120
+
121
+ assert_equal('/test/', headers.pathname_with_trailing_slash_if_present)
122
+ end
123
+
124
+ def test_pathname_with_trailing_slash_if_present_with_path_lang_when_trailing_slash_is_present
125
+ headers = Wovnrb::Headers.new(
126
+ Wovnrb.get_env('REQUEST_URI' => 'http://page.com/ja/test/'),
127
+ Wovnrb.get_settings('url_pattern' => 'path', 'url_pattern_reg' => '/(?<lang>[^/.?]+)')
128
+ )
129
+
130
+ assert_equal('/test/', headers.pathname_with_trailing_slash_if_present)
131
+ end
132
+
133
+ def test_pathname_with_trailing_slash_if_present_with_query_lang_when_trailing_slash_is_present
134
+ headers = Wovnrb::Headers.new(
135
+ Wovnrb.get_env('REQUEST_URI' => 'http://page.com/test/?wovn=ja'),
136
+ Wovnrb.get_settings('url_pattern' => 'query', 'url_pattern_reg' => '((\\?.*&)|\\?)wovn=(?<lang>[^&]+)(&|$)')
137
+ )
138
+
139
+ assert_equal('/test/', headers.pathname_with_trailing_slash_if_present)
140
+ end
141
+
113
142
  #########################
114
143
  # REDIRECT_LOCATION
115
144
  #########################
@@ -117,16 +146,16 @@ module Wovnrb
117
146
  def test_redirect_location_without_custom_lang_code
118
147
  h = Wovnrb::Headers.new(
119
148
  Wovnrb.get_env('url' => 'http://wovn.io/contact', 'HTTP_X_FORWARDED_HOST' => 'wovn.io'),
120
- Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'),
149
+ Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).')
121
150
  )
122
151
  assert_equal('http://ja.wovn.io/contact', h.redirect_location('ja'))
123
152
  end
124
153
 
125
154
  def test_redirect_location_without_custom_lang_code
126
- Store.instance.update_settings({'custom_lang_aliases' => {'ja' => 'staging-ja'}})
155
+ Store.instance.update_settings('custom_lang_aliases' => { 'ja' => 'staging-ja' })
127
156
  h = Wovnrb::Headers.new(
128
157
  Wovnrb.get_env('url' => 'http://wovn.io/contact', 'HTTP_X_FORWARDED_HOST' => 'wovn.io'),
129
- Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'),
158
+ Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).')
130
159
  )
131
160
  assert_equal('http://staging-ja.wovn.io/contact', h.redirect_location('ja'))
132
161
  end
@@ -140,12 +169,12 @@ module Wovnrb
140
169
  Wovnrb.get_env(
141
170
  'SERVER_NAME' => 'ja.wovn.io',
142
171
  'REQUEST_URI' => '/test',
143
- 'HTTP_REFERER' => 'http://ja.wovn.io/test',
172
+ 'HTTP_REFERER' => 'http://ja.wovn.io/test'
144
173
  ),
145
174
  Wovnrb.get_settings(
146
175
  'url_pattern' => 'subdomain',
147
- 'url_pattern_reg' => '^(?<lang>[^.]+).',
148
- ),
176
+ 'url_pattern_reg' => '^(?<lang>[^.]+).'
177
+ )
149
178
  )
150
179
  env = h.request_out('ja')
151
180
  assert_equal('ja', env['wovnrb.target_lang'])
@@ -154,7 +183,7 @@ module Wovnrb
154
183
  def test_request_out_with_wovn_target_lang_header_using_path
155
184
  h = Wovnrb::Headers.new(
156
185
  Wovnrb.get_env('REQUEST_URI' => '/ja/test', 'HTTP_REFERER' => 'http://wovn.io/ja/test'),
157
- Wovnrb.get_settings,
186
+ Wovnrb.get_settings
158
187
  )
159
188
  env = h.request_out('ja')
160
189
  assert_equal('ja', env['wovnrb.target_lang'])
@@ -165,8 +194,8 @@ module Wovnrb
165
194
  Wovnrb.get_env('REQUEST_URI' => 'test?wovn=ja', 'HTTP_REFERER' => 'http://wovn.io/test'),
166
195
  Wovnrb.get_settings(
167
196
  'url_pattern' => 'query',
168
- 'url_pattern_reg' => "((\\?.*&)|\\?)wovn=(?<lang>[^&]+)(&|$)",
169
- ),
197
+ 'url_pattern_reg' => '((\\?.*&)|\\?)wovn=(?<lang>[^&]+)(&|$)'
198
+ )
170
199
  )
171
200
  env = h.request_out('ja')
172
201
  assert_equal('ja', env['wovnrb.target_lang'])
@@ -175,7 +204,7 @@ module Wovnrb
175
204
  def test_request_out_with_use_proxy_false
176
205
  h = Wovnrb::Headers.new(
177
206
  Wovnrb.get_env('url' => 'http://localhost/contact', 'HTTP_X_FORWARDED_HOST' => 'ja.wovn.io'),
178
- Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'),
207
+ Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).')
179
208
  )
180
209
  env = h.request_out('ja')
181
210
  assert_equal('ja.wovn.io', env['HTTP_X_FORWARDED_HOST'])
@@ -184,7 +213,7 @@ module Wovnrb
184
213
  def test_request_out_with_use_proxy_true
185
214
  h = Wovnrb::Headers.new(
186
215
  Wovnrb.get_env('url' => 'http://localhost/contact', 'HTTP_X_FORWARDED_HOST' => 'ja.wovn.io'),
187
- Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).', 'use_proxy' => true),
216
+ Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).', 'use_proxy' => true)
188
217
  )
189
218
  env = h.request_out('ja')
190
219
  assert_equal('wovn.io', env['HTTP_X_FORWARDED_HOST'])
@@ -195,12 +224,12 @@ module Wovnrb
195
224
  Wovnrb.get_env(
196
225
  'SERVER_NAME' => 'ja.wovn.io',
197
226
  'REQUEST_URI' => '/test',
198
- 'HTTP_REFERER' => 'http://ja.wovn.io/test',
227
+ 'HTTP_REFERER' => 'http://ja.wovn.io/test'
199
228
  ),
200
229
  Wovnrb.get_settings(
201
230
  'url_pattern' => 'subdomain',
202
- 'url_pattern_reg' => '^(?<lang>[^.]+).',
203
- ),
231
+ 'url_pattern_reg' => '^(?<lang>[^.]+).'
232
+ )
204
233
  )
205
234
  env = h.request_out('ja')
206
235
  assert_equal('http://wovn.io/test', env['HTTP_REFERER'])
@@ -209,41 +238,41 @@ module Wovnrb
209
238
  def test_request_out_http_referer_path
210
239
  h = Wovnrb::Headers.new(
211
240
  Wovnrb.get_env('REQUEST_URI' => '/ja/test', 'HTTP_REFERER' => 'http://wovn.io/ja/test'),
212
- Wovnrb.get_settings,
241
+ Wovnrb.get_settings
213
242
  )
214
243
  env = h.request_out('ja')
215
244
  assert_equal('http://wovn.io/test', env['HTTP_REFERER'])
216
245
  end
217
246
 
218
247
  def test_request_out_http_referer_subdomain_with_custom_lang_code
219
- Store.instance.update_settings({'custom_lang_aliases' => {'ja' => 'staging-ja'}})
248
+ Store.instance.update_settings('custom_lang_aliases' => { 'ja' => 'staging-ja' })
220
249
  h = Wovnrb::Headers.new(
221
250
  Wovnrb.get_env(
222
251
  'SERVER_NAME' => 'staging-ja.wovn.io',
223
252
  'REQUEST_URI' => '/test',
224
- 'HTTP_REFERER' => 'http://staging-ja.wovn.io/test',
253
+ 'HTTP_REFERER' => 'http://staging-ja.wovn.io/test'
225
254
  ),
226
255
  Wovnrb.get_settings(
227
256
  'url_pattern' => 'subdomain',
228
- 'url_pattern_reg' => '^(?<lang>[^.]+).',
229
- ),
257
+ 'url_pattern_reg' => '^(?<lang>[^.]+).'
258
+ )
230
259
  )
231
260
  env = h.request_out('ja')
232
261
  assert_equal('http://wovn.io/test', env['HTTP_REFERER'])
233
262
  end
234
263
 
235
264
  def test_out_http_referer_subdomain_with_custom_lang_code
236
- Store.instance.update_settings({'custom_lang_aliases' => {'ja' => 'staging-ja'}})
265
+ Store.instance.update_settings('custom_lang_aliases' => { 'ja' => 'staging-ja' })
237
266
  h = Wovnrb::Headers.new(
238
267
  Wovnrb.get_env(
239
268
  'SERVER_NAME' => 'staging-ja.wovn.io',
240
269
  'REQUEST_URI' => '/test',
241
- 'HTTP_REFERER' => 'http://staging-ja.wovn.io/test',
270
+ 'HTTP_REFERER' => 'http://staging-ja.wovn.io/test'
242
271
  ),
243
272
  Wovnrb.get_settings(
244
273
  'url_pattern' => 'subdomain',
245
- 'url_pattern_reg' => '^(?<lang>[^.]+).',
246
- ),
274
+ 'url_pattern_reg' => '^(?<lang>[^.]+).'
275
+ )
247
276
  )
248
277
  headers = h.request_out('ja')
249
278
  assert_equal('http://wovn.io/test', headers['HTTP_REFERER'])
@@ -256,12 +285,12 @@ module Wovnrb
256
285
  Wovnrb.get_env(
257
286
  'SERVER_NAME' => 'wovn.io',
258
287
  'REQUEST_URI' => '/test',
259
- 'HTTP_REFERER' => 'http://wovn.io/test',
288
+ 'HTTP_REFERER' => 'http://wovn.io/test'
260
289
  ),
261
290
  Wovnrb.get_settings(
262
291
  'url_pattern' => 'subdomain',
263
- 'url_pattern_reg' => '^(?<lang>[^.]+).',
264
- ),
292
+ 'url_pattern_reg' => '^(?<lang>[^.]+).'
293
+ )
265
294
  )
266
295
  headers = h.request_out(h.lang_code)
267
296
  assert_equal('http://wovn.io/test', headers['HTTP_REFERER'])
@@ -274,12 +303,12 @@ module Wovnrb
274
303
  Wovnrb.get_env(
275
304
  'SERVER_NAME' => 'wovn.io',
276
305
  'REQUEST_URI' => '/test',
277
- 'HTTP_REFERER' => 'http://wovn.io/test',
306
+ 'HTTP_REFERER' => 'http://wovn.io/test'
278
307
  ),
279
308
  Wovnrb.get_settings(
280
309
  'url_pattern' => 'path',
281
- 'url_pattern_reg' => '/(?<lang>[^/.?]+)',
282
- ),
310
+ 'url_pattern_reg' => '/(?<lang>[^/.?]+)'
311
+ )
283
312
  )
284
313
  headers = h.request_out(h.lang_code)
285
314
  assert_equal('http://wovn.io/test', headers['HTTP_REFERER'])
@@ -292,12 +321,12 @@ module Wovnrb
292
321
  Wovnrb.get_env(
293
322
  'SERVER_NAME' => 'wovn.io',
294
323
  'REQUEST_URI' => '/test',
295
- 'HTTP_REFERER' => 'http://wovn.io/test',
324
+ 'HTTP_REFERER' => 'http://wovn.io/test'
296
325
  ),
297
326
  Wovnrb.get_settings(
298
327
  'url_pattern' => 'query',
299
- 'url_pattern_reg' => '((\\?.*&)|\\?)wovn=(?<lang>[^&]+)(&|$)',
300
- ),
328
+ 'url_pattern_reg' => '((\\?.*&)|\\?)wovn=(?<lang>[^&]+)(&|$)'
329
+ )
301
330
  )
302
331
  headers = h.request_out(h.lang_code)
303
332
  assert_equal('http://wovn.io/test', headers['HTTP_REFERER'])
@@ -310,12 +339,12 @@ module Wovnrb
310
339
  Wovnrb.get_env(
311
340
  'SERVER_NAME' => 'ja.wovn.io',
312
341
  'REQUEST_URI' => '/test',
313
- 'HTTP_REFERER' => 'http://ja.wovn.io/test',
342
+ 'HTTP_REFERER' => 'http://ja.wovn.io/test'
314
343
  ),
315
344
  Wovnrb.get_settings(
316
345
  'url_pattern' => 'subdomain',
317
- 'url_pattern_reg' => '^(?<lang>[^.]+).',
318
- ),
346
+ 'url_pattern_reg' => '^(?<lang>[^.]+).'
347
+ )
319
348
  )
320
349
  headers = h.out(h.request_out('ja'))
321
350
  assert_equal('ja', headers['wovnrb.target_lang'])
@@ -324,7 +353,7 @@ module Wovnrb
324
353
  def test_out_with_wovn_target_lang_header_using_path
325
354
  h = Wovnrb::Headers.new(
326
355
  Wovnrb.get_env('REQUEST_URI' => '/ja/test', 'HTTP_REFERER' => 'http://wovn.io/ja/test'),
327
- Wovnrb.get_settings,
356
+ Wovnrb.get_settings
328
357
  )
329
358
  headers = h.out(h.request_out('ja'))
330
359
  assert_equal('ja', headers['wovnrb.target_lang'])
@@ -335,8 +364,8 @@ module Wovnrb
335
364
  Wovnrb.get_env('REQUEST_URI' => 'test?wovn=ja', 'HTTP_REFERER' => 'http://wovn.io/test'),
336
365
  Wovnrb.get_settings(
337
366
  'url_pattern' => 'query',
338
- 'url_pattern_reg' => "((\\?.*&)|\\?)wovn=(?<lang>[^&]+)(&|$)",
339
- ),
367
+ 'url_pattern_reg' => '((\\?.*&)|\\?)wovn=(?<lang>[^&]+)(&|$)'
368
+ )
340
369
  )
341
370
  headers = h.out(h.request_out('ja'))
342
371
  assert_equal('ja', headers['wovnrb.target_lang'])
@@ -2643,7 +2672,7 @@ module Wovnrb
2643
2672
  def test_path_lang_sudomain_with_use_proxy_false
2644
2673
  h = Wovnrb::Headers.new(
2645
2674
  Wovnrb.get_env('url' => 'http://localhost:1234/test', 'HTTP_X_FORWARDED_HOST' => 'zh-cht.wovn.io'),
2646
- Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).'),
2675
+ Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).')
2647
2676
  )
2648
2677
  assert_equal('', h.path_lang)
2649
2678
  end
@@ -2652,7 +2681,7 @@ module Wovnrb
2652
2681
  env = Wovnrb.get_env('url' => 'http://localhost:1234/test', 'HTTP_X_FORWARDED_HOST' => 'zh-cht.wovn.io')
2653
2682
  h = Wovnrb::Headers.new(
2654
2683
  env,
2655
- Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).', 'use_proxy' => true),
2684
+ Wovnrb.get_settings('url_pattern' => 'subdomain', 'url_pattern_reg' => '^(?<lang>[^.]+).', 'use_proxy' => true)
2656
2685
  )
2657
2686
  assert_equal('zh-CHT', h.path_lang)
2658
2687
  end
@@ -6217,13 +6246,13 @@ module Wovnrb
6217
6246
  end
6218
6247
 
6219
6248
  def test_remove_lang_subdomain_with_custom_lang_alias
6220
- Store.instance.update_settings({'custom_lang_aliases' => {'fr' => 'staging-fr'}})
6249
+ Store.instance.update_settings('custom_lang_aliases' => { 'fr' => 'staging-fr' })
6221
6250
  h = Wovnrb::Headers.new(Wovnrb.get_env, Wovnrb.get_settings('url_pattern' => 'subdomain'))
6222
6251
 
6223
- uri_without_scheme = h.remove_lang("staging-fr.wovn.io/", 'fr')
6252
+ uri_without_scheme = h.remove_lang('staging-fr.wovn.io/', 'fr')
6224
6253
  assert_equal('wovn.io/', uri_without_scheme)
6225
6254
 
6226
- uri_with_scheme = h.remove_lang("https://staging-fr.wovn.io", 'fr')
6255
+ uri_with_scheme = h.remove_lang('https://staging-fr.wovn.io', 'fr')
6227
6256
  assert_equal('https://wovn.io', uri_with_scheme)
6228
6257
  end
6229
6258
  end