stripe 3.3.2 → 3.4.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 +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +20 -0
- data/.rubocop_todo.yml +62 -0
- data/.travis.yml +1 -1
- data/Gemfile +19 -12
- data/History.txt +10 -0
- data/README.md +5 -1
- data/Rakefile +8 -5
- data/VERSION +1 -1
- data/bin/stripe-console +2 -2
- data/lib/stripe.rb +72 -74
- data/lib/stripe/account.rb +15 -17
- data/lib/stripe/alipay_account.rb +10 -7
- data/lib/stripe/api_operations/create.rb +1 -1
- data/lib/stripe/api_operations/delete.rb +1 -1
- data/lib/stripe/api_operations/list.rb +2 -2
- data/lib/stripe/api_operations/request.rb +5 -12
- data/lib/stripe/api_operations/save.rb +6 -6
- data/lib/stripe/api_resource.rb +7 -9
- data/lib/stripe/apple_pay_domain.rb +2 -2
- data/lib/stripe/application_fee.rb +5 -5
- data/lib/stripe/application_fee_refund.rb +5 -5
- data/lib/stripe/balance.rb +1 -1
- data/lib/stripe/balance_transaction.rb +2 -2
- data/lib/stripe/bank_account.rb +7 -7
- data/lib/stripe/bitcoin_receiver.rb +4 -2
- data/lib/stripe/bitcoin_transaction.rb +3 -1
- data/lib/stripe/card.rb +5 -5
- data/lib/stripe/charge.rb +18 -18
- data/lib/stripe/country_spec.rb +2 -2
- data/lib/stripe/coupon.rb +1 -1
- data/lib/stripe/customer.rb +23 -23
- data/lib/stripe/dispute.rb +3 -3
- data/lib/stripe/ephemeral_key.rb +4 -4
- data/lib/stripe/errors.rb +4 -4
- data/lib/stripe/event.rb +1 -1
- data/lib/stripe/file_upload.rb +5 -5
- data/lib/stripe/invoice.rb +7 -7
- data/lib/stripe/invoice_item.rb +1 -1
- data/lib/stripe/invoice_line_item.rb +1 -1
- data/lib/stripe/list_object.rb +14 -18
- data/lib/stripe/login_link.rb +3 -3
- data/lib/stripe/oauth.rb +15 -13
- data/lib/stripe/order.rb +5 -5
- data/lib/stripe/order_return.rb +1 -1
- data/lib/stripe/payout.rb +3 -3
- data/lib/stripe/plan.rb +1 -1
- data/lib/stripe/product.rb +1 -1
- data/lib/stripe/recipient.rb +3 -2
- data/lib/stripe/recipient_transfer.rb +1 -2
- data/lib/stripe/refund.rb +1 -1
- data/lib/stripe/reversal.rb +5 -5
- data/lib/stripe/singleton_api_resource.rb +3 -3
- data/lib/stripe/sku.rb +1 -1
- data/lib/stripe/source.rb +13 -10
- data/lib/stripe/stripe_client.rb +149 -169
- data/lib/stripe/stripe_object.rb +77 -76
- data/lib/stripe/subscription.rb +5 -5
- data/lib/stripe/subscription_item.rb +2 -2
- data/lib/stripe/three_d_secure.rb +1 -1
- data/lib/stripe/token.rb +1 -1
- data/lib/stripe/transfer.rb +3 -3
- data/lib/stripe/util.rb +77 -62
- data/lib/stripe/version.rb +1 -1
- data/lib/stripe/webhook.rb +14 -10
- data/stripe.gemspec +14 -14
- data/test/stripe/account_test.rb +69 -81
- data/test/stripe/alipay_account_test.rb +19 -1
- data/test/stripe/api_operations_test.rb +7 -7
- data/test/stripe/api_resource_test.rb +224 -260
- data/test/stripe/apple_pay_domain_test.rb +8 -8
- data/test/stripe/application_fee_refund_test.rb +8 -8
- data/test/stripe/application_fee_test.rb +3 -3
- data/test/stripe/balance_test.rb +2 -2
- data/test/stripe/bank_account_test.rb +9 -11
- data/test/stripe/charge_test.rb +11 -11
- data/test/stripe/country_spec_test.rb +4 -4
- data/test/stripe/coupon_test.rb +10 -10
- data/test/stripe/customer_card_test.rb +11 -15
- data/test/stripe/customer_test.rb +26 -27
- data/test/stripe/dispute_test.rb +8 -8
- data/test/stripe/ephemeral_key_test.rb +14 -14
- data/test/stripe/errors_test.rb +2 -2
- data/test/stripe/file_upload_test.rb +26 -28
- data/test/stripe/invoice_item_test.rb +14 -14
- data/test/stripe/invoice_line_item_test.rb +1 -1
- data/test/stripe/invoice_test.rb +37 -37
- data/test/stripe/list_object_test.rb +60 -76
- data/test/stripe/login_link_test.rb +14 -14
- data/test/stripe/oauth_test.rb +42 -50
- data/test/stripe/order_return_test.rb +5 -5
- data/test/stripe/order_test.rb +12 -12
- data/test/stripe/payout_test.rb +9 -9
- data/test/stripe/plan_test.rb +9 -9
- data/test/stripe/product_test.rb +8 -8
- data/test/stripe/recipient_test.rb +9 -10
- data/test/stripe/refund_test.rb +9 -9
- data/test/stripe/reversal_test.rb +10 -10
- data/test/stripe/sku_test.rb +8 -8
- data/test/stripe/source_test.rb +14 -16
- data/test/stripe/stripe_client_test.rb +235 -266
- data/test/stripe/stripe_object_test.rb +163 -147
- data/test/stripe/stripe_response_test.rb +4 -3
- data/test/stripe/subscription_item_test.rb +11 -11
- data/test/stripe/subscription_test.rb +14 -14
- data/test/stripe/three_d_secure_test.rb +2 -2
- data/test/stripe/transfer_test.rb +8 -8
- data/test/stripe/util_test.rb +59 -57
- data/test/stripe/webhook_test.rb +18 -16
- data/test/stripe_test.rb +4 -4
- data/test/test_data.rb +26 -26
- data/test/test_helper.rb +29 -25
- metadata +6 -10
- data/test/stripe/bitcoin_receiver_test.rb +0 -67
- data/test/stripe/bitcoin_transaction_test.rb +0 -19
- data/test/stripe/recipient_card_test.rb +0 -44
data/test/stripe/refund_test.rb
CHANGED
@@ -1,37 +1,37 @@
|
|
1
|
-
require File.expand_path(
|
1
|
+
require File.expand_path("../../test_helper", __FILE__)
|
2
2
|
|
3
3
|
module Stripe
|
4
4
|
class RefundTest < Test::Unit::TestCase
|
5
5
|
should "be listable" do
|
6
6
|
refunds = Stripe::Refund.list
|
7
7
|
assert_requested :get, "#{Stripe.api_base}/v1/refunds"
|
8
|
-
assert refunds.data.
|
9
|
-
assert refunds.first.
|
8
|
+
assert refunds.data.is_a?(Array)
|
9
|
+
assert refunds.first.is_a?(Stripe::Refund)
|
10
10
|
end
|
11
11
|
|
12
12
|
should "be retrievable" do
|
13
13
|
refund = Stripe::Refund.retrieve("re_123")
|
14
14
|
assert_requested :get, "#{Stripe.api_base}/v1/refunds/re_123"
|
15
|
-
assert refund.
|
15
|
+
assert refund.is_a?(Stripe::Refund)
|
16
16
|
end
|
17
17
|
|
18
18
|
should "be creatable" do
|
19
|
-
refund = Stripe::Refund.create(:
|
19
|
+
refund = Stripe::Refund.create(charge: "ch_123")
|
20
20
|
assert_requested :post, "#{Stripe.api_base}/v1/refunds"
|
21
|
-
assert refund.
|
21
|
+
assert refund.is_a?(Stripe::Refund)
|
22
22
|
end
|
23
23
|
|
24
24
|
should "be saveable" do
|
25
25
|
refund = Stripe::Refund.retrieve("re_123")
|
26
|
-
refund.metadata[
|
26
|
+
refund.metadata["key"] = "value"
|
27
27
|
refund.save
|
28
28
|
assert_requested :post, "#{Stripe.api_base}/v1/refunds/#{refund.id}"
|
29
29
|
end
|
30
30
|
|
31
31
|
should "be updateable" do
|
32
|
-
refund = Stripe::Refund.update("re_123", metadata: { key:
|
32
|
+
refund = Stripe::Refund.update("re_123", metadata: { key: "value" })
|
33
33
|
assert_requested :post, "#{Stripe.api_base}/v1/refunds/re_123"
|
34
|
-
assert refund.
|
34
|
+
assert refund.is_a?(Stripe::Refund)
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.expand_path(
|
1
|
+
require File.expand_path("../../test_helper", __FILE__)
|
2
2
|
|
3
3
|
module Stripe
|
4
4
|
class ReversalTest < Test::Unit::TestCase
|
@@ -9,16 +9,16 @@ module Stripe
|
|
9
9
|
should "be listable" do
|
10
10
|
reversals = @transfer.reversals.list
|
11
11
|
assert_requested :get,
|
12
|
-
|
13
|
-
assert reversals.data.
|
14
|
-
assert reversals.data[0].
|
12
|
+
"#{Stripe.api_base}/v1/transfers/#{@transfer.id}/reversals"
|
13
|
+
assert reversals.data.is_a?(Array)
|
14
|
+
assert reversals.data[0].is_a?(Stripe::Reversal)
|
15
15
|
end
|
16
16
|
|
17
17
|
should "be retrievable" do
|
18
18
|
reversal = @transfer.reversals.retrieve("trr_123")
|
19
19
|
assert_requested :get,
|
20
|
-
|
21
|
-
assert reversal.
|
20
|
+
"#{Stripe.api_base}/v1/transfers/#{@transfer.id}/reversals/trr_123"
|
21
|
+
assert reversal.is_a?(Stripe::Reversal)
|
22
22
|
end
|
23
23
|
|
24
24
|
should "be creatable" do
|
@@ -26,16 +26,16 @@ module Stripe
|
|
26
26
|
amount: 100
|
27
27
|
)
|
28
28
|
assert_requested :post,
|
29
|
-
|
30
|
-
assert reversal.
|
29
|
+
"#{Stripe.api_base}/v1/transfers/#{@transfer.id}/reversals"
|
30
|
+
assert reversal.is_a?(Stripe::Reversal)
|
31
31
|
end
|
32
32
|
|
33
33
|
should "be saveable" do
|
34
34
|
reversal = @transfer.reversals.retrieve("trr_123")
|
35
|
-
reversal.metadata[
|
35
|
+
reversal.metadata["key"] = "value"
|
36
36
|
reversal.save
|
37
37
|
assert_requested :post,
|
38
|
-
|
38
|
+
"#{Stripe.api_base}/v1/transfers/#{reversal.transfer}/reversals/#{reversal.id}"
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
data/test/stripe/sku_test.rb
CHANGED
@@ -1,18 +1,18 @@
|
|
1
|
-
require File.expand_path(
|
1
|
+
require File.expand_path("../../test_helper", __FILE__)
|
2
2
|
|
3
3
|
module Stripe
|
4
4
|
class SKUTest < Test::Unit::TestCase
|
5
5
|
should "be listable" do
|
6
6
|
skus = Stripe::SKU.list
|
7
7
|
assert_requested :get, "#{Stripe.api_base}/v1/skus"
|
8
|
-
assert skus.data.
|
9
|
-
assert skus.data[0].
|
8
|
+
assert skus.data.is_a?(Array)
|
9
|
+
assert skus.data[0].is_a?(Stripe::SKU)
|
10
10
|
end
|
11
11
|
|
12
12
|
should "be retrievable" do
|
13
13
|
sku = Stripe::SKU.retrieve("sku_123")
|
14
14
|
assert_requested :get, "#{Stripe.api_base}/v1/skus/sku_123"
|
15
|
-
assert sku.
|
15
|
+
assert sku.is_a?(Stripe::SKU)
|
16
16
|
end
|
17
17
|
|
18
18
|
should "be creatable" do
|
@@ -27,22 +27,22 @@ module Stripe
|
|
27
27
|
|
28
28
|
should "be saveable" do
|
29
29
|
sku = Stripe::SKU.retrieve("sku_123")
|
30
|
-
sku.metadata[
|
30
|
+
sku.metadata["key"] = "value"
|
31
31
|
sku.save
|
32
32
|
assert_requested :post, "#{Stripe.api_base}/v1/skus/#{sku.id}"
|
33
33
|
end
|
34
34
|
|
35
35
|
should "be updateable" do
|
36
|
-
sku = Stripe::SKU.update("sku_123", metadata: {foo:
|
36
|
+
sku = Stripe::SKU.update("sku_123", metadata: { foo: "bar" })
|
37
37
|
assert_requested :post, "#{Stripe.api_base}/v1/skus/sku_123"
|
38
|
-
assert sku.
|
38
|
+
assert sku.is_a?(Stripe::SKU)
|
39
39
|
end
|
40
40
|
|
41
41
|
should "be deletable" do
|
42
42
|
sku = Stripe::SKU.retrieve("sku_123")
|
43
43
|
sku = sku.delete
|
44
44
|
assert_requested :delete, "#{Stripe.api_base}/v1/skus/#{sku.id}"
|
45
|
-
assert sku.
|
45
|
+
assert sku.is_a?(Stripe::SKU)
|
46
46
|
end
|
47
47
|
end
|
48
48
|
end
|
data/test/stripe/source_test.rb
CHANGED
@@ -1,33 +1,33 @@
|
|
1
|
-
require File.expand_path(
|
1
|
+
require File.expand_path("../../test_helper", __FILE__)
|
2
2
|
|
3
3
|
module Stripe
|
4
4
|
class SourceTest < Test::Unit::TestCase
|
5
5
|
should "be retrievable" do
|
6
6
|
source = Stripe::Source.retrieve("src_123")
|
7
7
|
assert_requested :get, "#{Stripe.api_base}/v1/sources/src_123"
|
8
|
-
assert source.
|
8
|
+
assert source.is_a?(Stripe::Source)
|
9
9
|
end
|
10
10
|
|
11
11
|
should "be creatable" do
|
12
12
|
source = Stripe::Source.create(
|
13
|
-
type:
|
13
|
+
type: "card",
|
14
14
|
token: "tok_123"
|
15
15
|
)
|
16
16
|
assert_requested :post, "#{Stripe.api_base}/v1/sources"
|
17
|
-
assert source.
|
17
|
+
assert source.is_a?(Stripe::Source)
|
18
18
|
end
|
19
19
|
|
20
20
|
should "be saveable" do
|
21
21
|
source = Stripe::Source.retrieve("src_123")
|
22
|
-
source.metadata[
|
22
|
+
source.metadata["key"] = "value"
|
23
23
|
source.save
|
24
24
|
assert_requested :post, "#{Stripe.api_base}/v1/sources/#{source.id}"
|
25
25
|
end
|
26
26
|
|
27
27
|
should "be updateable" do
|
28
|
-
source = Stripe::Source.update("src_123", metadata: {foo:
|
28
|
+
source = Stripe::Source.update("src_123", metadata: { foo: "bar" })
|
29
29
|
assert_requested :post, "#{Stripe.api_base}/v1/sources/src_123"
|
30
|
-
assert source.
|
30
|
+
assert source.is_a?(Stripe::Source)
|
31
31
|
end
|
32
32
|
|
33
33
|
context "#delete" do
|
@@ -40,18 +40,16 @@ module Stripe
|
|
40
40
|
end
|
41
41
|
|
42
42
|
should "be deletable when attached to a customer" do
|
43
|
-
source = Stripe::Source.construct_from(
|
44
|
-
|
45
|
-
|
46
|
-
object: "source"
|
47
|
-
})
|
43
|
+
source = Stripe::Source.construct_from(customer: "cus_123",
|
44
|
+
id: "src_123",
|
45
|
+
object: "source")
|
48
46
|
source = source.delete
|
49
47
|
assert_requested :delete, "#{Stripe.api_base}/v1/customers/cus_123/sources/src_123"
|
50
|
-
assert source.
|
48
|
+
assert source.is_a?(Stripe::Source)
|
51
49
|
end
|
52
50
|
end
|
53
51
|
|
54
|
-
should
|
52
|
+
should "not be listable" do
|
55
53
|
assert_raises NoMethodError do
|
56
54
|
Stripe::Source.list
|
57
55
|
end
|
@@ -60,8 +58,8 @@ module Stripe
|
|
60
58
|
context "#verify" do
|
61
59
|
should "verify the source" do
|
62
60
|
source = Stripe::Source.retrieve("src_123")
|
63
|
-
source = source.verify(:
|
64
|
-
assert source.
|
61
|
+
source = source.verify(values: [1, 2])
|
62
|
+
assert source.is_a?(Stripe::Source)
|
65
63
|
end
|
66
64
|
end
|
67
65
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.expand_path(
|
1
|
+
require File.expand_path("../../test_helper", __FILE__)
|
2
2
|
|
3
3
|
module Stripe
|
4
4
|
class StripeClientTest < Test::Unit::TestCase
|
@@ -41,25 +41,25 @@ module Stripe
|
|
41
41
|
Stripe.stubs(:max_network_retries).returns(2)
|
42
42
|
end
|
43
43
|
|
44
|
-
should
|
44
|
+
should "retry on timeout" do
|
45
45
|
assert StripeClient.should_retry?(Faraday::TimeoutError.new(""), 0)
|
46
46
|
end
|
47
47
|
|
48
|
-
should
|
48
|
+
should "retry on a failed connection" do
|
49
49
|
assert StripeClient.should_retry?(Faraday::ConnectionFailed.new(""), 0)
|
50
50
|
end
|
51
51
|
|
52
|
-
should
|
52
|
+
should "retry on a conflict" do
|
53
53
|
error = make_rate_limit_error
|
54
|
-
e = Faraday::ClientError.new(error[:error][:message],
|
54
|
+
e = Faraday::ClientError.new(error[:error][:message], status: 409)
|
55
55
|
assert StripeClient.should_retry?(e, 0)
|
56
56
|
end
|
57
57
|
|
58
|
-
should
|
58
|
+
should "not retry at maximum count" do
|
59
59
|
refute StripeClient.should_retry?(RuntimeError.new, Stripe.max_network_retries)
|
60
60
|
end
|
61
61
|
|
62
|
-
should
|
62
|
+
should "not retry on a certificate validation error" do
|
63
63
|
refute StripeClient.should_retry?(Faraday::SSLError.new(""), 0)
|
64
64
|
end
|
65
65
|
end
|
@@ -119,25 +119,23 @@ module Stripe
|
|
119
119
|
context "#execute_request" do
|
120
120
|
context "headers" do
|
121
121
|
should "support literal headers" do
|
122
|
-
stub_request(:post, "#{Stripe.api_base}/v1/account")
|
123
|
-
with(headers: { "Stripe-Account" => "bar" })
|
124
|
-
to_return(body: JSON.generate(
|
122
|
+
stub_request(:post, "#{Stripe.api_base}/v1/account")
|
123
|
+
.with(headers: { "Stripe-Account" => "bar" })
|
124
|
+
.to_return(body: JSON.generate(object: "account"))
|
125
125
|
|
126
126
|
client = StripeClient.new
|
127
|
-
client.execute_request(:post,
|
128
|
-
|
129
|
-
)
|
127
|
+
client.execute_request(:post, "/v1/account",
|
128
|
+
headers: { "Stripe-Account" => "bar" })
|
130
129
|
end
|
131
130
|
|
132
131
|
should "support RestClient-style header keys" do
|
133
|
-
stub_request(:post, "#{Stripe.api_base}/v1/account")
|
134
|
-
with(headers: { "Stripe-Account" => "bar" })
|
135
|
-
to_return(body: JSON.generate(
|
132
|
+
stub_request(:post, "#{Stripe.api_base}/v1/account")
|
133
|
+
.with(headers: { "Stripe-Account" => "bar" })
|
134
|
+
.to_return(body: JSON.generate(object: "account"))
|
136
135
|
|
137
136
|
client = StripeClient.new
|
138
|
-
client.execute_request(:post,
|
139
|
-
|
140
|
-
)
|
137
|
+
client.execute_request(:post, "/v1/account",
|
138
|
+
headers: { stripe_account: "bar" })
|
141
139
|
end
|
142
140
|
end
|
143
141
|
|
@@ -157,149 +155,136 @@ module Stripe
|
|
157
155
|
end
|
158
156
|
|
159
157
|
should "produce appropriate logging" do
|
160
|
-
body = JSON.generate(
|
158
|
+
body = JSON.generate(object: "account")
|
161
159
|
|
162
160
|
Util.expects(:log_info).with("Request to Stripe API",
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
)
|
161
|
+
account: "acct_123",
|
162
|
+
api_version: "2010-11-12",
|
163
|
+
idempotency_key: "abc",
|
164
|
+
method: :post,
|
165
|
+
num_retries: 0,
|
166
|
+
path: "/v1/account")
|
170
167
|
Util.expects(:log_debug).with("Request details",
|
171
|
-
|
172
|
-
|
173
|
-
|
168
|
+
body: "",
|
169
|
+
idempotency_key: "abc",
|
170
|
+
query_string: nil)
|
174
171
|
|
175
172
|
Util.expects(:log_info).with("Response from Stripe API",
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
)
|
173
|
+
account: "acct_123",
|
174
|
+
api_version: "2010-11-12",
|
175
|
+
elapsed: 0.0,
|
176
|
+
idempotency_key: "abc",
|
177
|
+
method: :post,
|
178
|
+
path: "/v1/account",
|
179
|
+
request_id: "req_123",
|
180
|
+
status: 200)
|
185
181
|
Util.expects(:log_debug).with("Response details",
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
)
|
182
|
+
body: body,
|
183
|
+
idempotency_key: "abc",
|
184
|
+
request_id: "req_123")
|
190
185
|
Util.expects(:log_debug).with("Dashboard link for request",
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
)
|
186
|
+
idempotency_key: "abc",
|
187
|
+
request_id: "req_123",
|
188
|
+
url: Util.request_id_dashboard_url("req_123", Stripe.api_key))
|
195
189
|
|
196
|
-
stub_request(:post, "#{Stripe.api_base}/v1/account")
|
197
|
-
to_return(
|
190
|
+
stub_request(:post, "#{Stripe.api_base}/v1/account")
|
191
|
+
.to_return(
|
198
192
|
body: body,
|
199
193
|
headers: {
|
200
194
|
"Idempotency-Key" => "abc",
|
201
195
|
"Request-Id" => "req_123",
|
202
196
|
"Stripe-Account" => "acct_123",
|
203
|
-
"Stripe-Version" => "2010-11-12"
|
197
|
+
"Stripe-Version" => "2010-11-12",
|
204
198
|
}
|
205
199
|
)
|
206
200
|
|
207
201
|
client = StripeClient.new
|
208
|
-
client.execute_request(:post,
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
)
|
202
|
+
client.execute_request(:post, "/v1/account",
|
203
|
+
headers: {
|
204
|
+
"Idempotency-Key" => "abc",
|
205
|
+
"Stripe-Account" => "acct_123",
|
206
|
+
"Stripe-Version" => "2010-11-12",
|
207
|
+
})
|
215
208
|
end
|
216
209
|
|
217
210
|
should "produce logging on API error" do
|
218
211
|
Util.expects(:log_info).with("Request to Stripe API",
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
)
|
212
|
+
account: nil,
|
213
|
+
api_version: nil,
|
214
|
+
idempotency_key: nil,
|
215
|
+
method: :post,
|
216
|
+
num_retries: 0,
|
217
|
+
path: "/v1/account")
|
226
218
|
Util.expects(:log_info).with("Response from Stripe API",
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
)
|
219
|
+
account: nil,
|
220
|
+
api_version: nil,
|
221
|
+
elapsed: 0.0,
|
222
|
+
idempotency_key: nil,
|
223
|
+
method: :post,
|
224
|
+
path: "/v1/account",
|
225
|
+
request_id: nil,
|
226
|
+
status: 500)
|
236
227
|
|
237
228
|
error = {
|
238
|
-
code:
|
239
|
-
message:
|
240
|
-
param:
|
241
|
-
type:
|
229
|
+
code: "code",
|
230
|
+
message: "message",
|
231
|
+
param: "param",
|
232
|
+
type: "type",
|
242
233
|
}
|
243
|
-
Util.expects(:log_error).with(
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
body: JSON.generate({ :error => error }),
|
234
|
+
Util.expects(:log_error).with("Stripe API error",
|
235
|
+
status: 500,
|
236
|
+
error_code: error["code"],
|
237
|
+
error_message: error["message"],
|
238
|
+
error_param: error["param"],
|
239
|
+
error_type: error["type"],
|
240
|
+
idempotency_key: nil,
|
241
|
+
request_id: nil)
|
242
|
+
|
243
|
+
stub_request(:post, "#{Stripe.api_base}/v1/account")
|
244
|
+
.to_return(
|
245
|
+
body: JSON.generate(error: error),
|
256
246
|
status: 500
|
257
247
|
)
|
258
248
|
|
259
249
|
client = StripeClient.new
|
260
250
|
assert_raises Stripe::APIError do
|
261
|
-
client.execute_request(:post,
|
251
|
+
client.execute_request(:post, "/v1/account")
|
262
252
|
end
|
263
253
|
end
|
264
254
|
|
265
255
|
should "produce logging on OAuth error" do
|
266
256
|
Util.expects(:log_info).with("Request to Stripe API",
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
)
|
257
|
+
account: nil,
|
258
|
+
api_version: nil,
|
259
|
+
idempotency_key: nil,
|
260
|
+
method: :post,
|
261
|
+
num_retries: 0,
|
262
|
+
path: "/oauth/token")
|
274
263
|
Util.expects(:log_info).with("Response from Stripe API",
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
)
|
292
|
-
|
293
|
-
|
294
|
-
to_return(body: JSON.generate({
|
295
|
-
error: "invalid_request",
|
296
|
-
error_description: "No grant type specified",
|
297
|
-
}), status: 400)
|
264
|
+
account: nil,
|
265
|
+
api_version: nil,
|
266
|
+
elapsed: 0.0,
|
267
|
+
idempotency_key: nil,
|
268
|
+
method: :post,
|
269
|
+
path: "/oauth/token",
|
270
|
+
request_id: nil,
|
271
|
+
status: 400)
|
272
|
+
|
273
|
+
Util.expects(:log_error).with("Stripe OAuth error",
|
274
|
+
status: 400,
|
275
|
+
error_code: "invalid_request",
|
276
|
+
error_description: "No grant type specified",
|
277
|
+
idempotency_key: nil,
|
278
|
+
request_id: nil)
|
279
|
+
|
280
|
+
stub_request(:post, "#{Stripe.connect_base}/oauth/token")
|
281
|
+
.to_return(body: JSON.generate(error: "invalid_request",
|
282
|
+
error_description: "No grant type specified"), status: 400)
|
298
283
|
|
299
284
|
client = StripeClient.new
|
300
|
-
opts = {api_base: Stripe.connect_base}
|
285
|
+
opts = { api_base: Stripe.connect_base }
|
301
286
|
assert_raises Stripe::OAuth::InvalidRequestError do
|
302
|
-
client.execute_request(:post,
|
287
|
+
client.execute_request(:post, "/oauth/token", opts)
|
303
288
|
end
|
304
289
|
end
|
305
290
|
end
|
@@ -308,14 +293,14 @@ module Stripe
|
|
308
293
|
should "use a globally set header" do
|
309
294
|
begin
|
310
295
|
old = Stripe.stripe_account
|
311
|
-
Stripe.stripe_account =
|
296
|
+
Stripe.stripe_account = "acct_1234"
|
312
297
|
|
313
|
-
stub_request(:post, "#{Stripe.api_base}/v1/account")
|
314
|
-
with(headers: {"Stripe-Account" => Stripe.stripe_account})
|
315
|
-
to_return(body: JSON.generate(
|
298
|
+
stub_request(:post, "#{Stripe.api_base}/v1/account")
|
299
|
+
.with(headers: { "Stripe-Account" => Stripe.stripe_account })
|
300
|
+
.to_return(body: JSON.generate(object: "account"))
|
316
301
|
|
317
302
|
client = StripeClient.new
|
318
|
-
client.execute_request(:post,
|
303
|
+
client.execute_request(:post, "/v1/account")
|
319
304
|
ensure
|
320
305
|
Stripe.stripe_account = old
|
321
306
|
end
|
@@ -323,24 +308,23 @@ module Stripe
|
|
323
308
|
|
324
309
|
should "use a locally set header" do
|
325
310
|
stripe_account = "acct_0000"
|
326
|
-
stub_request(:post, "#{Stripe.api_base}/v1/account")
|
327
|
-
with(headers: {"Stripe-Account" => stripe_account})
|
328
|
-
to_return(body: JSON.generate(
|
311
|
+
stub_request(:post, "#{Stripe.api_base}/v1/account")
|
312
|
+
.with(headers: { "Stripe-Account" => stripe_account })
|
313
|
+
.to_return(body: JSON.generate(object: "account"))
|
329
314
|
|
330
315
|
client = StripeClient.new
|
331
|
-
client.execute_request(:post,
|
332
|
-
|
333
|
-
)
|
316
|
+
client.execute_request(:post, "/v1/account",
|
317
|
+
headers: { stripe_account: stripe_account })
|
334
318
|
end
|
335
319
|
|
336
320
|
should "not send it otherwise" do
|
337
|
-
stub_request(:post, "#{Stripe.api_base}/v1/account")
|
338
|
-
with
|
321
|
+
stub_request(:post, "#{Stripe.api_base}/v1/account")
|
322
|
+
.with do |req|
|
339
323
|
req.headers["Stripe-Account"].nil?
|
340
|
-
|
324
|
+
end.to_return(body: JSON.generate(object: "account"))
|
341
325
|
|
342
326
|
client = StripeClient.new
|
343
|
-
client.execute_request(:post,
|
327
|
+
client.execute_request(:post, "/v1/account")
|
344
328
|
end
|
345
329
|
end
|
346
330
|
|
@@ -354,27 +338,27 @@ module Stripe
|
|
354
338
|
version: "1.2.34"
|
355
339
|
)
|
356
340
|
|
357
|
-
stub_request(:post, "#{Stripe.api_base}/v1/account")
|
358
|
-
with
|
341
|
+
stub_request(:post, "#{Stripe.api_base}/v1/account")
|
342
|
+
.with do |req|
|
359
343
|
assert_equal \
|
360
344
|
"Stripe/v1 RubyBindings/#{Stripe::VERSION} " \
|
361
345
|
"MyAwesomePlugin/1.2.34 (https://myawesomeplugin.info)",
|
362
346
|
req.headers["User-Agent"]
|
363
347
|
|
364
348
|
data = JSON.parse(req.headers["X-Stripe-Client-User-Agent"],
|
365
|
-
|
349
|
+
symbolize_names: true)
|
366
350
|
|
367
351
|
assert_equal({
|
368
352
|
name: "MyAwesomePlugin",
|
369
353
|
url: "https://myawesomeplugin.info",
|
370
|
-
version: "1.2.34"
|
354
|
+
version: "1.2.34",
|
371
355
|
}, data[:application])
|
372
356
|
|
373
357
|
true
|
374
|
-
|
358
|
+
end.to_return(body: JSON.generate(object: "account"))
|
375
359
|
|
376
360
|
client = StripeClient.new
|
377
|
-
client.execute_request(:post,
|
361
|
+
client.execute_request(:post, "/v1/account")
|
378
362
|
ensure
|
379
363
|
Stripe.app_info = old
|
380
364
|
end
|
@@ -383,184 +367,169 @@ module Stripe
|
|
383
367
|
|
384
368
|
context "error handling" do
|
385
369
|
should "handle error response with empty body" do
|
386
|
-
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
387
|
-
to_return(body:
|
370
|
+
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
371
|
+
.to_return(body: "", status: 500)
|
388
372
|
|
389
373
|
client = StripeClient.new
|
390
374
|
e = assert_raises Stripe::APIError do
|
391
|
-
client.execute_request(:post,
|
375
|
+
client.execute_request(:post, "/v1/charges")
|
392
376
|
end
|
393
377
|
|
394
378
|
assert_equal 'Invalid response object from API: "" (HTTP response code was 500)', e.message
|
395
379
|
end
|
396
380
|
|
397
381
|
should "handle success response with empty body" do
|
398
|
-
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
399
|
-
to_return(body:
|
382
|
+
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
383
|
+
.to_return(body: "", status: 200)
|
400
384
|
|
401
385
|
client = StripeClient.new
|
402
386
|
e = assert_raises Stripe::APIError do
|
403
|
-
client.execute_request(:post,
|
387
|
+
client.execute_request(:post, "/v1/charges")
|
404
388
|
end
|
405
389
|
|
406
390
|
assert_equal 'Invalid response object from API: "" (HTTP response code was 200)', e.message
|
407
391
|
end
|
408
392
|
|
409
393
|
should "handle error response with unknown value" do
|
410
|
-
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
411
|
-
to_return(body: JSON.generate(
|
394
|
+
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
395
|
+
.to_return(body: JSON.generate(bar: "foo"), status: 500)
|
412
396
|
|
413
397
|
client = StripeClient.new
|
414
398
|
e = assert_raises Stripe::APIError do
|
415
|
-
client.execute_request(:post,
|
399
|
+
client.execute_request(:post, "/v1/charges")
|
416
400
|
end
|
417
401
|
|
418
402
|
assert_equal 'Invalid response object from API: "{\"bar\":\"foo\"}" (HTTP response code was 500)', e.message
|
419
403
|
end
|
420
404
|
|
421
405
|
should "raise InvalidRequestError on 400" do
|
422
|
-
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
423
|
-
to_return(body: JSON.generate(make_missing_id_error), status: 400)
|
406
|
+
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
407
|
+
.to_return(body: JSON.generate(make_missing_id_error), status: 400)
|
424
408
|
client = StripeClient.new
|
425
409
|
begin
|
426
|
-
client.execute_request(:post,
|
410
|
+
client.execute_request(:post, "/v1/charges")
|
427
411
|
rescue Stripe::InvalidRequestError => e
|
428
412
|
assert_equal(400, e.http_status)
|
429
|
-
assert_equal(true,
|
430
|
-
assert_equal(true, e.json_body.kind_of?(Hash))
|
413
|
+
assert_equal(true, e.json_body.is_a?(Hash))
|
431
414
|
end
|
432
415
|
end
|
433
416
|
|
434
417
|
should "raise AuthenticationError on 401" do
|
435
|
-
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
436
|
-
to_return(body: JSON.generate(make_missing_id_error), status: 401)
|
418
|
+
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
419
|
+
.to_return(body: JSON.generate(make_missing_id_error), status: 401)
|
437
420
|
client = StripeClient.new
|
438
421
|
begin
|
439
|
-
client.execute_request(:post,
|
422
|
+
client.execute_request(:post, "/v1/charges")
|
440
423
|
rescue Stripe::AuthenticationError => e
|
441
424
|
assert_equal(401, e.http_status)
|
442
|
-
assert_equal(true,
|
443
|
-
assert_equal(true, e.json_body.kind_of?(Hash))
|
425
|
+
assert_equal(true, e.json_body.is_a?(Hash))
|
444
426
|
end
|
445
427
|
end
|
446
428
|
|
447
429
|
should "raise CardError on 402" do
|
448
|
-
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
449
|
-
to_return(body: JSON.generate(make_missing_id_error), status: 402)
|
430
|
+
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
431
|
+
.to_return(body: JSON.generate(make_missing_id_error), status: 402)
|
450
432
|
client = StripeClient.new
|
451
433
|
begin
|
452
|
-
client.execute_request(:post,
|
434
|
+
client.execute_request(:post, "/v1/charges")
|
453
435
|
rescue Stripe::CardError => e
|
454
436
|
assert_equal(402, e.http_status)
|
455
|
-
assert_equal(true,
|
456
|
-
assert_equal(true, e.json_body.kind_of?(Hash))
|
437
|
+
assert_equal(true, e.json_body.is_a?(Hash))
|
457
438
|
end
|
458
439
|
end
|
459
440
|
|
460
441
|
should "raise PermissionError on 403" do
|
461
|
-
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
462
|
-
to_return(body: JSON.generate(make_missing_id_error), status: 403)
|
442
|
+
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
443
|
+
.to_return(body: JSON.generate(make_missing_id_error), status: 403)
|
463
444
|
client = StripeClient.new
|
464
445
|
begin
|
465
|
-
client.execute_request(:post,
|
446
|
+
client.execute_request(:post, "/v1/charges")
|
466
447
|
rescue Stripe::PermissionError => e
|
467
448
|
assert_equal(403, e.http_status)
|
468
|
-
assert_equal(true,
|
469
|
-
assert_equal(true, e.json_body.kind_of?(Hash))
|
449
|
+
assert_equal(true, e.json_body.is_a?(Hash))
|
470
450
|
end
|
471
451
|
end
|
472
452
|
|
473
453
|
should "raise InvalidRequestError on 404" do
|
474
|
-
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
475
|
-
to_return(body: JSON.generate(make_missing_id_error), status: 404)
|
454
|
+
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
455
|
+
.to_return(body: JSON.generate(make_missing_id_error), status: 404)
|
476
456
|
client = StripeClient.new
|
477
457
|
begin
|
478
|
-
client.execute_request(:post,
|
458
|
+
client.execute_request(:post, "/v1/charges")
|
479
459
|
rescue Stripe::InvalidRequestError => e
|
480
460
|
assert_equal(404, e.http_status)
|
481
|
-
assert_equal(true,
|
482
|
-
assert_equal(true, e.json_body.kind_of?(Hash))
|
461
|
+
assert_equal(true, e.json_body.is_a?(Hash))
|
483
462
|
end
|
484
463
|
end
|
485
464
|
|
486
465
|
should "raise RateLimitError on 429" do
|
487
|
-
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
488
|
-
to_return(body: JSON.generate(make_rate_limit_error), status: 429)
|
466
|
+
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
467
|
+
.to_return(body: JSON.generate(make_rate_limit_error), status: 429)
|
489
468
|
client = StripeClient.new
|
490
469
|
begin
|
491
|
-
client.execute_request(:post,
|
470
|
+
client.execute_request(:post, "/v1/charges")
|
492
471
|
rescue Stripe::RateLimitError => e
|
493
472
|
assert_equal(429, e.http_status)
|
494
|
-
assert_equal(true,
|
495
|
-
assert_equal(true, e.json_body.kind_of?(Hash))
|
473
|
+
assert_equal(true, e.json_body.is_a?(Hash))
|
496
474
|
end
|
497
475
|
end
|
498
476
|
|
499
477
|
should "raise OAuth::InvalidRequestError when error is a string with value 'invalid_request'" do
|
500
|
-
stub_request(:post, "#{Stripe.connect_base}/oauth/token")
|
501
|
-
to_return(body: JSON.generate(
|
502
|
-
|
503
|
-
error_description: "No grant type specified",
|
504
|
-
}), status: 400)
|
478
|
+
stub_request(:post, "#{Stripe.connect_base}/oauth/token")
|
479
|
+
.to_return(body: JSON.generate(error: "invalid_request",
|
480
|
+
error_description: "No grant type specified"), status: 400)
|
505
481
|
|
506
482
|
client = StripeClient.new
|
507
|
-
opts = {api_base: Stripe.connect_base}
|
483
|
+
opts = { api_base: Stripe.connect_base }
|
508
484
|
e = assert_raises Stripe::OAuth::InvalidRequestError do
|
509
|
-
client.execute_request(:post,
|
485
|
+
client.execute_request(:post, "/oauth/token", opts)
|
510
486
|
end
|
511
487
|
|
512
488
|
assert_equal(400, e.http_status)
|
513
|
-
assert_equal(
|
514
|
-
assert_equal('No grant type specified', e.message)
|
489
|
+
assert_equal("No grant type specified", e.message)
|
515
490
|
end
|
516
491
|
|
517
492
|
should "raise OAuth::InvalidGrantError when error is a string with value 'invalid_grant'" do
|
518
|
-
stub_request(:post, "#{Stripe.connect_base}/oauth/token")
|
519
|
-
to_return(body: JSON.generate(
|
520
|
-
|
521
|
-
error_description: "This authorization code has already been used. All tokens issued with this code have been revoked.",
|
522
|
-
}), status: 400)
|
493
|
+
stub_request(:post, "#{Stripe.connect_base}/oauth/token")
|
494
|
+
.to_return(body: JSON.generate(error: "invalid_grant",
|
495
|
+
error_description: "This authorization code has already been used. All tokens issued with this code have been revoked."), status: 400)
|
523
496
|
|
524
497
|
client = StripeClient.new
|
525
|
-
opts = {api_base: Stripe.connect_base}
|
498
|
+
opts = { api_base: Stripe.connect_base }
|
526
499
|
e = assert_raises Stripe::OAuth::InvalidGrantError do
|
527
|
-
client.execute_request(:post,
|
500
|
+
client.execute_request(:post, "/oauth/token", opts)
|
528
501
|
end
|
529
502
|
|
530
503
|
assert_equal(400, e.http_status)
|
531
|
-
assert_equal(
|
532
|
-
assert_equal(
|
504
|
+
assert_equal("invalid_grant", e.code)
|
505
|
+
assert_equal("This authorization code has already been used. All tokens issued with this code have been revoked.", e.message)
|
533
506
|
end
|
534
507
|
|
535
508
|
should "raise OAuth::InvalidClientError when error is a string with value 'invalid_client'" do
|
536
|
-
stub_request(:post, "#{Stripe.connect_base}/oauth/deauthorize")
|
537
|
-
to_return(body: JSON.generate(
|
538
|
-
|
539
|
-
error_description: "This application is not connected to stripe account acct_19tLK7DSlTMT26Mk, or that account does not exist.",
|
540
|
-
}), status: 401)
|
509
|
+
stub_request(:post, "#{Stripe.connect_base}/oauth/deauthorize")
|
510
|
+
.to_return(body: JSON.generate(error: "invalid_client",
|
511
|
+
error_description: "This application is not connected to stripe account acct_19tLK7DSlTMT26Mk, or that account does not exist."), status: 401)
|
541
512
|
|
542
513
|
client = StripeClient.new
|
543
|
-
opts = {api_base: Stripe.connect_base}
|
514
|
+
opts = { api_base: Stripe.connect_base }
|
544
515
|
e = assert_raises Stripe::OAuth::InvalidClientError do
|
545
|
-
client.execute_request(:post,
|
516
|
+
client.execute_request(:post, "/oauth/deauthorize", opts)
|
546
517
|
end
|
547
518
|
|
548
519
|
assert_equal(401, e.http_status)
|
549
|
-
assert_equal(
|
550
|
-
assert_equal(
|
520
|
+
assert_equal("invalid_client", e.code)
|
521
|
+
assert_equal("This application is not connected to stripe account acct_19tLK7DSlTMT26Mk, or that account does not exist.", e.message)
|
551
522
|
end
|
552
523
|
|
553
524
|
should "raise Stripe::OAuthError on indeterminate OAuth error" do
|
554
|
-
stub_request(:post, "#{Stripe.connect_base}/oauth/deauthorize")
|
555
|
-
to_return(body: JSON.generate(
|
556
|
-
|
557
|
-
error_description: "Something.",
|
558
|
-
}), status: 401)
|
525
|
+
stub_request(:post, "#{Stripe.connect_base}/oauth/deauthorize")
|
526
|
+
.to_return(body: JSON.generate(error: "new_code_not_recognized",
|
527
|
+
error_description: "Something."), status: 401)
|
559
528
|
|
560
529
|
client = StripeClient.new
|
561
|
-
opts = {api_base: Stripe.connect_base}
|
530
|
+
opts = { api_base: Stripe.connect_base }
|
562
531
|
e = assert_raises Stripe::OAuth::OAuthError do
|
563
|
-
client.execute_request(:post,
|
532
|
+
client.execute_request(:post, "/oauth/deauthorize", opts)
|
564
533
|
end
|
565
534
|
|
566
535
|
assert_equal(401, e.http_status)
|
@@ -574,48 +543,48 @@ module Stripe
|
|
574
543
|
Stripe.stubs(:max_network_retries).returns(2)
|
575
544
|
end
|
576
545
|
|
577
|
-
should
|
546
|
+
should "not add an idempotency key to GET requests" do
|
578
547
|
SecureRandom.expects(:uuid).times(0)
|
579
|
-
stub_request(:get, "#{Stripe.api_base}/v1/charges/ch_123")
|
580
|
-
with
|
581
|
-
req.headers[
|
582
|
-
|
548
|
+
stub_request(:get, "#{Stripe.api_base}/v1/charges/ch_123")
|
549
|
+
.with do |req|
|
550
|
+
req.headers["Idempotency-Key"].nil?
|
551
|
+
end.to_return(body: JSON.generate(object: "charge"))
|
583
552
|
client = StripeClient.new
|
584
553
|
client.execute_request(:get, "/v1/charges/ch_123")
|
585
554
|
end
|
586
555
|
|
587
|
-
should
|
556
|
+
should "ensure there is always an idempotency_key on POST requests" do
|
588
557
|
SecureRandom.expects(:uuid).at_least_once.returns("random_key")
|
589
|
-
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
590
|
-
with(headers: {"Idempotency-Key" => "random_key"})
|
591
|
-
to_return(body: JSON.generate(
|
558
|
+
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
559
|
+
.with(headers: { "Idempotency-Key" => "random_key" })
|
560
|
+
.to_return(body: JSON.generate(object: "charge"))
|
592
561
|
client = StripeClient.new
|
593
562
|
client.execute_request(:post, "/v1/charges")
|
594
563
|
end
|
595
564
|
|
596
|
-
should
|
565
|
+
should "ensure there is always an idempotency_key on DELETE requests" do
|
597
566
|
SecureRandom.expects(:uuid).at_least_once.returns("random_key")
|
598
|
-
stub_request(:delete, "#{Stripe.api_base}/v1/charges/ch_123")
|
599
|
-
with(headers: {"Idempotency-Key" => "random_key"})
|
600
|
-
to_return(body: JSON.generate(
|
567
|
+
stub_request(:delete, "#{Stripe.api_base}/v1/charges/ch_123")
|
568
|
+
.with(headers: { "Idempotency-Key" => "random_key" })
|
569
|
+
.to_return(body: JSON.generate(object: "charge"))
|
601
570
|
client = StripeClient.new
|
602
571
|
client.execute_request(:delete, "/v1/charges/ch_123")
|
603
572
|
end
|
604
573
|
|
605
|
-
should
|
574
|
+
should "not override a provided idempotency_key" do
|
606
575
|
# Note that this expectation looks like `:idempotency_key` instead of
|
607
576
|
# the header `Idempotency-Key` because it's user provided as seen
|
608
577
|
# below. The ones injected by the library itself look like headers
|
609
578
|
# (`Idempotency-Key`), but rest-client does allow this symbol
|
610
579
|
# formatting and will properly override the system generated one as
|
611
580
|
# expected.
|
612
|
-
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
613
|
-
with(headers: {"Idempotency-Key" => "provided_key"})
|
614
|
-
to_return(body: JSON.generate(
|
581
|
+
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
582
|
+
.with(headers: { "Idempotency-Key" => "provided_key" })
|
583
|
+
.to_return(body: JSON.generate(object: "charge"))
|
615
584
|
|
616
585
|
client = StripeClient.new
|
617
586
|
client.execute_request(:post, "/v1/charges",
|
618
|
-
|
587
|
+
headers: { idempotency_key: "provided_key" })
|
619
588
|
end
|
620
589
|
end
|
621
590
|
|
@@ -624,65 +593,65 @@ module Stripe
|
|
624
593
|
Stripe.stubs(:max_network_retries).returns(2)
|
625
594
|
end
|
626
595
|
|
627
|
-
should
|
596
|
+
should "retry failed requests and raise if error persists" do
|
628
597
|
StripeClient.expects(:sleep_time).at_least_once.returns(0)
|
629
|
-
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
630
|
-
to_raise(Errno::ECONNREFUSED.new)
|
598
|
+
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
599
|
+
.to_raise(Errno::ECONNREFUSED.new)
|
631
600
|
|
632
601
|
client = StripeClient.new
|
633
602
|
err = assert_raises Stripe::APIConnectionError do
|
634
|
-
client.execute_request(:post,
|
603
|
+
client.execute_request(:post, "/v1/charges")
|
635
604
|
end
|
636
605
|
assert_match(/Request was retried 2 times/, err.message)
|
637
606
|
end
|
638
607
|
|
639
|
-
should
|
608
|
+
should "retry failed requests and return successful response" do
|
640
609
|
StripeClient.expects(:sleep_time).at_least_once.returns(0)
|
641
610
|
|
642
611
|
i = 0
|
643
|
-
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
644
|
-
to_return
|
612
|
+
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
613
|
+
.to_return do |_|
|
645
614
|
if i < 2
|
646
615
|
i += 1
|
647
|
-
raise Errno::ECONNREFUSED
|
616
|
+
raise Errno::ECONNREFUSED
|
648
617
|
else
|
649
|
-
{ body: JSON.generate(
|
618
|
+
{ body: JSON.generate("id" => "myid") }
|
650
619
|
end
|
651
|
-
|
620
|
+
end
|
652
621
|
|
653
622
|
client = StripeClient.new
|
654
|
-
client.execute_request(:post,
|
623
|
+
client.execute_request(:post, "/v1/charges")
|
655
624
|
end
|
656
625
|
end
|
657
626
|
|
658
627
|
context "params serialization" do
|
659
|
-
should
|
628
|
+
should "allows empty strings in params" do
|
660
629
|
client = StripeClient.new
|
661
|
-
client.execute_request(:get,
|
662
|
-
|
663
|
-
|
630
|
+
client.execute_request(:get, "/v1/invoices/upcoming", params: {
|
631
|
+
customer: "cus_123",
|
632
|
+
coupon: "",
|
664
633
|
})
|
665
634
|
assert_requested(
|
666
635
|
:get,
|
667
636
|
"#{Stripe.api_base}/v1/invoices/upcoming?",
|
668
637
|
query: {
|
669
|
-
customer:
|
670
|
-
coupon:
|
638
|
+
customer: "cus_123",
|
639
|
+
coupon: "",
|
671
640
|
}
|
672
641
|
)
|
673
642
|
end
|
674
643
|
|
675
|
-
should
|
644
|
+
should "filter nils in params" do
|
676
645
|
client = StripeClient.new
|
677
|
-
client.execute_request(:get,
|
678
|
-
|
679
|
-
|
646
|
+
client.execute_request(:get, "/v1/invoices/upcoming", params: {
|
647
|
+
customer: "cus_123",
|
648
|
+
coupon: nil,
|
680
649
|
})
|
681
650
|
assert_requested(
|
682
651
|
:get,
|
683
652
|
"#{Stripe.api_base}/v1/invoices/upcoming?",
|
684
653
|
query: {
|
685
|
-
customer:
|
654
|
+
customer: "cus_123",
|
686
655
|
}
|
687
656
|
)
|
688
657
|
end
|
@@ -691,8 +660,8 @@ module Stripe
|
|
691
660
|
|
692
661
|
context "#request" do
|
693
662
|
should "return a result and response object" do
|
694
|
-
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
695
|
-
to_return(body: JSON.generate(
|
663
|
+
stub_request(:post, "#{Stripe.api_base}/v1/charges")
|
664
|
+
.to_return(body: JSON.generate(object: "charge"))
|
696
665
|
|
697
666
|
client = StripeClient.new
|
698
667
|
charge, resp = client.request { Charge.create }
|
@@ -704,7 +673,7 @@ module Stripe
|
|
704
673
|
|
705
674
|
should "return the value of given block" do
|
706
675
|
client = StripeClient.new
|
707
|
-
ret,
|
676
|
+
ret, = client.request { 7 }
|
708
677
|
assert_equal 7, ret
|
709
678
|
end
|
710
679
|
|
@@ -724,26 +693,26 @@ module Stripe
|
|
724
693
|
end
|
725
694
|
|
726
695
|
class SystemProfilerTest < Test::Unit::TestCase
|
727
|
-
context "#
|
696
|
+
context "#uname" do
|
728
697
|
should "run without failure" do
|
729
698
|
# Don't actually check the result because we try a variety of different
|
730
699
|
# strategies that will have different results depending on where this
|
731
700
|
# test and running. We're mostly making sure that no exception is thrown.
|
732
|
-
_ = StripeClient::SystemProfiler.
|
701
|
+
_ = StripeClient::SystemProfiler.uname
|
733
702
|
end
|
734
703
|
end
|
735
704
|
|
736
|
-
context "#
|
705
|
+
context "#uname_from_system" do
|
737
706
|
should "run without failure" do
|
738
707
|
# as above, just verify that an exception is not thrown
|
739
|
-
_ = StripeClient::SystemProfiler.
|
708
|
+
_ = StripeClient::SystemProfiler.uname_from_system
|
740
709
|
end
|
741
710
|
end
|
742
711
|
|
743
|
-
context "#
|
712
|
+
context "#uname_from_system_ver" do
|
744
713
|
should "run without failure" do
|
745
714
|
# as above, just verify that an exception is not thrown
|
746
|
-
_ = StripeClient::SystemProfiler.
|
715
|
+
_ = StripeClient::SystemProfiler.uname_from_system_ver
|
747
716
|
end
|
748
717
|
end
|
749
718
|
end
|