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.
Files changed (85) hide show
  1. checksums.yaml +15 -0
  2. data/.DS_Store +0 -0
  3. data/.gitignore +20 -0
  4. data/.rspec +2 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +32 -0
  8. data/Rakefile +19 -0
  9. data/lib/.DS_Store +0 -0
  10. data/lib/tinypass.rb +48 -0
  11. data/lib/tinypass/.DS_Store +0 -0
  12. data/lib/tinypass/builder.rb +7 -0
  13. data/lib/tinypass/builder/client_builder.rb +40 -0
  14. data/lib/tinypass/builder/client_parser.rb +48 -0
  15. data/lib/tinypass/builder/cookie_parser.rb +25 -0
  16. data/lib/tinypass/builder/json_msg_builder.rb +115 -0
  17. data/lib/tinypass/builder/open_encoder.rb +11 -0
  18. data/lib/tinypass/builder/secure_encoder.rb +15 -0
  19. data/lib/tinypass/builder/security_utils.rb +67 -0
  20. data/lib/tinypass/gateway.rb +104 -0
  21. data/lib/tinypass/offer.rb +23 -0
  22. data/lib/tinypass/policies.rb +5 -0
  23. data/lib/tinypass/policies/discount_policy.rb +25 -0
  24. data/lib/tinypass/policies/policy.rb +25 -0
  25. data/lib/tinypass/policies/pricing_policy.rb +13 -0
  26. data/lib/tinypass/policies/restriction_policy.rb +14 -0
  27. data/lib/tinypass/price_option.rb +66 -0
  28. data/lib/tinypass/resource.rb +17 -0
  29. data/lib/tinypass/token.rb +6 -0
  30. data/lib/tinypass/token/access_token.rb +163 -0
  31. data/lib/tinypass/token/access_token_list.rb +71 -0
  32. data/lib/tinypass/token/access_token_store.rb +59 -0
  33. data/lib/tinypass/token/meter.rb +76 -0
  34. data/lib/tinypass/token/meter_helper.rb +82 -0
  35. data/lib/tinypass/token/token_data.rb +72 -0
  36. data/lib/tinypass/ui.rb +2 -0
  37. data/lib/tinypass/ui/html_widget.rb +29 -0
  38. data/lib/tinypass/ui/purchase_request.rb +34 -0
  39. data/lib/tinypass/utils.rb +34 -0
  40. data/lib/tinypass/version.rb +3 -0
  41. data/spec/.DS_Store +0 -0
  42. data/spec/acceptance/basic_workflow_spec.rb +81 -0
  43. data/spec/integration/.DS_Store +0 -0
  44. data/spec/integration/cases/.DS_Store +0 -0
  45. data/spec/integration/cases/basic_spec.rb +53 -0
  46. data/spec/integration/cases/combo_spec.rb +43 -0
  47. data/spec/integration/cases/metered_reminder_spec.rb +42 -0
  48. data/spec/integration/cases/metered_strict_spec.rb +54 -0
  49. data/spec/integration/cases/metered_views_spec.rb +92 -0
  50. data/spec/integration/client_builder_and_parser_spec.rb +21 -0
  51. data/spec/spec_helper.rb +33 -0
  52. data/spec/support/.DS_Store +0 -0
  53. data/spec/support/acceptance.rb +13 -0
  54. data/spec/support/tinypass_factories.rb +25 -0
  55. data/spec/unit/.DS_Store +0 -0
  56. data/spec/unit/builder/.DS_Store +0 -0
  57. data/spec/unit/builder/client_builder_spec.rb +23 -0
  58. data/spec/unit/builder/client_parser_spec.rb +27 -0
  59. data/spec/unit/builder/cookie_parser_spec.rb +39 -0
  60. data/spec/unit/builder/json_msg_builder_spec.rb +73 -0
  61. data/spec/unit/builder/open_encoder_spec.rb +15 -0
  62. data/spec/unit/builder/secure_encoder_spec.rb +23 -0
  63. data/spec/unit/builder/security_utils_spec.rb +42 -0
  64. data/spec/unit/gateway_spec.rb +80 -0
  65. data/spec/unit/offer_spec.rb +31 -0
  66. data/spec/unit/policies/.DS_Store +0 -0
  67. data/spec/unit/policies/discount_policy_spec.rb +40 -0
  68. data/spec/unit/policies/pricing_policy_spec.rb +23 -0
  69. data/spec/unit/policies/restriction_policy_spec.rb +35 -0
  70. data/spec/unit/price_option_spec.rb +109 -0
  71. data/spec/unit/resource_spec.rb +24 -0
  72. data/spec/unit/tinypass_spec.rb +51 -0
  73. data/spec/unit/token/.DS_Store +0 -0
  74. data/spec/unit/token/access_token_list_spec.rb +94 -0
  75. data/spec/unit/token/access_token_spec.rb +267 -0
  76. data/spec/unit/token/access_token_store_spec.rb +93 -0
  77. data/spec/unit/token/meter_helper_spec.rb +103 -0
  78. data/spec/unit/token/meter_spec.rb +66 -0
  79. data/spec/unit/token/token_data_spec.rb +66 -0
  80. data/spec/unit/ui/.DS_Store +0 -0
  81. data/spec/unit/ui/html_widget_spec.rb +89 -0
  82. data/spec/unit/ui/purchase_request_spec.rb +46 -0
  83. data/spec/unit/utils_spec.rb +57 -0
  84. data/tinypass.gemspec +35 -0
  85. metadata +330 -0
@@ -0,0 +1,3 @@
1
+ module Tinypass
2
+ VERSION = "0.0.1"
3
+ end
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
@@ -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
@@ -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