wovnrb 0.2.01 → 0.2.02

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -6
  3. data/README.md +116 -12
  4. data/lib/wovnrb/api_data.rb +59 -0
  5. data/lib/wovnrb/headers.rb +30 -5
  6. data/lib/wovnrb/html_replacers/image_replacer.rb +44 -0
  7. data/lib/wovnrb/html_replacers/link_replacer.rb +18 -0
  8. data/lib/wovnrb/html_replacers/meta_replacer.rb +20 -0
  9. data/lib/wovnrb/html_replacers/replacer_base.rb +17 -0
  10. data/lib/wovnrb/html_replacers/script_replacer.rb +39 -0
  11. data/lib/wovnrb/html_replacers/text_replacer.rb +19 -0
  12. data/lib/wovnrb/lang.rb +133 -23
  13. data/lib/wovnrb/services/url.rb +2 -68
  14. data/lib/wovnrb/services/wovn_logger.rb +45 -0
  15. data/lib/wovnrb/store.rb +19 -38
  16. data/lib/wovnrb/text_caches/cache_base.rb +52 -0
  17. data/lib/wovnrb/text_caches/memory_cache.rb +52 -0
  18. data/lib/wovnrb/version.rb +1 -1
  19. data/lib/wovnrb.rb +19 -224
  20. data/test/lib/api_data_test.rb +62 -0
  21. data/test/lib/headers_test.rb +1221 -1212
  22. data/test/lib/html_replacers/image_replacer_test.rb +86 -0
  23. data/test/lib/html_replacers/link_replacer_test.rb +43 -0
  24. data/test/lib/html_replacers/meta_replacer_test.rb +105 -0
  25. data/test/lib/html_replacers/replacer_base_test.rb +31 -0
  26. data/test/lib/html_replacers/script_replacer_test.rb +90 -0
  27. data/test/lib/html_replacers/text_replacer_test.rb +57 -0
  28. data/test/lib/lang_test.rb +446 -33
  29. data/test/lib/services/wovn_logger_test.rb +40 -0
  30. data/test/lib/store_test.rb +39 -29
  31. data/test/lib/text_caches/cache_base_test.rb +31 -0
  32. data/test/lib/text_caches/memory_cache_test.rb +91 -0
  33. data/test/lib/wovnrb_test.rb +39 -886
  34. data/test/test_helper.rb +96 -1
  35. data/wovnrb.gemspec +4 -0
  36. metadata +89 -2
