tinypass 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 +15 -0
- data/.DS_Store +0 -0
- data/.gitignore +20 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +32 -0
- data/Rakefile +19 -0
- data/lib/.DS_Store +0 -0
- data/lib/tinypass.rb +48 -0
- data/lib/tinypass/.DS_Store +0 -0
- data/lib/tinypass/builder.rb +7 -0
- data/lib/tinypass/builder/client_builder.rb +40 -0
- data/lib/tinypass/builder/client_parser.rb +48 -0
- data/lib/tinypass/builder/cookie_parser.rb +25 -0
- data/lib/tinypass/builder/json_msg_builder.rb +115 -0
- data/lib/tinypass/builder/open_encoder.rb +11 -0
- data/lib/tinypass/builder/secure_encoder.rb +15 -0
- data/lib/tinypass/builder/security_utils.rb +67 -0
- data/lib/tinypass/gateway.rb +104 -0
- data/lib/tinypass/offer.rb +23 -0
- data/lib/tinypass/policies.rb +5 -0
- data/lib/tinypass/policies/discount_policy.rb +25 -0
- data/lib/tinypass/policies/policy.rb +25 -0
- data/lib/tinypass/policies/pricing_policy.rb +13 -0
- data/lib/tinypass/policies/restriction_policy.rb +14 -0
- data/lib/tinypass/price_option.rb +66 -0
- data/lib/tinypass/resource.rb +17 -0
- data/lib/tinypass/token.rb +6 -0
- data/lib/tinypass/token/access_token.rb +163 -0
- data/lib/tinypass/token/access_token_list.rb +71 -0
- data/lib/tinypass/token/access_token_store.rb +59 -0
- data/lib/tinypass/token/meter.rb +76 -0
- data/lib/tinypass/token/meter_helper.rb +82 -0
- data/lib/tinypass/token/token_data.rb +72 -0
- data/lib/tinypass/ui.rb +2 -0
- data/lib/tinypass/ui/html_widget.rb +29 -0
- data/lib/tinypass/ui/purchase_request.rb +34 -0
- data/lib/tinypass/utils.rb +34 -0
- data/lib/tinypass/version.rb +3 -0
- data/spec/.DS_Store +0 -0
- data/spec/acceptance/basic_workflow_spec.rb +81 -0
- data/spec/integration/.DS_Store +0 -0
- data/spec/integration/cases/.DS_Store +0 -0
- data/spec/integration/cases/basic_spec.rb +53 -0
- data/spec/integration/cases/combo_spec.rb +43 -0
- data/spec/integration/cases/metered_reminder_spec.rb +42 -0
- data/spec/integration/cases/metered_strict_spec.rb +54 -0
- data/spec/integration/cases/metered_views_spec.rb +92 -0
- data/spec/integration/client_builder_and_parser_spec.rb +21 -0
- data/spec/spec_helper.rb +33 -0
- data/spec/support/.DS_Store +0 -0
- data/spec/support/acceptance.rb +13 -0
- data/spec/support/tinypass_factories.rb +25 -0
- data/spec/unit/.DS_Store +0 -0
- data/spec/unit/builder/.DS_Store +0 -0
- data/spec/unit/builder/client_builder_spec.rb +23 -0
- data/spec/unit/builder/client_parser_spec.rb +27 -0
- data/spec/unit/builder/cookie_parser_spec.rb +39 -0
- data/spec/unit/builder/json_msg_builder_spec.rb +73 -0
- data/spec/unit/builder/open_encoder_spec.rb +15 -0
- data/spec/unit/builder/secure_encoder_spec.rb +23 -0
- data/spec/unit/builder/security_utils_spec.rb +42 -0
- data/spec/unit/gateway_spec.rb +80 -0
- data/spec/unit/offer_spec.rb +31 -0
- data/spec/unit/policies/.DS_Store +0 -0
- data/spec/unit/policies/discount_policy_spec.rb +40 -0
- data/spec/unit/policies/pricing_policy_spec.rb +23 -0
- data/spec/unit/policies/restriction_policy_spec.rb +35 -0
- data/spec/unit/price_option_spec.rb +109 -0
- data/spec/unit/resource_spec.rb +24 -0
- data/spec/unit/tinypass_spec.rb +51 -0
- data/spec/unit/token/.DS_Store +0 -0
- data/spec/unit/token/access_token_list_spec.rb +94 -0
- data/spec/unit/token/access_token_spec.rb +267 -0
- data/spec/unit/token/access_token_store_spec.rb +93 -0
- data/spec/unit/token/meter_helper_spec.rb +103 -0
- data/spec/unit/token/meter_spec.rb +66 -0
- data/spec/unit/token/token_data_spec.rb +66 -0
- data/spec/unit/ui/.DS_Store +0 -0
- data/spec/unit/ui/html_widget_spec.rb +89 -0
- data/spec/unit/ui/purchase_request_spec.rb +46 -0
- data/spec/unit/utils_spec.rb +57 -0
- data/tinypass.gemspec +35 -0
- metadata +330 -0
data/spec/.DS_Store
ADDED
Binary file
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Basic Example' do
|
4
|
+
before do
|
5
|
+
WebMock.allow_net_connect!
|
6
|
+
@access_granted = false
|
7
|
+
@file = nil
|
8
|
+
|
9
|
+
# basic example code begins here
|
10
|
+
Tinypass.sandbox = true
|
11
|
+
Tinypass.aid = ENV['TINYPASS_AID'] || 'expected to find tinypass_aid in environment or .env'
|
12
|
+
Tinypass.private_key = ENV['TINYPASS_PRIVATE_KEY'] || 'expected to find tinypass_private_key in environment or .env'
|
13
|
+
|
14
|
+
rid = 'unique_resource_id'
|
15
|
+
store = Tinypass::AccessTokenStore.new
|
16
|
+
store.load_tokens_from_cookie(cookies)
|
17
|
+
if store.get_access_token(rid).access_granted?
|
18
|
+
# Access granted! Display requested resource to the user.
|
19
|
+
@access_granted = true # code for testing
|
20
|
+
else
|
21
|
+
# Access denied! Proceed with the next steps and display a Tinypass button…
|
22
|
+
|
23
|
+
resource = Tinypass::Resource.new('Premium-Content', 'Site wide premium content access')
|
24
|
+
|
25
|
+
po1 = Tinypass::PriceOption.new('.50', '24 hours')
|
26
|
+
po2 = Tinypass::PriceOption.new('.99', '1 week')
|
27
|
+
offer = Tinypass::Offer.new(resource, po1, po2)
|
28
|
+
|
29
|
+
purchase_request = Tinypass::PurchaseRequest.new(offer)
|
30
|
+
purchase_request.callback = 'myFunction'
|
31
|
+
button_html = purchase_request.generate_tag
|
32
|
+
|
33
|
+
# all further code is for testing
|
34
|
+
FileUtils.mkdir_p('tmp')
|
35
|
+
@file = Tempfile.new(['basic-example-', '.html'], 'tmp')
|
36
|
+
@file.write("<html><head>
|
37
|
+
<script type='text/javascript' src='https://code.tinypass.com/tinypass.js'></script>
|
38
|
+
</head><body>#{ button_html }</body></html>")
|
39
|
+
@file.close
|
40
|
+
visit "/" + File.basename(@file)
|
41
|
+
|
42
|
+
errors = all('.tp-error')
|
43
|
+
if errors.any?
|
44
|
+
expect(errors.first.text).to eq ''
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
after do
|
50
|
+
@file.unlink if @file
|
51
|
+
WebMock.disable_net_connect!
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'access granted' do
|
55
|
+
let(:cookies) { build_tinypass_cookie(access_granted_token) }
|
56
|
+
let(:access_granted_token) { Tinypass::AccessToken.new('unique_resource_id', Time.now.to_i + 10000) }
|
57
|
+
|
58
|
+
it 'passes' do
|
59
|
+
expect(@access_granted).to be_true
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context 'access not granted' do
|
64
|
+
let(:cookies) { build_tinypass_cookie(expired_token) }
|
65
|
+
let(:expired_token) { Tinypass::AccessToken.new('unique_resource_id', Time.now.to_i - 1) }
|
66
|
+
|
67
|
+
it 'passes', js: true do
|
68
|
+
expect(@access_granted).to be_false
|
69
|
+
expect(page).to have_css ".tinypass_button"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context 'token not found' do
|
74
|
+
let(:cookies) { {} }
|
75
|
+
|
76
|
+
it 'passes', js: true do
|
77
|
+
expect(@access_granted).to be_false
|
78
|
+
expect(page).to have_css ".tinypass_button"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
Binary file
|
Binary file
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
feature 'Basic Case' do
|
4
|
+
let(:store) { Tinypass::AccessTokenStore.new }
|
5
|
+
|
6
|
+
scenario 'single access' do
|
7
|
+
token = Tinypass::AccessToken.new('RID1', Time.now.to_i + 1)
|
8
|
+
cookies = build_tinypass_cookie(token)
|
9
|
+
store.load_tokens_from_cookie(cookies)
|
10
|
+
|
11
|
+
expect(store.tokens.size).to eq 1
|
12
|
+
expect(store.get_access_token('RID1').access_granted?).to be_true
|
13
|
+
end
|
14
|
+
|
15
|
+
scenario 'early expiration' do
|
16
|
+
token = Tinypass::AccessToken.new('RID1', Time.now.to_i + 1, Time.now.to_i - 1)
|
17
|
+
cookies = build_tinypass_cookie(token)
|
18
|
+
store.load_tokens_from_cookie(cookies)
|
19
|
+
|
20
|
+
expect(store.tokens.size).to eq 1
|
21
|
+
expect(store.get_access_token('RID1').access_granted?).to be_false
|
22
|
+
end
|
23
|
+
|
24
|
+
scenario 'all granted' do
|
25
|
+
tokens = [
|
26
|
+
Tinypass::AccessToken.new('RID1', Time.now.to_i + 1),
|
27
|
+
Tinypass::AccessToken.new('RID2', Time.now.to_i + 1),
|
28
|
+
Tinypass::AccessToken.new('RID3', Time.now.to_i + 1)
|
29
|
+
]
|
30
|
+
cookies = build_tinypass_cookie(tokens)
|
31
|
+
store.load_tokens_from_cookie(cookies)
|
32
|
+
|
33
|
+
expect(store.tokens.size).to eq 3
|
34
|
+
expect(store.get_access_token('RID1').access_granted?).to be_true
|
35
|
+
expect(store.get_access_token('RID2').access_granted?).to be_true
|
36
|
+
expect(store.get_access_token('RID3').access_granted?).to be_true
|
37
|
+
end
|
38
|
+
|
39
|
+
scenario 'all denied' do
|
40
|
+
tokens = [
|
41
|
+
Tinypass::AccessToken.new('RID1', Time.now.to_i - 1),
|
42
|
+
Tinypass::AccessToken.new('RID2', Time.now.to_i - 1),
|
43
|
+
Tinypass::AccessToken.new('RID3', Time.now.to_i - 1)
|
44
|
+
]
|
45
|
+
cookies = build_tinypass_cookie(tokens)
|
46
|
+
store.load_tokens_from_cookie(cookies)
|
47
|
+
|
48
|
+
expect(store.tokens.size).to eq 3
|
49
|
+
expect(store.get_access_token('RID1').access_granted?).to be_false
|
50
|
+
expect(store.get_access_token('RID2').access_granted?).to be_false
|
51
|
+
expect(store.get_access_token('RID3').access_granted?).to be_false
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
feature 'Combo Both Token Lists' do
|
4
|
+
let(:store) { Tinypass::AccessTokenStore.new }
|
5
|
+
|
6
|
+
scenario 'expired tokens are present' do
|
7
|
+
token_1 = Tinypass::AccessToken.new('RID1', Time.now.to_i - 1)
|
8
|
+
token_2 = Tinypass::AccessToken.new('RID2')
|
9
|
+
token_2.token_data[Tinypass::TokenData::METER_TYPE] = Tinypass::TokenData::METER_REMINDER
|
10
|
+
token_2.token_data[Tinypass::TokenData::METER_TRIAL_ENDTIME] = Time.now.to_i - 1
|
11
|
+
token_2.token_data[Tinypass::TokenData::METER_LOCKOUT_ENDTIME] = Time.now.to_i - 1
|
12
|
+
token_3 = Tinypass::AccessToken.new('RID3', Time.now.to_i - 30)
|
13
|
+
cookies = build_tinypass_cookie([token_1, token_2, token_3])
|
14
|
+
store.load_tokens_from_cookie(cookies)
|
15
|
+
|
16
|
+
expect(store.tokens.size).to eq 3
|
17
|
+
expect(store.get_access_token('RID1').access_granted?).to be_false
|
18
|
+
expect(store.get_access_token('RID2').access_granted?).to be_false
|
19
|
+
expect(store.get_access_token('RID3').access_granted?).to be_false
|
20
|
+
expect(store.get_access_token('RID2').trial_dead?).to be_true
|
21
|
+
end
|
22
|
+
|
23
|
+
scenario 'expired tokens are absent from meter store' do
|
24
|
+
# NOTE: this is ugly, because it was ported from code that used the now-gone MeterStore
|
25
|
+
|
26
|
+
token_1 = Tinypass::AccessToken.new('RID1', Time.now.to_i - 1)
|
27
|
+
token_2 = Tinypass::AccessToken.new('RID2')
|
28
|
+
token_2.token_data[Tinypass::TokenData::METER_TYPE] = Tinypass::TokenData::METER_REMINDER
|
29
|
+
token_2.token_data[Tinypass::TokenData::METER_TRIAL_ENDTIME] = Time.now.to_i - 1
|
30
|
+
token_2.token_data[Tinypass::TokenData::METER_LOCKOUT_ENDTIME] = Time.now.to_i - 1
|
31
|
+
token_3 = Tinypass::AccessToken.new('RID3', Time.now.to_i - 30)
|
32
|
+
cookies_1 = build_tinypass_cookie([token_1, token_2, token_3], 'RID1')
|
33
|
+
cookies_2 = build_tinypass_cookie([token_1, token_2, token_3], 'RID2')
|
34
|
+
cookies_3 = build_tinypass_cookie([token_1, token_2, token_3], 'RID3')
|
35
|
+
meter_1 = Tinypass::MeterHelper.load_meter_from_cookie('RID1', cookies_1)
|
36
|
+
meter_2 = Tinypass::MeterHelper.load_meter_from_cookie('RID2', cookies_2)
|
37
|
+
meter_3 = Tinypass::MeterHelper.load_meter_from_cookie('RID2', cookies_3)
|
38
|
+
|
39
|
+
expect(meter_1).to be_nil
|
40
|
+
expect(meter_2).to be_nil
|
41
|
+
expect(meter_3).to be_nil
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
feature 'Metered (reminder)' do
|
4
|
+
scenario 'trial period is active' do
|
5
|
+
token = Tinypass::AccessToken.new('RID1')
|
6
|
+
token.token_data[Tinypass::TokenData::METER_TYPE] = Tinypass::TokenData::METER_REMINDER
|
7
|
+
token.token_data[Tinypass::TokenData::METER_TRIAL_ENDTIME] = Time.now.to_i + 3
|
8
|
+
token.token_data[Tinypass::TokenData::METER_LOCKOUT_ENDTIME] = Time.now.to_i + 3
|
9
|
+
cookies = build_tinypass_cookie(token, 'RID1')
|
10
|
+
meter = Tinypass::MeterHelper.load_meter_from_cookie('RID1', cookies)
|
11
|
+
|
12
|
+
expect(meter.trial_period_active?).to be_true
|
13
|
+
expect(meter.lockout_period_active?).to be_false
|
14
|
+
expect(meter.trial_dead?).to be_false
|
15
|
+
expect(meter.meter_type).to eq Tinypass::TokenData::METER_REMINDER
|
16
|
+
end
|
17
|
+
|
18
|
+
scenario 'lock period is active' do
|
19
|
+
token = Tinypass::AccessToken.new('RID1')
|
20
|
+
token.token_data[Tinypass::TokenData::METER_TYPE] = Tinypass::TokenData::METER_REMINDER
|
21
|
+
token.token_data[Tinypass::TokenData::METER_TRIAL_ENDTIME] = Time.now.to_i - 3
|
22
|
+
token.token_data[Tinypass::TokenData::METER_LOCKOUT_ENDTIME] = Time.now.to_i + 3
|
23
|
+
cookies = build_tinypass_cookie(token, 'RID1')
|
24
|
+
meter = Tinypass::MeterHelper.load_meter_from_cookie('RID1', cookies)
|
25
|
+
|
26
|
+
expect(meter.trial_period_active?).to be_false
|
27
|
+
expect(meter.lockout_period_active?).to be_true
|
28
|
+
expect(meter.trial_dead?).to be_false
|
29
|
+
expect(meter.meter_type).to eq Tinypass::TokenData::METER_REMINDER
|
30
|
+
end
|
31
|
+
|
32
|
+
scenario 'meter is nil because expired' do
|
33
|
+
token = Tinypass::AccessToken.new('RID1')
|
34
|
+
token.token_data[Tinypass::TokenData::METER_TYPE] = Tinypass::TokenData::METER_REMINDER
|
35
|
+
token.token_data[Tinypass::TokenData::METER_TRIAL_ENDTIME] = Time.now.to_i - 3
|
36
|
+
token.token_data[Tinypass::TokenData::METER_LOCKOUT_ENDTIME] = Time.now.to_i - 3
|
37
|
+
cookies = build_tinypass_cookie(token, 'RID1')
|
38
|
+
meter = Tinypass::MeterHelper.load_meter_from_cookie('RID1', cookies)
|
39
|
+
|
40
|
+
expect(meter).to be_nil
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
feature 'Metered Access (strict)' do
|
4
|
+
let(:store) { Tinypass::AccessTokenStore.new }
|
5
|
+
|
6
|
+
scenario 'trial period is active' do
|
7
|
+
token = Tinypass::AccessToken.new('RID1')
|
8
|
+
token.token_data[Tinypass::TokenData::METER_TYPE] = Tinypass::TokenData::METER_STRICT
|
9
|
+
token.token_data[Tinypass::TokenData::METER_TRIAL_ENDTIME] = Time.now.to_i + 9
|
10
|
+
token.token_data[Tinypass::TokenData::METER_LOCKOUT_ENDTIME] = Time.now.to_i + 9
|
11
|
+
cookies = build_tinypass_cookie(token)
|
12
|
+
store.load_tokens_from_cookie(cookies)
|
13
|
+
retrieved_token = store.get_access_token('RID1')
|
14
|
+
|
15
|
+
expect(store.tokens.size).to eq 1
|
16
|
+
expect(retrieved_token.access_granted?).to be_true
|
17
|
+
expect(retrieved_token.trial_period_active?).to be_true
|
18
|
+
expect(retrieved_token.lockout_period_active?).to be_false
|
19
|
+
expect(retrieved_token.trial_dead?).to be_false
|
20
|
+
expect(retrieved_token.token_data[Tinypass::TokenData::METER_TYPE]).to eq Tinypass::TokenData::METER_STRICT
|
21
|
+
end
|
22
|
+
|
23
|
+
scenario 'lockout period is active' do
|
24
|
+
token = Tinypass::AccessToken.new('RID1')
|
25
|
+
token.token_data[Tinypass::TokenData::METER_TYPE] = Tinypass::TokenData::METER_STRICT
|
26
|
+
token.token_data[Tinypass::TokenData::METER_TRIAL_ENDTIME] = Time.now.to_i - 3
|
27
|
+
token.token_data[Tinypass::TokenData::METER_LOCKOUT_ENDTIME] = Time.now.to_i + 3
|
28
|
+
cookies = build_tinypass_cookie(token)
|
29
|
+
store.load_tokens_from_cookie(cookies)
|
30
|
+
retrieved_token = store.get_access_token('RID1')
|
31
|
+
|
32
|
+
expect(store.tokens.size).to eq 1
|
33
|
+
expect(retrieved_token.access_granted?).to be_false
|
34
|
+
expect(retrieved_token.trial_period_active?).to be_false
|
35
|
+
expect(retrieved_token.lockout_period_active?).to be_true
|
36
|
+
expect(retrieved_token.trial_dead?).to be_false
|
37
|
+
expect(retrieved_token.token_data[Tinypass::TokenData::METER_TYPE]).to eq Tinypass::TokenData::METER_STRICT
|
38
|
+
end
|
39
|
+
|
40
|
+
scenario 'expired tokens are present in store' do
|
41
|
+
token = Tinypass::AccessToken.new('RID1')
|
42
|
+
token.token_data[Tinypass::TokenData::METER_TYPE] = Tinypass::TokenData::METER_STRICT
|
43
|
+
token.token_data[Tinypass::TokenData::METER_TRIAL_ENDTIME] = Time.now.to_i - 3
|
44
|
+
token.token_data[Tinypass::TokenData::METER_LOCKOUT_ENDTIME] = Time.now.to_i - 3
|
45
|
+
token_2 = Tinypass::AccessToken.new('RID2')
|
46
|
+
token_2.token_data[Tinypass::TokenData::METER_TYPE] = Tinypass::TokenData::METER_STRICT
|
47
|
+
token_2.token_data[Tinypass::TokenData::METER_TRIAL_ENDTIME] = Time.now.to_i - 3
|
48
|
+
token_2.token_data[Tinypass::TokenData::METER_LOCKOUT_ENDTIME] = Time.now.to_i - 3
|
49
|
+
cookies = build_tinypass_cookie([token, token_2])
|
50
|
+
store.load_tokens_from_cookie(cookies)
|
51
|
+
|
52
|
+
expect(store.tokens.size).to eq 2
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
feature 'Metered (views)' do
|
4
|
+
scenario 'trial period is active' do
|
5
|
+
token = Tinypass::AccessToken.new('RID1')
|
6
|
+
token.token_data[Tinypass::TokenData::METER_TYPE] = Tinypass::TokenData::METER_REMINDER
|
7
|
+
token.token_data[Tinypass::TokenData::METER_TRIAL_MAX_ACCESS_ATTEMPTS] = 10
|
8
|
+
token.token_data[Tinypass::TokenData::METER_TRIAL_ACCESS_ATTEMPTS] = 9
|
9
|
+
token.token_data[Tinypass::TokenData::METER_TRIAL_ENDTIME] = Time.now.to_i + 20
|
10
|
+
token.token_data[Tinypass::TokenData::METER_LOCKOUT_ENDTIME] = Time.now.to_i + 20
|
11
|
+
cookies = build_tinypass_cookie(token, 'RID1')
|
12
|
+
meter = Tinypass::MeterHelper.load_meter_from_cookie('RID1', cookies)
|
13
|
+
|
14
|
+
expect(token.access_granted?).to be_true
|
15
|
+
expect(meter).not_to be_nil
|
16
|
+
expect(meter.trial_period_active?).to be_true
|
17
|
+
expect(meter.lockout_period_active?).to be_false
|
18
|
+
expect(meter.trial_dead?).to be_false
|
19
|
+
expect(meter.meter_type).to eq Tinypass::TokenData::METER_REMINDER
|
20
|
+
end
|
21
|
+
|
22
|
+
scenario 'lock period is active' do
|
23
|
+
token = Tinypass::AccessToken.new('RID1')
|
24
|
+
token.token_data[Tinypass::TokenData::METER_TYPE] = Tinypass::TokenData::METER_REMINDER
|
25
|
+
token.token_data[Tinypass::TokenData::METER_TRIAL_MAX_ACCESS_ATTEMPTS] = 10
|
26
|
+
token.token_data[Tinypass::TokenData::METER_TRIAL_ACCESS_ATTEMPTS] = 10
|
27
|
+
token.token_data[Tinypass::TokenData::METER_TRIAL_ENDTIME] = Time.now.to_i + 20
|
28
|
+
token.token_data[Tinypass::TokenData::METER_LOCKOUT_ENDTIME] = Time.now.to_i + 20
|
29
|
+
cookies = build_tinypass_cookie(token, 'RID1')
|
30
|
+
meter = Tinypass::MeterHelper.load_meter_from_cookie('RID1', cookies)
|
31
|
+
|
32
|
+
expect(token.access_granted?).to be_true
|
33
|
+
expect(meter).not_to be_nil
|
34
|
+
|
35
|
+
meter.increment
|
36
|
+
|
37
|
+
expect(meter.trial_period_active?).to be_false
|
38
|
+
expect(meter.lockout_period_active?).to be_true
|
39
|
+
expect(meter.trial_dead?).to be_false
|
40
|
+
expect(meter.meter_type).to eq Tinypass::TokenData::METER_REMINDER
|
41
|
+
end
|
42
|
+
|
43
|
+
scenario 'meter is nil because expired' do
|
44
|
+
token = Tinypass::AccessToken.new('RID1')
|
45
|
+
token.token_data[Tinypass::TokenData::METER_TYPE] = Tinypass::TokenData::METER_REMINDER
|
46
|
+
token.token_data[Tinypass::TokenData::METER_TRIAL_MAX_ACCESS_ATTEMPTS] = 10
|
47
|
+
token.token_data[Tinypass::TokenData::METER_TRIAL_ACCESS_ATTEMPTS] = 11
|
48
|
+
token.token_data[Tinypass::TokenData::METER_TRIAL_ENDTIME] = Time.now.to_i - 1
|
49
|
+
token.token_data[Tinypass::TokenData::METER_LOCKOUT_ENDTIME] = Time.now.to_i - 1
|
50
|
+
cookies = build_tinypass_cookie(token, 'RID1')
|
51
|
+
meter = Tinypass::MeterHelper.load_meter_from_cookie('RID1', cookies)
|
52
|
+
|
53
|
+
expect(meter).to be_nil
|
54
|
+
end
|
55
|
+
|
56
|
+
scenario 'expire time is set when count is exceeded' do
|
57
|
+
trial_end = Time.now.to_i + 20
|
58
|
+
token = Tinypass::AccessToken.new('RID1')
|
59
|
+
token.token_data[Tinypass::TokenData::METER_TYPE] = Tinypass::TokenData::METER_REMINDER
|
60
|
+
token.token_data[Tinypass::TokenData::METER_TRIAL_MAX_ACCESS_ATTEMPTS] = 4
|
61
|
+
token.token_data[Tinypass::TokenData::METER_TRIAL_ACCESS_ATTEMPTS] = 0
|
62
|
+
token.token_data[Tinypass::TokenData::METER_TRIAL_ENDTIME] = trial_end
|
63
|
+
token.token_data[Tinypass::TokenData::METER_LOCKOUT_ENDTIME] = trial_end
|
64
|
+
cookies = build_tinypass_cookie(token, 'RID1')
|
65
|
+
meter = Tinypass::MeterHelper.load_meter_from_cookie('RID1', cookies)
|
66
|
+
|
67
|
+
expect(meter.trial_view_count).to eq 0
|
68
|
+
|
69
|
+
expect(meter.increment).to eq 1
|
70
|
+
expect(meter.trial_view_count).to eq 1
|
71
|
+
expect(meter.lockout_end_time_secs).to eq trial_end
|
72
|
+
|
73
|
+
expect(meter.increment).to eq 2
|
74
|
+
expect(meter.trial_view_count).to eq 2
|
75
|
+
expect(meter.lockout_end_time_secs).to eq trial_end
|
76
|
+
|
77
|
+
expect(meter.increment).to eq 3
|
78
|
+
expect(meter.trial_view_count).to eq 3
|
79
|
+
expect(meter.lockout_end_time_secs).to eq trial_end
|
80
|
+
|
81
|
+
expect(meter.increment).to eq 4
|
82
|
+
expect(meter.trial_view_count).to eq 4
|
83
|
+
expect(meter.lockout_end_time_secs).to eq trial_end
|
84
|
+
|
85
|
+
# should kick off the lockout period
|
86
|
+
expect(meter.increment).to eq 5
|
87
|
+
expect(meter.trial_view_count).to eq 5
|
88
|
+
expect(meter.trial_period_active?).to be_false
|
89
|
+
expect(meter.lockout_period_active?).to be_true
|
90
|
+
expect(meter.lockout_end_time_secs).to eq trial_end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Client: Build and Parse" do
|
4
|
+
context "no IP exists" do
|
5
|
+
it "can build and parse consistently" do
|
6
|
+
list = Tinypass::AccessTokenList.new
|
7
|
+
list << Tinypass::AccessToken.new('RID1')
|
8
|
+
list << Tinypass::AccessToken.new('RID2')
|
9
|
+
|
10
|
+
builder = Tinypass::ClientBuilder.new
|
11
|
+
parser = Tinypass::ClientParser.new
|
12
|
+
|
13
|
+
out = builder.build_access_tokens(list)
|
14
|
+
parsed = parser.parse_access_tokens(out)
|
15
|
+
|
16
|
+
parsed.each do |token|
|
17
|
+
expect(token.token_data.values).to eq list[token.token_data.rid].token_data.values
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
if ENV['COVERAGE']
|
2
|
+
require 'simplecov'
|
3
|
+
SimpleCov.start
|
4
|
+
end
|
5
|
+
|
6
|
+
#require 'bundler/setup'
|
7
|
+
|
8
|
+
require 'tinypass'
|
9
|
+
require 'nokogiri'
|
10
|
+
require 'pry'
|
11
|
+
require 'webmock/rspec'
|
12
|
+
|
13
|
+
Dir["spec/support/**/*.rb"].each { |f| load f }
|
14
|
+
|
15
|
+
RSpec.configure do |config|
|
16
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
17
|
+
config.run_all_when_everything_filtered = true
|
18
|
+
config.filter_run :focus
|
19
|
+
|
20
|
+
# Run specs in random order to surface order dependencies. If you find an
|
21
|
+
# order dependency and want to debug it, you can fix the order by providing
|
22
|
+
# the seed, which is printed after each run.
|
23
|
+
# --seed 1234
|
24
|
+
config.order = 'random'
|
25
|
+
|
26
|
+
config.include TinypassFactories
|
27
|
+
|
28
|
+
config.before(:each) do
|
29
|
+
Tinypass.sandbox = true
|
30
|
+
Tinypass.aid = "TEST_AID"
|
31
|
+
Tinypass.private_key = "thestringliteralisexactlyfortych"
|
32
|
+
end
|
33
|
+
end
|
Binary file
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'capybara/rspec'
|
2
|
+
require 'capybara/poltergeist'
|
3
|
+
require 'rack/file'
|
4
|
+
require 'dotenv'
|
5
|
+
|
6
|
+
Capybara.app = Rack::File.new('tmp')
|
7
|
+
Capybara.javascript_driver = :poltergeist
|
8
|
+
|
9
|
+
RSpec.configure do |config|
|
10
|
+
config.include Capybara::DSL
|
11
|
+
end
|
12
|
+
|
13
|
+
Dotenv.load
|