candy_check 0.4.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/build.yml +35 -0
- data/.rubocop.yml +10 -0
- data/.ruby-version +1 -1
- data/Gemfile +1 -1
- data/Guardfile +5 -3
- data/README.md +2 -2
- data/Rakefile +5 -5
- data/candy_check.gemspec +14 -12
- data/lib/candy_check/app_store/client.rb +7 -7
- data/lib/candy_check/app_store/config.rb +7 -9
- data/lib/candy_check/app_store/receipt.rb +16 -16
- data/lib/candy_check/app_store/receipt_collection.rb +2 -2
- data/lib/candy_check/app_store/subscription_verification.rb +5 -5
- data/lib/candy_check/app_store/verification.rb +3 -3
- data/lib/candy_check/app_store/verification_failure.rb +25 -21
- data/lib/candy_check/app_store/verifier.rb +4 -5
- data/lib/candy_check/app_store.rb +8 -8
- data/lib/candy_check/cli/app.rb +3 -3
- data/lib/candy_check/cli/commands/app_store.rb +1 -1
- data/lib/candy_check/cli/commands.rb +4 -4
- data/lib/candy_check/cli/out.rb +1 -3
- data/lib/candy_check/cli.rb +3 -3
- data/lib/candy_check/play_store/product_acknowledgements/acknowledgement.rb +2 -1
- data/lib/candy_check/play_store/product_purchases/product_purchase.rb +3 -3
- data/lib/candy_check/play_store/product_purchases/product_verification.rb +1 -1
- data/lib/candy_check/play_store/subscription_purchases/subscription_purchase.rb +2 -1
- data/lib/candy_check/play_store/subscription_purchases/subscription_verification.rb +1 -0
- data/lib/candy_check/play_store/verification_failure.rb +2 -2
- data/lib/candy_check/play_store.rb +2 -1
- data/lib/candy_check/utils/attribute_reader.rb +3 -2
- data/lib/candy_check/utils/config.rb +2 -0
- data/lib/candy_check/utils.rb +2 -2
- data/lib/candy_check/version.rb +1 -1
- data/lib/candy_check.rb +4 -4
- data/spec/app_store/client_spec.rb +18 -18
- data/spec/app_store/config_spec.rb +9 -9
- data/spec/app_store/receipt_collection_spec.rb +39 -41
- data/spec/app_store/receipt_spec.rb +47 -47
- data/spec/app_store/subscription_verification_spec.rb +35 -32
- data/spec/app_store/verifcation_failure_spec.rb +7 -7
- data/spec/app_store/verification_spec.rb +23 -11
- data/spec/app_store/verifier_spec.rb +40 -48
- data/spec/cli/app_spec.rb +11 -13
- data/spec/cli/commands/app_store_spec.rb +22 -23
- data/spec/cli/commands/play_store_spec.rb +3 -1
- data/spec/cli/commands/version_spec.rb +2 -2
- data/spec/cli/out_spec.rb +9 -9
- data/spec/fixtures/vcr_cassettes/play_store/product_acknowledgements/acknowledged.yml +1 -1
- data/spec/fixtures/vcr_cassettes/play_store/product_acknowledgements/already_acknowledged.yml +1 -1
- data/spec/fixtures/vcr_cassettes/play_store/product_acknowledgements/refunded.yml +1 -1
- data/spec/fixtures/vcr_cassettes/play_store/product_purchases/permission_denied.yml +2 -2
- data/spec/fixtures/vcr_cassettes/play_store/product_purchases/response_with_empty_body.yml +2 -2
- data/spec/fixtures/vcr_cassettes/play_store/product_purchases/valid_but_not_consumed.yml +1 -1
- data/spec/fixtures/vcr_cassettes/play_store/subscription_purchases/permission_denied.yml +2 -2
- data/spec/fixtures/vcr_cassettes/play_store/subscription_purchases/valid_but_expired.yml +1 -1
- data/spec/play_store/acknowledger_spec.rb +4 -0
- data/spec/play_store/product_acknowledgements/acknowledgement_spec.rb +4 -0
- data/spec/play_store/product_acknowledgements/response_spec.rb +16 -15
- data/spec/play_store/product_purchases/product_purchase_spec.rb +6 -27
- data/spec/play_store/subscription_purchases/subscription_purchase_spec.rb +22 -46
- data/spec/play_store/verification_failure_spec.rb +6 -4
- data/spec/play_store/verifier_spec.rb +4 -2
- data/spec/spec_helper.rb +20 -9
- metadata +91 -63
- data/.travis.yml +0 -18
@@ -55,7 +55,7 @@ http_interactions:
|
|
55
55
|
recorded_at: Fri, 04 Oct 2019 13:11:23 GMT
|
56
56
|
- request:
|
57
57
|
method: get
|
58
|
-
uri: https://
|
58
|
+
uri: https://androidpublisher.googleapis.com/androidpublisher/v3/applications/my_package_name/purchases/products/my_product_id/tokens/my_token
|
59
59
|
body:
|
60
60
|
encoding: UTF-8
|
61
61
|
string: ''
|
@@ -125,7 +125,7 @@ http_interactions:
|
|
125
125
|
recorded_at: Fri, 04 Oct 2019 13:11:24 GMT
|
126
126
|
- request:
|
127
127
|
method: get
|
128
|
-
uri: https://
|
128
|
+
uri: https://androidpublisher.googleapis.com/androidpublisher/v3/applications/my_package_name/purchases/products/my_product_id/tokens/my_token
|
129
129
|
body:
|
130
130
|
encoding: UTF-8
|
131
131
|
string: ''
|
@@ -55,7 +55,7 @@ http_interactions:
|
|
55
55
|
recorded_at: Fri, 04 Oct 2019 13:11:23 GMT
|
56
56
|
- request:
|
57
57
|
method: get
|
58
|
-
uri: https://
|
58
|
+
uri: https://androidpublisher.googleapis.com/androidpublisher/v3/applications/my_package_name/purchases/products/my_product_id/tokens/my_token
|
59
59
|
body:
|
60
60
|
encoding: UTF-8
|
61
61
|
string: ''
|
@@ -125,7 +125,7 @@ http_interactions:
|
|
125
125
|
recorded_at: Fri, 04 Oct 2019 13:11:24 GMT
|
126
126
|
- request:
|
127
127
|
method: get
|
128
|
-
uri: https://
|
128
|
+
uri: https://androidpublisher.googleapis.com/androidpublisher/v3/applications/my_package_name/purchases/products/my_product_id/tokens/my_token
|
129
129
|
body:
|
130
130
|
encoding: UTF-8
|
131
131
|
string: ''
|
@@ -55,7 +55,7 @@ http_interactions:
|
|
55
55
|
recorded_at: Fri, 04 Oct 2019 09:25:53 GMT
|
56
56
|
- request:
|
57
57
|
method: get
|
58
|
-
uri: https://
|
58
|
+
uri: https://androidpublisher.googleapis.com/androidpublisher/v3/applications/my_package_name/purchases/products/my_product_id/tokens/my_token
|
59
59
|
body:
|
60
60
|
encoding: UTF-8
|
61
61
|
string: ''
|
@@ -55,7 +55,7 @@ http_interactions:
|
|
55
55
|
recorded_at: Thu, 10 Oct 2019 14:07:52 GMT
|
56
56
|
- request:
|
57
57
|
method: get
|
58
|
-
uri: https://
|
58
|
+
uri: https://androidpublisher.googleapis.com/androidpublisher/v3/applications/my_package_name/purchases/subscriptions/my_subscription_id/tokens/my_token
|
59
59
|
body:
|
60
60
|
encoding: UTF-8
|
61
61
|
string: ''
|
@@ -125,7 +125,7 @@ http_interactions:
|
|
125
125
|
recorded_at: Thu, 10 Oct 2019 14:07:52 GMT
|
126
126
|
- request:
|
127
127
|
method: get
|
128
|
-
uri: https://
|
128
|
+
uri: https://androidpublisher.googleapis.com/androidpublisher/v3/applications/my_package_name/purchases/subscriptions/my_subscription_id/tokens/my_token
|
129
129
|
body:
|
130
130
|
encoding: UTF-8
|
131
131
|
string: ''
|
@@ -55,7 +55,7 @@ http_interactions:
|
|
55
55
|
recorded_at: Thu, 24 Oct 2019 10:43:13 GMT
|
56
56
|
- request:
|
57
57
|
method: get
|
58
|
-
uri: https://
|
58
|
+
uri: https://androidpublisher.googleapis.com/androidpublisher/v3/applications/my_package_name/purchases/subscriptions/my_subscription_id/tokens/my_token
|
59
59
|
body:
|
60
60
|
encoding: UTF-8
|
61
61
|
string: ''
|
@@ -21,7 +21,9 @@ describe CandyCheck::PlayStore::Acknowledger do
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
it "when already acknowledged" do
|
24
|
+
# rubocop:disable Layout/LineLength
|
24
25
|
error_body = "{\n \"error\": {\n \"code\": 400,\n \"message\": \"The purchase is not in a valid state to perform the desired operation.\",\n \"errors\": [\n {\n \"message\": \"The purchase is not in a valid state to perform the desired operation.\",\n \"domain\": \"androidpublisher\",\n \"reason\": \"invalidPurchaseState\",\n \"location\": \"token\",\n \"locationType\": \"parameter\"\n }\n ]\n }\n}\n"
|
26
|
+
# rubocop:enable Layout/LineLength
|
25
27
|
|
26
28
|
VCR.use_cassette("play_store/product_acknowledgements/already_acknowledged") do
|
27
29
|
result = subject.acknowledge_product_purchase(package_name: package_name, product_id: product_id, token: token)
|
@@ -33,7 +35,9 @@ describe CandyCheck::PlayStore::Acknowledger do
|
|
33
35
|
end
|
34
36
|
end
|
35
37
|
it "when it has been refunded" do
|
38
|
+
# rubocop:disable Layout/LineLength
|
36
39
|
error_body = "{\n \"error\": {\n \"code\": 400,\n \"message\": \"The product purchase is not owned by the user.\",\n \"errors\": [\n {\n \"message\": \"The product purchase is not owned by the user.\",\n \"domain\": \"androidpublisher\",\n \"reason\": \"productNotOwnedByUser\"\n }\n ]\n }\n}\n"
|
40
|
+
# rubocop:enable Layout/LineLength
|
37
41
|
|
38
42
|
VCR.use_cassette("play_store/product_acknowledgements/refunded") do
|
39
43
|
result = subject.acknowledge_product_purchase(package_name: package_name, product_id: product_id, token: token)
|
@@ -27,7 +27,9 @@ describe CandyCheck::PlayStore::ProductAcknowledgements::Acknowledgement do
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
it "when already acknowledged" do
|
30
|
+
# rubocop:disable Layout/LineLength
|
30
31
|
error_body = "{\n \"error\": {\n \"code\": 400,\n \"message\": \"The purchase is not in a valid state to perform the desired operation.\",\n \"errors\": [\n {\n \"message\": \"The purchase is not in a valid state to perform the desired operation.\",\n \"domain\": \"androidpublisher\",\n \"reason\": \"invalidPurchaseState\",\n \"location\": \"token\",\n \"locationType\": \"parameter\"\n }\n ]\n }\n}\n"
|
32
|
+
# rubocop:enable Layout/LineLength
|
31
33
|
|
32
34
|
VCR.use_cassette("play_store/product_acknowledgements/already_acknowledged") do
|
33
35
|
result = subject.call!
|
@@ -39,7 +41,9 @@ describe CandyCheck::PlayStore::ProductAcknowledgements::Acknowledgement do
|
|
39
41
|
end
|
40
42
|
end
|
41
43
|
it "when it has been refunded" do
|
44
|
+
# rubocop:disable Layout/LineLength
|
42
45
|
error_body = "{\n \"error\": {\n \"code\": 400,\n \"message\": \"The product purchase is not owned by the user.\",\n \"errors\": [\n {\n \"message\": \"The product purchase is not owned by the user.\",\n \"domain\": \"androidpublisher\",\n \"reason\": \"productNotOwnedByUser\"\n }\n ]\n }\n}\n"
|
46
|
+
# rubocop:enable Layout/LineLength
|
43
47
|
|
44
48
|
VCR.use_cassette("play_store/product_acknowledgements/refunded") do
|
45
49
|
result = subject.call!
|
@@ -5,23 +5,23 @@ describe CandyCheck::PlayStore::ProductAcknowledgements::Response do
|
|
5
5
|
CandyCheck::PlayStore::ProductAcknowledgements::Response.new(result: result, error_data: error_data)
|
6
6
|
end
|
7
7
|
|
8
|
-
describe
|
9
|
-
context
|
10
|
-
let(:result) {
|
8
|
+
describe "#acknowledged?" do
|
9
|
+
context "when result present" do
|
10
|
+
let(:result) { "" }
|
11
11
|
let(:error_data) { nil }
|
12
12
|
|
13
|
-
it
|
13
|
+
it "returns true" do
|
14
14
|
result = subject.acknowledged?
|
15
15
|
|
16
16
|
_(result).must_be_true
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
-
context
|
20
|
+
context "when result is not present" do
|
21
21
|
let(:result) { nil }
|
22
|
-
let(:error_data)
|
22
|
+
let(:error_data) { nil }
|
23
23
|
|
24
|
-
it
|
24
|
+
it "returns false" do
|
25
25
|
result = subject.acknowledged?
|
26
26
|
|
27
27
|
_(result).must_be_false
|
@@ -29,34 +29,35 @@ describe CandyCheck::PlayStore::ProductAcknowledgements::Response do
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
describe
|
33
|
-
context
|
32
|
+
describe "#error" do
|
33
|
+
context "when error present" do
|
34
34
|
let(:result) { nil }
|
35
35
|
let(:error_data) do
|
36
36
|
Module.new do
|
37
37
|
def status_code
|
38
38
|
400
|
39
39
|
end
|
40
|
+
|
40
41
|
def body
|
41
|
-
|
42
|
+
"A String describing the issue"
|
42
43
|
end
|
43
44
|
module_function :status_code, :body
|
44
45
|
end
|
45
46
|
end
|
46
47
|
|
47
|
-
it
|
48
|
+
it "returns the expected data" do
|
48
49
|
result = subject.error
|
49
50
|
|
50
51
|
_(result[:status_code]).must_equal(400)
|
51
|
-
_(result[:body]).must_equal(
|
52
|
+
_(result[:body]).must_equal("A String describing the issue")
|
52
53
|
end
|
53
54
|
end
|
54
55
|
|
55
|
-
context
|
56
|
-
let(:result) {
|
56
|
+
context "when error is not present" do
|
57
|
+
let(:result) { "" }
|
57
58
|
let(:error_data) { nil }
|
58
59
|
|
59
|
-
it
|
60
|
+
it "returns false" do
|
60
61
|
result = subject.error
|
61
62
|
|
62
63
|
_(result).must_be_nil
|
@@ -5,13 +5,13 @@ describe CandyCheck::PlayStore::ProductPurchases::ProductPurchase do
|
|
5
5
|
|
6
6
|
describe "valid and non-consumed product" do
|
7
7
|
let(:fake_product_purchase) do
|
8
|
-
|
8
|
+
OpenStruct.new(
|
9
9
|
consumption_state: 0,
|
10
10
|
developer_payload: "payload that gets stored and returned",
|
11
11
|
kind: "androidpublisher#productPurchase",
|
12
12
|
order_id: "ABC123",
|
13
13
|
purchase_state: 0,
|
14
|
-
purchase_time_millis:
|
14
|
+
purchase_time_millis: 1_421_676_237_413,
|
15
15
|
)
|
16
16
|
end
|
17
17
|
|
@@ -51,13 +51,13 @@ describe CandyCheck::PlayStore::ProductPurchases::ProductPurchase do
|
|
51
51
|
|
52
52
|
describe "valid and consumed product" do
|
53
53
|
let(:fake_product_purchase) do
|
54
|
-
|
54
|
+
OpenStruct.new(
|
55
55
|
consumption_state: 1,
|
56
56
|
developer_payload: "payload that gets stored and returned",
|
57
57
|
kind: "androidpublisher#productPurchase",
|
58
58
|
order_id: "ABC123",
|
59
59
|
purchase_state: 0,
|
60
|
-
purchase_time_millis:
|
60
|
+
purchase_time_millis: 1_421_676_237_413,
|
61
61
|
)
|
62
62
|
end
|
63
63
|
|
@@ -72,13 +72,13 @@ describe CandyCheck::PlayStore::ProductPurchases::ProductPurchase do
|
|
72
72
|
|
73
73
|
describe "non-valid product" do
|
74
74
|
let(:fake_product_purchase) do
|
75
|
-
|
75
|
+
OpenStruct.new(
|
76
76
|
consumption_state: 0,
|
77
77
|
developer_payload: "payload that gets stored and returned",
|
78
78
|
kind: "androidpublisher#productPurchase",
|
79
79
|
order_id: "ABC123",
|
80
80
|
purchase_state: 1,
|
81
|
-
purchase_time_millis:
|
81
|
+
purchase_time_millis: 1_421_676_237_413,
|
82
82
|
)
|
83
83
|
end
|
84
84
|
|
@@ -86,25 +86,4 @@ describe CandyCheck::PlayStore::ProductPurchases::ProductPurchase do
|
|
86
86
|
_(subject.valid?).must_be_false
|
87
87
|
end
|
88
88
|
end
|
89
|
-
|
90
|
-
private
|
91
|
-
|
92
|
-
class FakeProductPurchase
|
93
|
-
FIELDS = [
|
94
|
-
:consumption_state,
|
95
|
-
:developer_payload,
|
96
|
-
:kind,
|
97
|
-
:order_id,
|
98
|
-
:purchase_state,
|
99
|
-
:purchase_time_millis,
|
100
|
-
].freeze
|
101
|
-
|
102
|
-
attr_accessor *FIELDS
|
103
|
-
|
104
|
-
def initialize(hash)
|
105
|
-
FIELDS.each do |key|
|
106
|
-
self.public_send("#{key}=", hash[key])
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
89
|
end
|
@@ -5,10 +5,10 @@ describe CandyCheck::PlayStore::SubscriptionPurchases::SubscriptionPurchase do
|
|
5
5
|
|
6
6
|
describe "expired and canceled subscription" do
|
7
7
|
let(:fake_subscription_purchase) do
|
8
|
-
|
8
|
+
OpenStruct.new(
|
9
9
|
kind: "androidpublisher#subscriptionPurchase",
|
10
|
-
start_time_millis:
|
11
|
-
expiry_time_millis:
|
10
|
+
start_time_millis: 1_459_540_113_244,
|
11
|
+
expiry_time_millis: 1_462_132_088_610,
|
12
12
|
auto_renewing: false,
|
13
13
|
developer_payload: "payload that gets stored and returned",
|
14
14
|
cancel_reason: 0,
|
@@ -66,10 +66,11 @@ describe CandyCheck::PlayStore::SubscriptionPurchases::SubscriptionPurchase do
|
|
66
66
|
|
67
67
|
describe "unexpired and renewing subscription" do
|
68
68
|
two_days_from_now = DateTime.now + 2
|
69
|
+
|
69
70
|
let(:fake_subscription_purchase) do
|
70
|
-
|
71
|
+
OpenStruct.new(
|
71
72
|
kind: "androidpublisher#subscriptionPurchase",
|
72
|
-
start_time_millis:
|
73
|
+
start_time_millis: 1_459_540_113_244,
|
73
74
|
expiry_time_millis: (two_days_from_now.to_time.to_i * 1000),
|
74
75
|
auto_renewing: true,
|
75
76
|
developer_payload: "payload that gets stored and returned",
|
@@ -89,10 +90,10 @@ describe CandyCheck::PlayStore::SubscriptionPurchases::SubscriptionPurchase do
|
|
89
90
|
|
90
91
|
describe "expired due to payment failure" do
|
91
92
|
let(:fake_subscription_purchase) do
|
92
|
-
|
93
|
+
OpenStruct.new(
|
93
94
|
kind: "androidpublisher#subscriptionPurchase",
|
94
|
-
start_time_millis:
|
95
|
-
expiry_time_millis:
|
95
|
+
start_time_millis: 1_459_540_113_244,
|
96
|
+
expiry_time_millis: 1_462_132_088_610,
|
96
97
|
auto_renewing: true,
|
97
98
|
developer_payload: "payload that gets stored and returned",
|
98
99
|
cancel_reason: 1,
|
@@ -112,10 +113,10 @@ describe CandyCheck::PlayStore::SubscriptionPurchases::SubscriptionPurchase do
|
|
112
113
|
describe "subscription cancelation by user" do
|
113
114
|
describe "when subscription is not canceled" do
|
114
115
|
let(:fake_subscription_purchase) do
|
115
|
-
|
116
|
+
OpenStruct.new(
|
116
117
|
kind: "androidpublisher#subscriptionPurchase",
|
117
|
-
start_time_millis:
|
118
|
-
expiry_time_millis:
|
118
|
+
start_time_millis: 1_459_540_113_244,
|
119
|
+
expiry_time_millis: 1_462_132_088_610,
|
119
120
|
auto_renewing: true,
|
120
121
|
developer_payload: "payload that gets stored and returned",
|
121
122
|
payment_state: 1,
|
@@ -137,11 +138,11 @@ describe CandyCheck::PlayStore::SubscriptionPurchases::SubscriptionPurchase do
|
|
137
138
|
|
138
139
|
describe "when subscription is canceled" do
|
139
140
|
let(:fake_subscription_purchase) do
|
140
|
-
|
141
|
+
OpenStruct.new(
|
141
142
|
kind: "androidpublisher#subscriptionPurchase",
|
142
|
-
start_time_millis:
|
143
|
-
expiry_time_millis:
|
144
|
-
user_cancellation_time_millis:
|
143
|
+
start_time_millis: 1_459_540_113_244,
|
144
|
+
expiry_time_millis: 1_462_132_088_610,
|
145
|
+
user_cancellation_time_millis: 1_461_872_888_000,
|
145
146
|
auto_renewing: true,
|
146
147
|
developer_payload: "payload that gets stored and returned",
|
147
148
|
cancel_reason: 0,
|
@@ -166,10 +167,10 @@ describe CandyCheck::PlayStore::SubscriptionPurchases::SubscriptionPurchase do
|
|
166
167
|
|
167
168
|
describe "expired with pending payment" do
|
168
169
|
let(:fake_subscription_purchase) do
|
169
|
-
|
170
|
+
OpenStruct.new(
|
170
171
|
kind: "androidpublisher#subscriptionPurchase",
|
171
|
-
start_time_millis:
|
172
|
-
expiry_time_millis:
|
172
|
+
start_time_millis: 1_459_540_113_244,
|
173
|
+
expiry_time_millis: 1_462_132_088_610,
|
173
174
|
auto_renewing: true,
|
174
175
|
developer_payload: "payload that gets stored and returned",
|
175
176
|
cancel_reason: 0,
|
@@ -188,10 +189,10 @@ describe CandyCheck::PlayStore::SubscriptionPurchases::SubscriptionPurchase do
|
|
188
189
|
|
189
190
|
describe "trial" do
|
190
191
|
let(:fake_subscription_purchase) do
|
191
|
-
|
192
|
+
OpenStruct.new(
|
192
193
|
kind: "androidpublisher#subscriptionPurchase",
|
193
|
-
start_time_millis:
|
194
|
-
expiry_time_millis:
|
194
|
+
start_time_millis: 1_459_540_113_244,
|
195
|
+
expiry_time_millis: 1_462_132_088_610,
|
195
196
|
auto_renewing: false,
|
196
197
|
developer_payload: "payload that gets stored and returned",
|
197
198
|
cancel_reason: 0,
|
@@ -209,29 +210,4 @@ describe CandyCheck::PlayStore::SubscriptionPurchases::SubscriptionPurchase do
|
|
209
210
|
_(subject.price_currency_code).must_equal "SOMECODE"
|
210
211
|
end
|
211
212
|
end
|
212
|
-
|
213
|
-
private
|
214
|
-
|
215
|
-
class FakeSubscriptionPurchase
|
216
|
-
FIELDS = [
|
217
|
-
:kind,
|
218
|
-
:start_time_millis,
|
219
|
-
:expiry_time_millis,
|
220
|
-
:user_cancellation_time_millis,
|
221
|
-
:auto_renewing,
|
222
|
-
:developer_payload,
|
223
|
-
:cancel_reason,
|
224
|
-
:payment_state,
|
225
|
-
:price_amount_micros,
|
226
|
-
:price_currency_code,
|
227
|
-
].freeze
|
228
|
-
|
229
|
-
attr_accessor *FIELDS
|
230
|
-
|
231
|
-
def initialize(hash)
|
232
|
-
FIELDS.each do |key|
|
233
|
-
self.public_send("#{key}=", hash[key])
|
234
|
-
end
|
235
|
-
end
|
236
|
-
end
|
237
213
|
end
|
@@ -3,9 +3,13 @@ require "spec_helper"
|
|
3
3
|
describe CandyCheck::PlayStore::VerificationFailure do
|
4
4
|
subject { CandyCheck::PlayStore::VerificationFailure.new(fake_error) }
|
5
5
|
|
6
|
+
let(:fake_error_class) do
|
7
|
+
Struct.new(:status_code, :message)
|
8
|
+
end
|
9
|
+
|
6
10
|
describe "denied" do
|
7
11
|
let(:fake_error) do
|
8
|
-
|
12
|
+
fake_error_class.new("401", "The current user has insufficient permissions")
|
9
13
|
end
|
10
14
|
|
11
15
|
it "returns the code" do
|
@@ -19,7 +23,7 @@ describe CandyCheck::PlayStore::VerificationFailure do
|
|
19
23
|
|
20
24
|
describe "empty" do
|
21
25
|
let(:fake_error) do
|
22
|
-
|
26
|
+
fake_error_class.new(nil, nil)
|
23
27
|
end
|
24
28
|
|
25
29
|
it "returns an unknown code" do
|
@@ -30,6 +34,4 @@ describe CandyCheck::PlayStore::VerificationFailure do
|
|
30
34
|
_(subject.message).must_equal "Unknown error"
|
31
35
|
end
|
32
36
|
end
|
33
|
-
|
34
|
-
FakeError = Struct.new(:status_code, :message)
|
35
37
|
end
|
@@ -32,14 +32,16 @@ describe CandyCheck::PlayStore::Verifier do
|
|
32
32
|
describe "subscription purchases" do
|
33
33
|
it "verifies a subscription purchase" do
|
34
34
|
VCR.use_cassette("play_store/subscription_purchases/valid_but_expired") do
|
35
|
-
result = subject.verify_subscription_purchase(package_name: package_name, subscription_id: subscription_id,
|
35
|
+
result = subject.verify_subscription_purchase(package_name: package_name, subscription_id: subscription_id,
|
36
|
+
token: token)
|
36
37
|
_(result).must_be_instance_of CandyCheck::PlayStore::SubscriptionPurchases::SubscriptionPurchase
|
37
38
|
end
|
38
39
|
end
|
39
40
|
|
40
41
|
it "can return a subscription purchase verification failure" do
|
41
42
|
VCR.use_cassette("play_store/subscription_purchases/permission_denied") do
|
42
|
-
result = subject.verify_subscription_purchase(package_name: package_name, subscription_id: subscription_id,
|
43
|
+
result = subject.verify_subscription_purchase(package_name: package_name, subscription_id: subscription_id,
|
44
|
+
token: token)
|
43
45
|
_(result).must_be_instance_of CandyCheck::PlayStore::VerificationFailure
|
44
46
|
end
|
45
47
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,6 +1,3 @@
|
|
1
|
-
require "coveralls"
|
2
|
-
Coveralls.wear!
|
3
|
-
|
4
1
|
require "candy_check"
|
5
2
|
require "candy_check/cli"
|
6
3
|
|
@@ -8,6 +5,21 @@ def in_continuous_integration_environment?
|
|
8
5
|
ENV["CI"] || ENV["TRAVIS"] || ENV["CONTINUOUS_INTEGRATION"]
|
9
6
|
end
|
10
7
|
|
8
|
+
require "simplecov"
|
9
|
+
|
10
|
+
SimpleCov.start do
|
11
|
+
if in_continuous_integration_environment?
|
12
|
+
require "simplecov-lcov"
|
13
|
+
|
14
|
+
SimpleCov::Formatter::LcovFormatter.config do |c|
|
15
|
+
c.report_with_single_file = true
|
16
|
+
c.single_report_path = "coverage/lcov.info"
|
17
|
+
end
|
18
|
+
|
19
|
+
formatter SimpleCov::Formatter::LcovFormatter
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
11
23
|
require "minitest/autorun"
|
12
24
|
require "minitest/around/spec"
|
13
25
|
require "minitest/focus" unless in_continuous_integration_environment?
|
@@ -25,14 +37,13 @@ require_relative "support/with_command"
|
|
25
37
|
|
26
38
|
ENV["DEBUG"] && Google::APIClient.logger.level = Logger::DEBUG
|
27
39
|
|
28
|
-
|
29
|
-
class
|
30
|
-
|
40
|
+
module MiniTest
|
41
|
+
class Spec
|
42
|
+
class << self
|
43
|
+
alias context describe
|
44
|
+
end
|
31
45
|
end
|
32
|
-
end
|
33
|
-
|
34
46
|
|
35
|
-
module MiniTest
|
36
47
|
module Assertions
|
37
48
|
# The first parameter must be ```true```, not coercible to true.
|
38
49
|
def assert_true(obj, msg = nil)
|