@@ -0,0 +1,86 @@
1
+ require 'test_helper'
2
+ require 'webmock/minitest'
3
+
4
+ module Wovnrb
5
+ class ImageReplacerTest < WovnMiniTest
6
+ def test_replace
7
+ url = {
8
+ :protocol => 'http',
9
+ :host => 'www.example.com',
10
+ :pathname => 'hello/index.html'
11
+ }
12
+ text_index = {
13
+ 'Hello' => {'ja' => [{'data' => 'こんにちは'}]}
14
+ }
15
+ src_index = {
16
+ 'http://www.example.com/test.img' => {'ja' => [{'data' => 'http://test.com/ttt.img'}]}
17
+ }
18
+ img_src_prefix = 'prefix::'
19
+ replacer = ImageReplacer.new(url, text_index, src_index, img_src_prefix)
20
+
21
+ dom = Wovnrb.get_dom('<img src="http://www.example.com/test.img" alt="Hello"')
22
+ replacer.replace(dom, Lang.new('ja'))
23
+
24
+ img = dom.xpath('//img')[0]
25
+ assert_equal('prefix::http://test.com/ttt.img', img.get_attribute('src'))
26
+ assert_equal('こんにちは', img.get_attribute('alt'))
27
+ end
28
+
29
+ def test_replace_relative_path
30
+ url = {
31
+ :protocol => 'http',
32
+ :host => 'www.example.com',
33
+ :path => '/hello/'
34
+ }
35
+ text_index = {}
36
+ src_index = {
37
+ 'http://www.example.com/hello/test.img' => {'ja' => [{'data' => 'http://test.com/ttt.img'}]}
38
+ }
39
+ replacer = ImageReplacer.new(url, text_index, src_index, '')
40
+
41
+ dom = Wovnrb.get_dom('<img src="test.img"')
42
+ replacer.replace(dom, Lang.new('ja'))
43
+
44
+ img = dom.xpath('//img')[0]
45
+ assert_equal('http://test.com/ttt.img', img.get_attribute('src'))
46
+ end
47
+
48
+ def test_replace_root_path
49
+ url = {
50
+ :protocol => 'http',
51
+ :host => 'www.example.com',
52
+ :path => '/hello/'
53
+ }
54
+ text_index = {}
55
+ src_index = {
56
+ 'http://www.example.com/test.img' => {'ja' => [{'data' => 'http://test.com/ttt.img'}]}
57
+ }
58
+ replacer = ImageReplacer.new(url, text_index, src_index, '')
59
+
60
+ dom = Wovnrb.get_dom('<img src="/test.img"')
61
+ replacer.replace(dom, Lang.new('ja'))
62
+
63
+ img = dom.xpath('//img')[0]
64
+ assert_equal('http://test.com/ttt.img', img.get_attribute('src'))
65
+ end
66
+
67
+ def test_replace_absolute_path
68
+ url = {
69
+ :protocol => 'http',
70
+ :host => 'www.example.com',
71
+ :path => '/hello/'
72
+ }
73
+ text_index = {}
74
+ src_index = {
75
+ 'http://www.test.com/test.img' => {'ja' => [{'data' => 'http://test.com/ttt.img'}]}
76
+ }
77
+ replacer = ImageReplacer.new(url, text_index, src_index, '')
78
+
79
+ dom = Wovnrb.get_dom('<img src="http://www.test.com/test.img"')
80
+ replacer.replace(dom, Lang.new('ja'))
81
+
82
+ img = dom.xpath('//img')[0]
83
+ assert_equal('http://test.com/ttt.img', img.get_attribute('src'))
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,43 @@
1
+ require 'test_helper'
2
+ require 'webmock/minitest'
3
+
4
+ module Wovnrb
5
+ class ReplacerBaseTest < WovnMiniTest
6
+ def test_replace
7
+ replacer = LinkReplacer.new('query', get_header)
8
+ dom = Wovnrb.get_dom('<a href="/index.html">link text</a>')
9
+ replacer.replace(dom, Lang.new('en'))
10
+
11
+ link = dom.xpath('//a')[0].get_attribute('href')
12
+ assert_equal('/index.html?wovn=en', link)
13
+ end
14
+
15
+ def test_replace_multiple
16
+ replacer = LinkReplacer.new('query', get_header)
17
+ dom = Wovnrb.get_dom('<a href="/index.html">link text</a><div>aaa</div><a href="/index2.html">link text</a>')
18
+ replacer.replace(dom, Lang.new('en'))
19
+
20
+ link = dom.xpath('//a')[0].get_attribute('href')
21
+ link2 = dom.xpath('//a')[1].get_attribute('href')
22
+
23
+ assert_equal('/index.html?wovn=en', link)
24
+ assert_equal('/index2.html?wovn=en', link2)
25
+ end
26
+
27
+ def test_replace_ignore
28
+ replacer = LinkReplacer.new('query', get_header)
29
+ dom = Wovnrb.get_dom('<a wovn-ignore href="/index.html">link text</a>')
30
+ replacer.replace(dom, Lang.new('en'))
31
+
32
+ link = dom.xpath('//a')[0].get_attribute('href')
33
+ assert_equal('/index.html', link)
34
+ end
35
+
36
+
37
+
38
+ def get_header
39
+ h = Wovnrb::Headers.new(Wovnrb.get_env('url' => 'http://favy.tips'), Wovnrb.get_settings('url_pattern' => 'query', 'url_pattern_reg' => '^(?<lang>[^.]+).'))
40
+ end
41
+ end
42
+ end
43
+
@@ -0,0 +1,105 @@
1
+ require 'test_helper'
2
+ require 'webmock/minitest'
3
+
4
+ module Wovnrb
5
+ class MetaReplacerTest < WovnMiniTest
6
+ def test_replace_description
7
+ replacer = MetaReplacer.new({
8
+ 'Hello' => {'ja' => [{'data' => 'こんにちは'}]}
9
+ })
10
+
11
+ dom = Wovnrb.get_dom('<meta name="description" content="Hello">')
12
+ replacer.replace(dom, Lang.new('ja'))
13
+
14
+ content = dom.xpath('//meta')[0].get_attribute('content')
15
+ assert_equal('こんにちは', content)
16
+ end
17
+
18
+ def test_replace_og_description
19
+ replacer = MetaReplacer.new({
20
+ 'Hello' => {'ja' => [{'data' => 'こんにちは'}]}
21
+ })
22
+
23
+ dom = Wovnrb.get_dom('<meta property="og:description" content="Hello">')
24
+ replacer.replace(dom, Lang.new('ja'))
25
+
26
+ content = dom.xpath('//meta')[0].get_attribute('content')
27
+ assert_equal('こんにちは', content)
28
+ end
29
+
30
+ def test_replace_og_title
31
+ replacer = MetaReplacer.new({
32
+ 'Hello' => {'ja' => [{'data' => 'こんにちは'}]}
33
+ })
34
+
35
+ dom = Wovnrb.get_dom('<meta property="og:title" content="Hello">')
36
+ replacer.replace(dom, Lang.new('ja'))
37
+
38
+ content = dom.xpath('//meta')[0].get_attribute('content')
39
+ assert_equal('こんにちは', content)
40
+ end
41
+
42
+ def test_replace_twitter_title
43
+ replacer = MetaReplacer.new({
44
+ 'Hello' => {'ja' => [{'data' => 'こんにちは'}]}
45
+ })
46
+
47
+ dom = Wovnrb.get_dom('<meta property="twitter:title" content="Hello">')
48
+ replacer.replace(dom, Lang.new('ja'))
49
+
50
+ content = dom.xpath('//meta')[0].get_attribute('content')
51
+ assert_equal('こんにちは', content)
52
+ end
53
+
54
+ def test_replace_twitter_description
55
+ replacer = MetaReplacer.new({
56
+ 'Hello' => {'ja' => [{'data' => 'こんにちは'}]}
57
+ })
58
+
59
+ dom = Wovnrb.get_dom('<meta property="twitter:description" content="Hello">')
60
+ replacer.replace(dom, Lang.new('ja'))
61
+
62
+ content = dom.xpath('//meta')[0].get_attribute('content')
63
+ assert_equal('こんにちは', content)
64
+ end
65
+
66
+ def test_replace_multi
67
+ replacer = MetaReplacer.new({
68
+ 'Hello' => {'ja' => [{'data' => 'こんにちは'}]},
69
+ 'Bye' => {'ja' => [{'data' => 'さようなら'}]}
70
+ })
71
+
72
+ dom = Wovnrb.get_dom('<meta property="title" content="Hello"><meta property="title" content="Bye">')
73
+ replacer.replace(dom, Lang.new('ja'))
74
+
75
+ content = dom.xpath('//meta')[0].get_attribute('content')
76
+ content2 = dom.xpath('//meta')[1].get_attribute('content')
77
+ assert_equal('こんにちは', content)
78
+ assert_equal('さようなら', content2)
79
+ end
80
+
81
+ def test_replace_with_space
82
+ replacer = MetaReplacer.new({
83
+ 'Hello' => {'ja' => [{'data' => 'こんにちは'}]},
84
+ })
85
+
86
+ dom = Wovnrb.get_dom('<meta property="title" content=" Hello ">')
87
+ replacer.replace(dom, Lang.new('ja'))
88
+
89
+ content = dom.xpath('//meta')[0].get_attribute('content')
90
+ assert_equal(' こんにちは ', content)
91
+ end
92
+
93
+ def test_replace_wovn_ignore
94
+ replacer = MetaReplacer.new({
95
+ 'Hello' => {'ja' => [{'data' => 'こんにちは'}]},
96
+ })
97
+
98
+ dom = Wovnrb.get_dom('<meta wovn-ignore property="title" content="Hello">')
99
+ replacer.replace(dom, Lang.new('ja'))
100
+
101
+ content = dom.xpath('//meta')[0].get_attribute('content')
102
+ assert_equal('Hello', content)
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,31 @@
1
+ require 'test_helper'
2
+ require 'webmock/minitest'
3
+
4
+ module Wovnrb
5
+ class ReplacerBaseTest < WovnMiniTest
6
+ def test_wovn_ignore
7
+ replacer = ReplacerBase.new
8
+ dom = Wovnrb.to_dom('<html><body><div wovn-ignore></div></body></html>')
9
+ actual = replacer.send(:wovn_ignore?, dom.xpath('//div')[0])
10
+
11
+ assert(actual)
12
+ end
13
+
14
+ def test_wovn_ignore_parent
15
+ replacer = ReplacerBase.new
16
+ dom = Wovnrb.to_dom('<html wovn-ignore><body><div wovn-ignore></div></body></html>')
17
+ actual = replacer.send(:wovn_ignore?, dom.xpath('//div')[0])
18
+
19
+ assert(actual)
20
+ end
21
+
22
+ def test_wovn_ignore_without_attribute
23
+ replacer = ReplacerBase.new
24
+ dom = Wovnrb.to_dom('<html><body><div></div></body></html>')
25
+ actual = replacer.send(:wovn_ignore?, dom.xpath('//div')[0])
26
+
27
+ assert_equal(false, actual)
28
+ end
29
+ end
30
+ end
31
+
@@ -0,0 +1,90 @@
1
+ require 'test_helper'
2
+ require 'webmock/minitest'
3
+
4
+ module Wovnrb
5
+ class ScriptReplacerTest < WovnMiniTest
6
+ def test_replace
7
+ store = Store.instance
8
+ store.settings['user_token'] = 'test_token'
9
+ store.settings['default_lang'] = 'en'
10
+ store.settings['url_pattern'] = 'domain'
11
+
12
+ replacer = ScriptReplacer.new(store)
13
+ dom = to_head_dom('<script src="test/test.js"></script>')
14
+ replacer.replace(dom, Lang.new('ja'))
15
+
16
+ scripts = dom.xpath('//script')
17
+ assert_equal(2, scripts.length)
18
+
19
+ wovn_script = scripts[0]
20
+ other_script = scripts[1]
21
+
22
+ check_wovn_script(wovn_script, 'test_token', 'ja', 'en', 'domain')
23
+ assert_equal('test/test.js', other_script.get_attribute('src'))
24
+ end
25
+
26
+ def test_with_embed_wovn
27
+ store = Store.instance
28
+ store.settings['user_token'] = 'test_token'
29
+ store.settings['default_lang'] = 'en'
30
+ store.settings['url_pattern'] = 'domain'
31
+
32
+ replacer = ScriptReplacer.new(store)
33
+ dom = to_head_dom('<script src="//j.wovn.io/aaaa" data-wovnio="key=test_token" async></script>')
34
+ replacer.replace(dom, Lang.new('ja'))
35
+
36
+ scripts = dom.xpath('//script')
37
+ assert_equal(1, scripts.length)
38
+
39
+ check_wovn_script(scripts[0], 'test_token', 'ja', 'en', 'domain')
40
+ end
41
+
42
+ def test_with_multiple_embed_wovn
43
+ store = Store.instance
44
+ store.settings['user_token'] = 'test_token'
45
+ store.settings['default_lang'] = 'en'
46
+ store.settings['url_pattern'] = 'domain'
47
+
48
+ replacer = ScriptReplacer.new(store)
49
+ dom = to_head_dom('<script src="//j.wovn.io/aaaa" data-wovnio="key=test_token" async></script><script src="//j.wovn.io/bbb" data-wovnio="key=test_token" async></script>')
50
+ replacer.replace(dom, Lang.new('ja'))
51
+
52
+ scripts = dom.xpath('//script')
53
+ assert_equal(1, scripts.length)
54
+
55
+ check_wovn_script(scripts[0], 'test_token', 'ja', 'en', 'domain')
56
+ end
57
+
58
+ def test_with_embed_wovn_at_body
59
+ store = Store.instance
60
+ store.settings['user_token'] = 'test_token'
61
+ store.settings['default_lang'] = 'en'
62
+ store.settings['url_pattern'] = 'domain'
63
+
64
+ replacer = ScriptReplacer.new(store)
65
+ dom = Wovnrb.get_dom('<script src="//j.wovn.io/aaaa" data-wovnio="key=test_token" async></script>')
66
+ replacer.replace(dom, Lang.new('ja'))
67
+
68
+ scripts = dom.xpath('//script')
69
+ assert_equal(1, scripts.length)
70
+
71
+ check_wovn_script(scripts[0], 'test_token', 'ja', 'en', 'domain')
72
+ end
73
+
74
+ def check_wovn_script(node, user_token, current_lang, default_lang, url_pattern)
75
+ wovn_data = [
76
+ ['src', '//j.wovn.io/1'],
77
+ ['async', 'true'],
78
+ ['data-wovnio', "key=#{user_token}&backend=true&currentLang=#{current_lang}&defaultLang=#{default_lang}&urlPattern=#{url_pattern}&version=0.2.01"]
79
+ ]
80
+ wovn_data.each do |data|
81
+ assert_equal(data[1], node.get_attribute(data[0]))
82
+ end
83
+ assert_equal(wovn_data.length, node.attributes.length)
84
+ end
85
+
86
+ def to_head_dom(html)
87
+ Wovnrb.to_dom("<html><head>#{html}</head></html>")
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,57 @@
1
+ require 'test_helper'
2
+ require 'webmock/minitest'
3
+
4
+ module Wovnrb
5
+ class TextReplacerTest < WovnMiniTest
6
+ def test_replace
7
+ replacer = TextReplacer.new({
8
+ 'Hello' => {'ja' => [{'data' => 'こんにちは'}]}
9
+ })
10
+
11
+ dom = Wovnrb.get_dom('Hello')
12
+ replacer.replace(dom, Lang.new('ja'))
13
+
14
+ content = dom.xpath('//text()')[0].content
15
+ assert_equal('こんにちは', content)
16
+ end
17
+
18
+ def test_replace_multiple
19
+ replacer = TextReplacer.new({
20
+ 'Hello' => {'ja' => [{'data' => 'こんにちは'}]},
21
+ 'Bye' => {'ja' => [{'data' => 'さようなら'}]}
22
+ })
23
+
24
+ dom = Wovnrb.get_dom('<span>Hello</span><span>Bye</span>')
25
+ replacer.replace(dom, Lang.new('ja'))
26
+
27
+ content = dom.xpath('//text()')[0].content
28
+ content2 = dom.xpath('//text()')[1].content
29
+ assert_equal('こんにちは', content)
30
+ assert_equal('さようなら', content2)
31
+ end
32
+
33
+ def test_replace_with_space
34
+ replacer = TextReplacer.new({
35
+ 'Hello' => {'ja' => [{'data' => 'こんにちは'}]}
36
+ })
37
+
38
+ dom = Wovnrb.get_dom(' Hello ')
39
+ replacer.replace(dom, Lang.new('ja'))
40
+
41
+ content = dom.xpath('//text()')[0].content
42
+ assert_equal(' こんにちは ', content)
43
+ end
44
+
45
+ def test_replace_wovn_ignore
46
+ replacer = TextReplacer.new({
47
+ 'Hello' => {'ja' => [{'data' => 'こんにちは'}]}
48
+ })
49
+
50
+ dom = Wovnrb.get_dom('<div wovn-ignore>Hello</div>')
51
+ replacer.replace(dom, Lang.new('ja'))
52
+
53
+ content = dom.xpath('//text()')[0].content
54
+ assert_equal('Hello', content)
55
+ end
56
+ end
57
+ end