diversion 0.0.1
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.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +2 -0
- data/LICENSE.txt +22 -0
- data/README.md +193 -0
- data/Rakefile +7 -0
- data/diversion.gemspec +40 -0
- data/lib/diversion.rb +35 -0
- data/lib/diversion/client.rb +21 -0
- data/lib/diversion/configurable.rb +100 -0
- data/lib/diversion/decode.rb +21 -0
- data/lib/diversion/decode/json.rb +47 -0
- data/lib/diversion/decode/params.rb +55 -0
- data/lib/diversion/encode.rb +67 -0
- data/lib/diversion/encode/json.rb +31 -0
- data/lib/diversion/encode/params.rb +26 -0
- data/lib/diversion/error.rb +2 -0
- data/lib/diversion/error/bad_url_data_format.rb +6 -0
- data/lib/diversion/error/configuration_error.rb +6 -0
- data/lib/diversion/error/key_missing_error.rb +6 -0
- data/lib/diversion/error/uri_missing_error.rb +6 -0
- data/lib/diversion/mailer.rb +11 -0
- data/lib/diversion/signing.rb +19 -0
- data/lib/diversion/url.rb +43 -0
- data/lib/diversion/version.rb +17 -0
- data/spec/coverage/assets/0.7.1/application.css +1110 -0
- data/spec/coverage/assets/0.7.1/application.js +626 -0
- data/spec/coverage/assets/0.7.1/fancybox/blank.gif +0 -0
- data/spec/coverage/assets/0.7.1/fancybox/fancy_close.png +0 -0
- data/spec/coverage/assets/0.7.1/fancybox/fancy_loading.png +0 -0
- data/spec/coverage/assets/0.7.1/fancybox/fancy_nav_left.png +0 -0
- data/spec/coverage/assets/0.7.1/fancybox/fancy_nav_right.png +0 -0
- data/spec/coverage/assets/0.7.1/fancybox/fancy_shadow_e.png +0 -0
- data/spec/coverage/assets/0.7.1/fancybox/fancy_shadow_n.png +0 -0
- data/spec/coverage/assets/0.7.1/fancybox/fancy_shadow_ne.png +0 -0
- data/spec/coverage/assets/0.7.1/fancybox/fancy_shadow_nw.png +0 -0
- data/spec/coverage/assets/0.7.1/fancybox/fancy_shadow_s.png +0 -0
- data/spec/coverage/assets/0.7.1/fancybox/fancy_shadow_se.png +0 -0
- data/spec/coverage/assets/0.7.1/fancybox/fancy_shadow_sw.png +0 -0
- data/spec/coverage/assets/0.7.1/fancybox/fancy_shadow_w.png +0 -0
- data/spec/coverage/assets/0.7.1/fancybox/fancy_title_left.png +0 -0
- data/spec/coverage/assets/0.7.1/fancybox/fancy_title_main.png +0 -0
- data/spec/coverage/assets/0.7.1/fancybox/fancy_title_over.png +0 -0
- data/spec/coverage/assets/0.7.1/fancybox/fancy_title_right.png +0 -0
- data/spec/coverage/assets/0.7.1/fancybox/fancybox-x.png +0 -0
- data/spec/coverage/assets/0.7.1/fancybox/fancybox-y.png +0 -0
- data/spec/coverage/assets/0.7.1/fancybox/fancybox.png +0 -0
- data/spec/coverage/assets/0.7.1/favicon_green.png +0 -0
- data/spec/coverage/assets/0.7.1/favicon_red.png +0 -0
- data/spec/coverage/assets/0.7.1/favicon_yellow.png +0 -0
- data/spec/coverage/assets/0.7.1/loading.gif +0 -0
- data/spec/coverage/assets/0.7.1/magnify.png +0 -0
- data/spec/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/spec/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/spec/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/spec/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/spec/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/spec/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/spec/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/spec/coverage/assets/0.7.1/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/spec/coverage/assets/0.7.1/smoothness/images/ui-icons_222222_256x240.png +0 -0
- data/spec/coverage/assets/0.7.1/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
- data/spec/coverage/assets/0.7.1/smoothness/images/ui-icons_454545_256x240.png +0 -0
- data/spec/coverage/assets/0.7.1/smoothness/images/ui-icons_888888_256x240.png +0 -0
- data/spec/coverage/assets/0.7.1/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/spec/coverage/index.html +3146 -0
- data/spec/diversion/client_spec.rb +23 -0
- data/spec/diversion/configurable_spec.rb +128 -0
- data/spec/diversion/decode/json_decode_spec.rb +70 -0
- data/spec/diversion/decode/params_decode_spec.rb +74 -0
- data/spec/diversion/decode_spec.rb +12 -0
- data/spec/diversion/encode/json_encode_spec.rb +39 -0
- data/spec/diversion/encode/params_encode_spec.rb +39 -0
- data/spec/diversion/encode_spec.rb +30 -0
- data/spec/diversion/mailer_spec.rb +31 -0
- data/spec/diversion/support/global_shared_context.rb +29 -0
- data/spec/diversion/url_spec.rb +36 -0
- data/spec/fixtures/mail.html +13 -0
- data/spec/fixtures/sample_email.multipart +39 -0
- data/spec/fixtures/sample_email.text +12 -0
- data/spec/spec_helper.rb +84 -0
- metadata +323 -0
- metadata.gz.sig +0 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Diversion::Client do
|
|
4
|
+
|
|
5
|
+
it "delegates to a client" do
|
|
6
|
+
expect(Diversion.encode(HTML)).to eq(html_params_encoded)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
it "configures" do
|
|
10
|
+
client = Diversion::Client.new
|
|
11
|
+
client.configure do |c|
|
|
12
|
+
c.host = "dummy.host"
|
|
13
|
+
end
|
|
14
|
+
expect(client.host).to eq("dummy.host")
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "allows for separate configs" do
|
|
18
|
+
m1 = Diversion::Client.new({:host => "test1"})
|
|
19
|
+
m2 = Diversion::Client.new({:host => "test2"})
|
|
20
|
+
expect(m1.host).to_not eq(m2.host)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
class ConfigTestStub
|
|
4
|
+
include Diversion::Configurable
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
describe Diversion::Configurable do
|
|
8
|
+
|
|
9
|
+
let(:config) { config = ConfigTestStub.new; config.reset!; config }
|
|
10
|
+
|
|
11
|
+
def set_config(&block) config.configure do |c| c.instance_eval(&block) end; end
|
|
12
|
+
def host(value); set_config{|c|c.host = value}; end
|
|
13
|
+
def path(value); set_config{|c|c.path = value}; end
|
|
14
|
+
def port(value); set_config{|c|c.port = value}; end
|
|
15
|
+
def encode_uris(value); set_config{|c|c.encode_uris = value}; end
|
|
16
|
+
def sign_length(value); set_config{|c|c.sign_length = value}; end
|
|
17
|
+
def url_encoding(value); set_config{|c|c.url_encoding = value}; end
|
|
18
|
+
def url_decoding(value); set_config{|c|c.url_decoding = value}; end
|
|
19
|
+
|
|
20
|
+
describe "host" do
|
|
21
|
+
it "must be a string" do
|
|
22
|
+
expect{host(1)}.to raise_error
|
|
23
|
+
end
|
|
24
|
+
it "accepts string type" do
|
|
25
|
+
expect{host('test')}.to_not raise_error
|
|
26
|
+
end
|
|
27
|
+
it "cannot end with trailing slash" do
|
|
28
|
+
expect{host('test/')}.to raise_error
|
|
29
|
+
end
|
|
30
|
+
it "doesnt accept nil" do
|
|
31
|
+
expect{host(nil)}.to raise_error
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
describe "path" do
|
|
36
|
+
it "must be a string" do
|
|
37
|
+
expect{path(1)}.to raise_error
|
|
38
|
+
end
|
|
39
|
+
it "accepts string type" do
|
|
40
|
+
expect{path('test/')}.to_not raise_error
|
|
41
|
+
end
|
|
42
|
+
it "must end with trailing slash" do
|
|
43
|
+
expect{path('test')}.to raise_error
|
|
44
|
+
end
|
|
45
|
+
it "doesnt accept nil" do
|
|
46
|
+
expect{path(nil)}.to raise_error
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
describe "port" do
|
|
51
|
+
it "must be an integer" do
|
|
52
|
+
expect{port('test')}.to raise_error
|
|
53
|
+
end
|
|
54
|
+
it "accepts an integer" do
|
|
55
|
+
expect{port(1)}.to_not raise_error
|
|
56
|
+
end
|
|
57
|
+
it "does not accept 0" do
|
|
58
|
+
expect{port(0)}.to raise_error
|
|
59
|
+
end
|
|
60
|
+
it "does not accept <0" do
|
|
61
|
+
expect{port(-1)}.to raise_error
|
|
62
|
+
end
|
|
63
|
+
it "doesnt accept nil" do
|
|
64
|
+
expect{port(nil)}.to raise_error
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
describe "sign_length" do
|
|
69
|
+
it "must be an integer" do
|
|
70
|
+
expect{sign_length('test')}.to raise_error
|
|
71
|
+
end
|
|
72
|
+
it "accepts 0 (disaled)" do
|
|
73
|
+
expect{sign_length(0)}.to_not raise_error
|
|
74
|
+
end
|
|
75
|
+
it "accepts integer at lower range" do
|
|
76
|
+
expect{sign_length(1)}.to_not raise_error
|
|
77
|
+
end
|
|
78
|
+
it "accepts integer at higher range" do
|
|
79
|
+
expect{sign_length(Diversion::Signing::MAX_SIGN_LENGTH)}.to_not raise_error
|
|
80
|
+
end
|
|
81
|
+
it "does not accept <0" do
|
|
82
|
+
expect{sign_length(-1)}.to raise_error
|
|
83
|
+
end
|
|
84
|
+
it "doesnt accept nil" do
|
|
85
|
+
expect{sign_length(nil)}.to raise_error
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
describe "encode_uris" do
|
|
90
|
+
it "must be an array" do
|
|
91
|
+
expect{encode_uris('test')}.to raise_error
|
|
92
|
+
end
|
|
93
|
+
it "accepts uri" do
|
|
94
|
+
expect{encode_uris(['http'])}.to_not raise_error
|
|
95
|
+
end
|
|
96
|
+
it "doesnt accept nil" do
|
|
97
|
+
expect{encode_uris(nil)}.to raise_error
|
|
98
|
+
end
|
|
99
|
+
it "doesnt accept empty array" do
|
|
100
|
+
expect{encode_uris([])}.to raise_error
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
describe "url_encoding" do
|
|
105
|
+
it "must be a module" do
|
|
106
|
+
expect{url_encoding('test')}.to raise_error
|
|
107
|
+
end
|
|
108
|
+
it "accepts a valid module" do
|
|
109
|
+
expect{url_encoding(Diversion::Encode::Json)}.to_not raise_error
|
|
110
|
+
end
|
|
111
|
+
it "doesn't accept an invalid module" do
|
|
112
|
+
expect{url_encoding(Diversion::Decode::Json)}.to raise_error
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
describe "url_decoding" do
|
|
117
|
+
it "must be a module" do
|
|
118
|
+
expect{url_decoding('test')}.to raise_error
|
|
119
|
+
end
|
|
120
|
+
it "accepts a valid module" do
|
|
121
|
+
expect{url_decoding(Diversion::Decode::Json)}.to_not raise_error
|
|
122
|
+
end
|
|
123
|
+
it "doesn't accept an invalid module" do
|
|
124
|
+
expect{url_decoding(Diversion::Encode::Json)}.to raise_error
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Diversion::Decode::Json do
|
|
4
|
+
|
|
5
|
+
include_context "json"
|
|
6
|
+
|
|
7
|
+
it "returns correct type for non-signed" do
|
|
8
|
+
expect(decode_json).to be_a Hash
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "returns correct type for signed" do
|
|
12
|
+
expect(decode_json_signed).to be_a Hash
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "raises when data format invalid" do
|
|
16
|
+
expect{client.decode("test-test-test")}.to raise_error(Diversion::Error::BadUrlDataFormat)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "doesn't parse when passed bad data" do
|
|
20
|
+
expect(client.decode("test-test")[:parsed]).to be_false
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "parses when passed good data" do
|
|
24
|
+
expect(decode_json[:parsed]).to be_true
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "returns expected values when passed good unsigned data" do
|
|
28
|
+
hash = decode_json
|
|
29
|
+
expect(hash[:url]).to eq("http://test.com/test")
|
|
30
|
+
expect(hash[:signed]).to be_false
|
|
31
|
+
expect(hash[:key_presented]).to be_empty
|
|
32
|
+
expect(hash[:key_expected]).to be_empty
|
|
33
|
+
expect(hash[:key_verified]).to be_false
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it "returns expected values when passed good signed data" do
|
|
37
|
+
hash = decode_json_signed
|
|
38
|
+
expect(hash[:url]).to eq("http://test.com/test")
|
|
39
|
+
expect(hash[:signed]).to be_true
|
|
40
|
+
expect(hash[:key_presented]).to eq(JSON_KEY)
|
|
41
|
+
expect(hash[:key_expected]).to eq(JSON_KEY)
|
|
42
|
+
expect(hash[:key_verified]).to be_true
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "returns expected values when passed badly signed data" do
|
|
46
|
+
hash = decode_json_bad_key
|
|
47
|
+
expect(hash[:url]).to eq("http://test.com/test")
|
|
48
|
+
expect(hash[:signed]).to be_true
|
|
49
|
+
expect(hash[:key_presented]).to eq(JSON_KEY_BAD)
|
|
50
|
+
expect(hash[:key_expected]).to eq(JSON_KEY)
|
|
51
|
+
expect(hash[:key_verified]).to be_false
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "decodes parameters as expected" do
|
|
55
|
+
enc = client.encode(HTML, {:b => 999})
|
|
56
|
+
data = enc.scan(/".*?\/.*?\/.*?\/.*?\/.*?\/(.*?)"/).first.first
|
|
57
|
+
result = client.decode(data)
|
|
58
|
+
expect(result[:test]).to eq("1234")
|
|
59
|
+
expect(result[:b]).to eq(999)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it "decodes parameters as expected when signed" do
|
|
63
|
+
enc = client_sign.encode(HTML, {:b => 999})
|
|
64
|
+
data = enc.scan(/".*?\/.*?\/.*?\/.*?\/.*?\/(.*?)"/).first.first
|
|
65
|
+
hash = client.decode(data)
|
|
66
|
+
expect(hash[:test]).to eq("1234")
|
|
67
|
+
expect(hash[:b]).to eq(999)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Diversion::Decode::Params do
|
|
4
|
+
|
|
5
|
+
include_context "params"
|
|
6
|
+
|
|
7
|
+
it "returns correct type for non-signed" do
|
|
8
|
+
expect(decode_params).to be_a Hash
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "returns correct type for signed" do
|
|
12
|
+
expect(decode_params_signed).to be_a Hash
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "raises when data format invalid" do
|
|
16
|
+
expect{client.decode("badparam=badvalue")}.to raise_error(Diversion::Error::BadUrlDataFormat)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "raises when data format invalid" do
|
|
20
|
+
expect{client.decode("rubbish")}.to raise_error(Diversion::Error::BadUrlDataFormat)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "raises when missing url data parameter" do
|
|
24
|
+
expect{client.decode("d=#{CGI::escape('badparam=badvalue')}")}.to raise_error(Diversion::Error::BadUrlDataFormat)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "raises when missing url data parameter empty" do
|
|
28
|
+
expect{client.decode("d=#{CGI::escape('url=')}")}.to raise_error(Diversion::Error::BadUrlDataFormat)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "returns expected values when passed good unsigned data" do
|
|
32
|
+
hash = decode_params
|
|
33
|
+
expect(hash[:url]).to eq("http://test.com/test")
|
|
34
|
+
expect(hash[:signed]).to be_false
|
|
35
|
+
expect(hash[:key_presented]).to be_empty
|
|
36
|
+
expect(hash[:key_expected]).to be_empty
|
|
37
|
+
expect(hash[:key_verified]).to be_false
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "returns expected values when passed good signed data" do
|
|
41
|
+
hash = decode_params_signed
|
|
42
|
+
expect(hash[:url]).to eq("http://test.com/test")
|
|
43
|
+
expect(hash[:signed]).to be_true
|
|
44
|
+
expect(hash[:key_presented]).to eq(PARAMS_KEY)
|
|
45
|
+
expect(hash[:key_expected]).to eq(PARAMS_KEY)
|
|
46
|
+
expect(hash[:key_verified]).to be_true
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "returns expected values when passed badly signed data" do
|
|
50
|
+
hash = decode_params_bad_key
|
|
51
|
+
expect(hash[:url]).to eq("http://test.com/test")
|
|
52
|
+
expect(hash[:signed]).to be_true
|
|
53
|
+
expect(hash[:key_presented]).to eq(PARAMS_KEY_BAD)
|
|
54
|
+
expect(hash[:key_expected]).to eq(PARAMS_KEY)
|
|
55
|
+
expect(hash[:key_verified]).to be_false
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it "decodes parameters as expected" do
|
|
59
|
+
enc = client.encode(HTML, {:b => 999})
|
|
60
|
+
data = enc.scan(/".*?\/.*?\/.*?\/.*?\/.*?\/(.*?)"/).first.first[1..-1]
|
|
61
|
+
result = client.decode(data)
|
|
62
|
+
expect(result[:test]).to eq("1234")
|
|
63
|
+
expect(result[:b]).to eq("999")
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "decodes parameters as expected when signed" do
|
|
67
|
+
enc = client_sign.encode(HTML, {:b => 999})
|
|
68
|
+
data = enc.scan(/".*?\/.*?\/.*?\/.*?\/.*?\/(.*?)"/).first.first[1..-1]
|
|
69
|
+
hash = client.decode(data)
|
|
70
|
+
expect(hash[:test]).to eq("1234")
|
|
71
|
+
expect(hash[:b]).to eq("999")
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Diversion::Decode do
|
|
4
|
+
|
|
5
|
+
# we use json encoding here but it doesn't matter as we're testing common functionality
|
|
6
|
+
include_context "json"
|
|
7
|
+
|
|
8
|
+
it "raise ArgumentError if data.length == 0" do
|
|
9
|
+
expect{client.decode("")}.to raise_error(ArgumentError)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Diversion::Encode::Json do
|
|
4
|
+
|
|
5
|
+
include_context "json"
|
|
6
|
+
|
|
7
|
+
it "returns correct type" do
|
|
8
|
+
expect(encode_email).to be_a String
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "uses correct path" do
|
|
12
|
+
expect(encode_json_html).to match(/http:\/\/localhost.domain\/redirect\/1\/[A-Za-z0-9].*\">test<\/a>/)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "doesn't add port for 80" do
|
|
16
|
+
client.port = 80
|
|
17
|
+
expect(encode_json_html).to_not match(/http:\/\/localhost.domain:80\/redirect/)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "adds port number for non-80 port" do
|
|
21
|
+
client.port = 81
|
|
22
|
+
expect(encode_json_html).to match(/http:\/\/localhost.domain:81\/redirect/)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "doesn't sign by default" do
|
|
26
|
+
expect(encode_json_html).to_not match(/-/)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "signs correctly" do
|
|
30
|
+
client_sign.sign_length = 32
|
|
31
|
+
expect(encode_json_html_signed).to match(/-[A-Za-z0-9]{32}\"/)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "observes sign_length" do
|
|
35
|
+
client_sign.sign_length = 2
|
|
36
|
+
expect(encode_json_html_signed).to match(/-[A-Za-z0-9]{2}\"/)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Diversion::Encode::Params do
|
|
4
|
+
|
|
5
|
+
include_context "params"
|
|
6
|
+
|
|
7
|
+
it "returns correct type" do
|
|
8
|
+
expect(encode_email).to be_a String
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "uses correct path" do
|
|
12
|
+
expect(encode_params_html).to eq(html_params_encoded)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "doesn't add port for 80" do
|
|
16
|
+
client.port = 80
|
|
17
|
+
expect(encode_params_html).to eq(html_params_encoded)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "adds port number for non-80 port" do
|
|
21
|
+
client.port = 81
|
|
22
|
+
expect(encode_params_html).to eq(html_params_encoded({:port => 81}))
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "doesn't sign by default" do
|
|
26
|
+
expect(encode_params_html).to eq(html_params_encoded)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "signs correctly" do
|
|
30
|
+
client_sign.sign_length = 32
|
|
31
|
+
expect(encode_params_html_signed).to eq(html_params_encoded({:sign_length => DEFAULT_SIGN_LEN}))
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "observes sign_length" do
|
|
35
|
+
client_sign.sign_length = 2
|
|
36
|
+
expect(encode_params_html_signed).to eq(html_params_encoded({:sign_length => 2}))
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Diversion::Encode do
|
|
4
|
+
|
|
5
|
+
# we use json encoding here but it doesn't matter as we're testing common functionality
|
|
6
|
+
include_context "json"
|
|
7
|
+
|
|
8
|
+
it "ignores non-http uris" do
|
|
9
|
+
expect(encode_email).to include('mailto:jess@doesnotexist.domain')
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "converts http uris" do
|
|
13
|
+
expect(encode_email).to_not include('https://twitter.com/intent/tweet?in_reply_to=51113028241989632')
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "removes data attributes" do
|
|
17
|
+
expect(encode_email).to_not include('data-')
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "raises when signing key not set" do
|
|
21
|
+
client_sign.sign_key = nil
|
|
22
|
+
expect { encode_json_html_signed }.to raise_error(Diversion::Error::KeyMissingError)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "raises when no uris defined" do
|
|
26
|
+
client.encode_uris = []
|
|
27
|
+
expect { encode_json_html_signed }.to raise_error(Diversion::Error::ConfigurationError)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Mail::Message do
|
|
4
|
+
|
|
5
|
+
let(:multipart) { Mail::Message.new(fixture('sample_email.multipart').read).diversion }
|
|
6
|
+
let(:multipart_args) { Mail::Message.new(fixture('sample_email.multipart').read).diversion({:a => 1}, {:encode_uris => ['http']}) }
|
|
7
|
+
let(:text_only) { Mail::Message.new(fixture('sample_email.text').read).diversion }
|
|
8
|
+
|
|
9
|
+
it "replaces html part" do
|
|
10
|
+
expect(multipart.html_part.body).to include('<a href="http://localhost.domain/redirect/1/?d=url%3Dhttp%253A%252F%252Fwww.youtube.com%252Fwatch%253Fv%253DFE_9CzLCbkY">Dream of the 90s</a>')
|
|
11
|
+
expect(multipart.html_part.body).to include('<a href="http://localhost.domain/redirect/1/?d=url%3Dhttps%253A%252F%252Fwww.youtube.com%252Fwatch%253Fv%253DOyQ6pqPFwTI">Customers only</a>')
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "doesn't replace text part" do
|
|
15
|
+
expect(text_only.body).to include('http://www.youtube.com/watch?v=FE_9CzLCbkY')
|
|
16
|
+
expect(text_only.body).to include('http://www.youtube.com/watch?v=OyQ6pqPFwTI')
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "doesn't fail when only text part present" do
|
|
20
|
+
expect{text_only}.to_not raise_error
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "honors additional global data parameters" do
|
|
24
|
+
expect(multipart_args.html_part.body).to include('<a href="http://localhost.domain/redirect/1/?d=a%3D1%26url%3Dhttp%253A%252F%252Fwww.youtube.com%252Fwatch%253Fv%253DFE_9CzLCbkY">Dream of the 90s</a>')
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "honors additional config arguments" do
|
|
28
|
+
expect(multipart_args.html_part.body).to include('<a href="https://www.youtube.com/watch?v=OyQ6pqPFwTI">Customers only</a>')
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end
|