stripe 2.0.3 → 5.55.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (214) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1036 -0
  3. data/CODE_OF_CONDUCT.md +77 -0
  4. data/Gemfile +24 -23
  5. data/History.txt +1 -593
  6. data/Makefile +7 -0
  7. data/README.md +252 -53
  8. data/Rakefile +18 -24
  9. data/VERSION +1 -1
  10. data/bin/stripe-console +5 -3
  11. data/lib/stripe/api_operations/create.rb +4 -2
  12. data/lib/stripe/api_operations/delete.rb +31 -3
  13. data/lib/stripe/api_operations/list.rb +4 -13
  14. data/lib/stripe/api_operations/nested_resource.rb +73 -0
  15. data/lib/stripe/api_operations/request.rb +92 -10
  16. data/lib/stripe/api_operations/save.rb +25 -13
  17. data/lib/stripe/api_operations/search.rb +19 -0
  18. data/lib/stripe/api_resource.rb +55 -11
  19. data/lib/stripe/api_resource_test_helpers.rb +47 -0
  20. data/lib/stripe/connection_manager.rb +200 -0
  21. data/lib/stripe/error_object.rb +93 -0
  22. data/lib/stripe/errors.rb +98 -13
  23. data/lib/stripe/instrumentation.rb +84 -0
  24. data/lib/stripe/list_object.rb +55 -21
  25. data/lib/stripe/multipart_encoder.rb +131 -0
  26. data/lib/stripe/oauth.rb +65 -0
  27. data/lib/stripe/object_types.rb +119 -0
  28. data/lib/stripe/{account.rb → resources/account.rb} +75 -38
  29. data/lib/stripe/resources/account_link.rb +10 -0
  30. data/lib/stripe/resources/alipay_account.rb +34 -0
  31. data/lib/stripe/{apple_pay_domain.rb → resources/apple_pay_domain.rb} +6 -1
  32. data/lib/stripe/resources/application_fee.rb +14 -0
  33. data/lib/stripe/resources/application_fee_refund.rb +31 -0
  34. data/lib/stripe/resources/balance.rb +8 -0
  35. data/lib/stripe/resources/balance_transaction.rb +10 -0
  36. data/lib/stripe/resources/bank_account.rb +43 -0
  37. data/lib/stripe/resources/billing_portal/configuration.rb +14 -0
  38. data/lib/stripe/resources/billing_portal/session.rb +12 -0
  39. data/lib/stripe/{bitcoin_receiver.rb → resources/bitcoin_receiver.rb} +8 -4
  40. data/lib/stripe/resources/bitcoin_transaction.rb +16 -0
  41. data/lib/stripe/resources/capability.rb +34 -0
  42. data/lib/stripe/resources/card.rb +38 -0
  43. data/lib/stripe/resources/cash_balance.rb +22 -0
  44. data/lib/stripe/resources/charge.rb +32 -0
  45. data/lib/stripe/resources/checkout/session.rb +27 -0
  46. data/lib/stripe/resources/country_spec.rb +10 -0
  47. data/lib/stripe/{coupon.rb → resources/coupon.rb} +6 -1
  48. data/lib/stripe/resources/credit_note.rb +33 -0
  49. data/lib/stripe/resources/credit_note_line_item.rb +8 -0
  50. data/lib/stripe/resources/customer.rb +74 -0
  51. data/lib/stripe/resources/customer_balance_transaction.rb +31 -0
  52. data/lib/stripe/resources/discount.rb +8 -0
  53. data/lib/stripe/resources/dispute.rb +22 -0
  54. data/lib/stripe/resources/ephemeral_key.rb +20 -0
  55. data/lib/stripe/resources/event.rb +10 -0
  56. data/lib/stripe/resources/exchange_rate.rb +10 -0
  57. data/lib/stripe/resources/file.rb +36 -0
  58. data/lib/stripe/resources/file_link.rb +12 -0
  59. data/lib/stripe/resources/financial_connections/account.rb +31 -0
  60. data/lib/stripe/resources/financial_connections/account_owner.rb +10 -0
  61. data/lib/stripe/resources/financial_connections/account_ownership.rb +10 -0
  62. data/lib/stripe/resources/financial_connections/session.rb +12 -0
  63. data/lib/stripe/resources/funding_instructions.rb +16 -0
  64. data/lib/stripe/resources/identity/verification_report.rb +12 -0
  65. data/lib/stripe/resources/identity/verification_session.rb +35 -0
  66. data/lib/stripe/resources/invoice.rb +83 -0
  67. data/lib/stripe/{invoice_item.rb → resources/invoice_item.rb} +6 -1
  68. data/lib/stripe/resources/invoice_line_item.rb +8 -0
  69. data/lib/stripe/resources/issuing/authorization.rb +34 -0
  70. data/lib/stripe/resources/issuing/card.rb +25 -0
  71. data/lib/stripe/resources/issuing/card_details.rb +10 -0
  72. data/lib/stripe/resources/issuing/cardholder.rb +14 -0
  73. data/lib/stripe/resources/issuing/dispute.rb +25 -0
  74. data/lib/stripe/resources/issuing/transaction.rb +13 -0
  75. data/lib/stripe/resources/line_item.rb +8 -0
  76. data/lib/stripe/resources/login_link.rb +15 -0
  77. data/lib/stripe/resources/mandate.rb +8 -0
  78. data/lib/stripe/resources/order.rb +33 -0
  79. data/lib/stripe/resources/order_return.rb +10 -0
  80. data/lib/stripe/resources/payment_intent.rb +82 -0
  81. data/lib/stripe/resources/payment_link.rb +23 -0
  82. data/lib/stripe/resources/payment_method.rb +33 -0
  83. data/lib/stripe/resources/payout.rb +33 -0
  84. data/lib/stripe/resources/person.rb +32 -0
  85. data/lib/stripe/{plan.rb → resources/plan.rb} +5 -0
  86. data/lib/stripe/resources/price.rb +21 -0
  87. data/lib/stripe/resources/product.rb +22 -0
  88. data/lib/stripe/resources/promotion_code.rb +12 -0
  89. data/lib/stripe/resources/quote.rb +105 -0
  90. data/lib/stripe/resources/radar/early_fraud_warning.rb +12 -0
  91. data/lib/stripe/resources/radar/value_list.rb +15 -0
  92. data/lib/stripe/resources/radar/value_list_item.rb +14 -0
  93. data/lib/stripe/resources/recipient.rb +14 -0
  94. data/lib/stripe/resources/recipient_transfer.rb +7 -0
  95. data/lib/stripe/resources/refund.rb +42 -0
  96. data/lib/stripe/resources/reporting/report_run.rb +13 -0
  97. data/lib/stripe/resources/reporting/report_type.rb +13 -0
  98. data/lib/stripe/resources/reversal.rb +30 -0
  99. data/lib/stripe/resources/review.rb +21 -0
  100. data/lib/stripe/resources/setup_attempt.rb +10 -0
  101. data/lib/stripe/resources/setup_intent.rb +43 -0
  102. data/lib/stripe/resources/shipping_rate.rb +12 -0
  103. data/lib/stripe/resources/sigma/scheduled_query_run.rb +16 -0
  104. data/lib/stripe/{sku.rb → resources/sku.rb} +7 -2
  105. data/lib/stripe/resources/source.rb +47 -0
  106. data/lib/stripe/resources/source_transaction.rb +8 -0
  107. data/lib/stripe/resources/subscription.rb +35 -0
  108. data/lib/stripe/resources/subscription_item.rb +26 -0
  109. data/lib/stripe/resources/subscription_schedule.rb +33 -0
  110. data/lib/stripe/resources/tax_code.rb +10 -0
  111. data/lib/stripe/resources/tax_id.rb +27 -0
  112. data/lib/stripe/{product.rb → resources/tax_rate.rb} +7 -3
  113. data/lib/stripe/resources/terminal/configuration.rb +15 -0
  114. data/lib/stripe/resources/terminal/connection_token.rb +12 -0
  115. data/lib/stripe/resources/terminal/location.rb +15 -0
  116. data/lib/stripe/resources/terminal/reader.rb +75 -0
  117. data/lib/stripe/resources/test_helpers/test_clock.rb +25 -0
  118. data/lib/stripe/{three_d_secure.rb → resources/three_d_secure.rb} +5 -0
  119. data/lib/stripe/resources/token.rb +10 -0
  120. data/lib/stripe/resources/topup.rb +23 -0
  121. data/lib/stripe/resources/transfer.rb +27 -0
  122. data/lib/stripe/resources/usage_record.rb +8 -0
  123. data/lib/stripe/resources/usage_record_summary.rb +8 -0
  124. data/lib/stripe/{recipient.rb → resources/webhook_endpoint.rb} +6 -5
  125. data/lib/stripe/resources.rb +100 -0
  126. data/lib/stripe/search_result_object.rb +86 -0
  127. data/lib/stripe/singleton_api_resource.rb +10 -4
  128. data/lib/stripe/stripe_client.rb +886 -223
  129. data/lib/stripe/stripe_configuration.rb +194 -0
  130. data/lib/stripe/stripe_object.rb +301 -132
  131. data/lib/stripe/stripe_response.rb +89 -27
  132. data/lib/stripe/util.rb +272 -122
  133. data/lib/stripe/version.rb +3 -1
  134. data/lib/stripe/webhook.rb +121 -0
  135. data/lib/stripe.rb +94 -116
  136. data/stripe.gemspec +35 -16
  137. metadata +127 -156
  138. data/.gitattributes +0 -4
  139. data/.github/ISSUE_TEMPLATE.md +0 -5
  140. data/.gitignore +0 -5
  141. data/.travis.yml +0 -15
  142. data/lib/stripe/alipay_account.rb +0 -20
  143. data/lib/stripe/application_fee.rb +0 -20
  144. data/lib/stripe/application_fee_refund.rb +0 -18
  145. data/lib/stripe/balance.rb +0 -4
  146. data/lib/stripe/balance_transaction.rb +0 -9
  147. data/lib/stripe/bank_account.rb +0 -28
  148. data/lib/stripe/bitcoin_transaction.rb +0 -9
  149. data/lib/stripe/card.rb +0 -25
  150. data/lib/stripe/charge.rb +0 -80
  151. data/lib/stripe/country_spec.rb +0 -9
  152. data/lib/stripe/customer.rb +0 -77
  153. data/lib/stripe/dispute.rb +0 -15
  154. data/lib/stripe/event.rb +0 -5
  155. data/lib/stripe/file_upload.rb +0 -31
  156. data/lib/stripe/invoice.rb +0 -27
  157. data/lib/stripe/order.rb +0 -27
  158. data/lib/stripe/order_return.rb +0 -9
  159. data/lib/stripe/refund.rb +0 -7
  160. data/lib/stripe/reversal.rb +0 -18
  161. data/lib/stripe/source.rb +0 -11
  162. data/lib/stripe/subscription.rb +0 -31
  163. data/lib/stripe/subscription_item.rb +0 -12
  164. data/lib/stripe/token.rb +0 -5
  165. data/lib/stripe/transfer.rb +0 -16
  166. data/openapi/fixtures.json +0 -1383
  167. data/openapi/fixtures.yaml +0 -1130
  168. data/openapi/spec.json +0 -19749
  169. data/openapi/spec.yaml +0 -15359
  170. data/test/api_fixtures.rb +0 -29
  171. data/test/api_stub_helpers.rb +0 -125
  172. data/test/stripe/account_test.rb +0 -204
  173. data/test/stripe/alipay_account_test.rb +0 -19
  174. data/test/stripe/api_operations_test.rb +0 -31
  175. data/test/stripe/api_resource_test.rb +0 -496
  176. data/test/stripe/apple_pay_domain_test.rb +0 -33
  177. data/test/stripe/application_fee_refund_test.rb +0 -38
  178. data/test/stripe/application_fee_test.rb +0 -14
  179. data/test/stripe/balance_test.rb +0 -11
  180. data/test/stripe/bank_account_test.rb +0 -41
  181. data/test/stripe/bitcoin_receiver_test.rb +0 -70
  182. data/test/stripe/bitcoin_transaction_test.rb +0 -21
  183. data/test/stripe/charge_test.rb +0 -59
  184. data/test/stripe/country_spec_test.rb +0 -20
  185. data/test/stripe/coupon_test.rb +0 -44
  186. data/test/stripe/customer_card_test.rb +0 -42
  187. data/test/stripe/customer_test.rb +0 -116
  188. data/test/stripe/dispute_test.rb +0 -42
  189. data/test/stripe/errors_test.rb +0 -18
  190. data/test/stripe/file_upload_test.rb +0 -66
  191. data/test/stripe/invoice_item_test.rb +0 -55
  192. data/test/stripe/invoice_test.rb +0 -66
  193. data/test/stripe/list_object_test.rb +0 -170
  194. data/test/stripe/order_return_test.rb +0 -21
  195. data/test/stripe/order_test.rb +0 -59
  196. data/test/stripe/plan_test.rb +0 -52
  197. data/test/stripe/product_test.rb +0 -47
  198. data/test/stripe/recipient_card_test.rb +0 -40
  199. data/test/stripe/recipient_test.rb +0 -50
  200. data/test/stripe/refund_test.rb +0 -39
  201. data/test/stripe/reversal_test.rb +0 -43
  202. data/test/stripe/sku_test.rb +0 -50
  203. data/test/stripe/source_test.rb +0 -43
  204. data/test/stripe/stripe_client_test.rb +0 -440
  205. data/test/stripe/stripe_object_test.rb +0 -361
  206. data/test/stripe/stripe_response_test.rb +0 -46
  207. data/test/stripe/subscription_item_test.rb +0 -54
  208. data/test/stripe/subscription_test.rb +0 -60
  209. data/test/stripe/three_d_secure_test.rb +0 -23
  210. data/test/stripe/transfer_test.rb +0 -50
  211. data/test/stripe/util_test.rb +0 -149
  212. data/test/stripe_test.rb +0 -41
  213. data/test/test_data.rb +0 -59
  214. data/test/test_helper.rb +0 -41
@@ -1,440 +0,0 @@
1
- require File.expand_path('../../test_helper', __FILE__)
2
-
3
- module Stripe
4
- class StripeClientTest < Test::Unit::TestCase
5
- context ".active_client" do
6
- should "be .default_client outside of #request" do
7
- assert_equal StripeClient.default_client, StripeClient.active_client
8
- end
9
-
10
- should "be active client inside of #request" do
11
- client = StripeClient.new
12
- client.request do
13
- assert_equal client, StripeClient.active_client
14
- end
15
- end
16
- end
17
-
18
- context ".default_client" do
19
- should "be a StripeClient" do
20
- assert_kind_of StripeClient, StripeClient.default_client
21
- end
22
- end
23
-
24
- context ".default_conn" do
25
- should "be a Faraday::Connection" do
26
- assert_kind_of Faraday::Connection, StripeClient.default_conn
27
- end
28
-
29
- should "be a different connection on each thread" do
30
- other_thread_conn = nil
31
- thread = Thread.new do
32
- other_thread_conn = StripeClient.default_conn
33
- end
34
- thread.join
35
- refute_equal StripeClient.default_conn, other_thread_conn
36
- end
37
- end
38
-
39
- context ".should_retry?" do
40
- setup do
41
- Stripe.stubs(:max_network_retries).returns(2)
42
- end
43
-
44
- should 'retry on timeout' do
45
- assert StripeClient.should_retry?(Faraday::TimeoutError.new(""), 0)
46
- end
47
-
48
- should 'retry on a failed connection' do
49
- assert StripeClient.should_retry?(Faraday::ConnectionFailed.new(""), 0)
50
- end
51
-
52
- should 'retry on a conflict' do
53
- error = make_rate_limit_error
54
- e = Faraday::ClientError.new(error[:error][:message], { status: 409 })
55
- assert StripeClient.should_retry?(e, 0)
56
- end
57
-
58
- should 'not retry at maximum count' do
59
- refute StripeClient.should_retry?(RuntimeError.new, Stripe.max_network_retries)
60
- end
61
-
62
- should 'not retry on a certificate validation error' do
63
- refute StripeClient.should_retry?(Faraday::SSLError.new(""), 0)
64
- end
65
- end
66
-
67
- context ".sleep_time" do
68
- should "should grow exponentially" do
69
- StripeClient.stubs(:rand).returns(1)
70
- Stripe.stubs(:max_network_retry_delay).returns(999)
71
- assert_equal(Stripe.initial_network_retry_delay, StripeClient.sleep_time(1))
72
- assert_equal(Stripe.initial_network_retry_delay * 2, StripeClient.sleep_time(2))
73
- assert_equal(Stripe.initial_network_retry_delay * 4, StripeClient.sleep_time(3))
74
- assert_equal(Stripe.initial_network_retry_delay * 8, StripeClient.sleep_time(4))
75
- end
76
-
77
- should "enforce the max_network_retry_delay" do
78
- StripeClient.stubs(:rand).returns(1)
79
- Stripe.stubs(:initial_network_retry_delay).returns(1)
80
- Stripe.stubs(:max_network_retry_delay).returns(2)
81
- assert_equal(1, StripeClient.sleep_time(1))
82
- assert_equal(2, StripeClient.sleep_time(2))
83
- assert_equal(2, StripeClient.sleep_time(3))
84
- assert_equal(2, StripeClient.sleep_time(4))
85
- end
86
-
87
- should "add some randomness" do
88
- random_value = 0.8
89
- StripeClient.stubs(:rand).returns(random_value)
90
- Stripe.stubs(:initial_network_retry_delay).returns(1)
91
- Stripe.stubs(:max_network_retry_delay).returns(8)
92
-
93
- base_value = Stripe.initial_network_retry_delay * (0.5 * (1 + random_value))
94
-
95
- # the initial value cannot be smaller than the base,
96
- # so the randomness is ignored
97
- assert_equal(Stripe.initial_network_retry_delay, StripeClient.sleep_time(1))
98
-
99
- # after the first one, the randomness is applied
100
- assert_equal(base_value * 2, StripeClient.sleep_time(2))
101
- assert_equal(base_value * 4, StripeClient.sleep_time(3))
102
- assert_equal(base_value * 8, StripeClient.sleep_time(4))
103
- end
104
- end
105
-
106
- context "#initialize" do
107
- should "set Stripe.default_conn" do
108
- client = StripeClient.new
109
- assert_equal StripeClient.default_conn, client.conn
110
- end
111
-
112
- should "set a different connection if one was specified" do
113
- conn = Faraday.new
114
- client = StripeClient.new(conn)
115
- assert_equal conn, client.conn
116
- end
117
- end
118
-
119
- context "#execute_request" do
120
- context "headers" do
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(API_FIXTURES.fetch(:account)))
125
-
126
- client = StripeClient.new
127
- client.execute_request(:post, '/v1/account',
128
- headers: { "Stripe-Account" => "bar" }
129
- )
130
- end
131
-
132
- 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(API_FIXTURES.fetch(:account)))
136
-
137
- client = StripeClient.new
138
- client.execute_request(:post, '/v1/account',
139
- headers: { :stripe_account => "bar" }
140
- )
141
- end
142
- end
143
-
144
- context "Stripe-Account header" do
145
- should "use a globally set header" do
146
- Stripe.stripe_account = 'acct_1234'
147
-
148
- stub_request(:post, "#{Stripe.api_base}/v1/account").
149
- with(headers: {"Stripe-Account" => Stripe.stripe_account}).
150
- to_return(body: JSON.generate(API_FIXTURES.fetch(:account)))
151
-
152
- client = StripeClient.new
153
- client.execute_request(:post, '/v1/account')
154
- end
155
-
156
- should "use a locally set header" do
157
- stripe_account = "acct_0000"
158
- stub_request(:post, "#{Stripe.api_base}/v1/account").
159
- with(headers: {"Stripe-Account" => stripe_account}).
160
- to_return(body: JSON.generate(API_FIXTURES.fetch(:account)))
161
-
162
- client = StripeClient.new
163
- client.execute_request(:post, '/v1/account',
164
- headers: { :stripe_account => stripe_account }
165
- )
166
- end
167
-
168
- should "not send it otherwise" do
169
- stub_request(:post, "#{Stripe.api_base}/v1/account").
170
- with { |req|
171
- req.headers["Stripe-Account"].nil?
172
- }.to_return(body: JSON.generate(API_FIXTURES.fetch(:account)))
173
-
174
- client = StripeClient.new
175
- client.execute_request(:post, '/v1/account')
176
- end
177
- end
178
-
179
- context "error handling" do
180
- should "handle error response with empty body" do
181
- stub_request(:post, "#{Stripe.api_base}/v1/charges").
182
- to_return(body: '', status: 500)
183
-
184
- client = StripeClient.new
185
- e = assert_raises Stripe::APIError do
186
- client.execute_request(:post, '/v1/charges')
187
- end
188
-
189
- assert_equal 'Invalid response object from API: "" (HTTP response code was 500)', e.message
190
- end
191
-
192
- should "handle success response with empty body" do
193
- stub_request(:post, "#{Stripe.api_base}/v1/charges").
194
- to_return(body: '', status: 200)
195
-
196
- client = StripeClient.new
197
- e = assert_raises Stripe::APIError do
198
- client.execute_request(:post, '/v1/charges')
199
- end
200
-
201
- assert_equal 'Invalid response object from API: "" (HTTP response code was 200)', e.message
202
- end
203
-
204
- should "handle error response with non-object error value" do
205
- stub_request(:post, "#{Stripe.api_base}/v1/charges").
206
- to_return(body: JSON.generate({ error: "foo" }), status: 500)
207
-
208
- client = StripeClient.new
209
- e = assert_raises Stripe::APIError do
210
- client.execute_request(:post, '/v1/charges')
211
- end
212
-
213
- assert_equal 'Invalid response object from API: "{\"error\":\"foo\"}" (HTTP response code was 500)', e.message
214
- end
215
-
216
- should "raise InvalidRequestError on 400" do
217
- stub_request(:post, "#{Stripe.api_base}/v1/charges").
218
- to_return(body: JSON.generate(make_missing_id_error), status: 400)
219
- client = StripeClient.new
220
- begin
221
- client.execute_request(:post, '/v1/charges')
222
- rescue Stripe::InvalidRequestError => e
223
- assert_equal(400, e.http_status)
224
- assert_equal(true, !!e.http_body)
225
- assert_equal(true, e.json_body.kind_of?(Hash))
226
- end
227
- end
228
-
229
- should "raise AuthenticationError on 401" do
230
- stub_request(:post, "#{Stripe.api_base}/v1/charges").
231
- to_return(body: JSON.generate(make_missing_id_error), status: 401)
232
- client = StripeClient.new
233
- begin
234
- client.execute_request(:post, '/v1/charges')
235
- rescue Stripe::AuthenticationError => e
236
- assert_equal(401, e.http_status)
237
- assert_equal(true, !!e.http_body)
238
- assert_equal(true, e.json_body.kind_of?(Hash))
239
- end
240
- end
241
-
242
- should "raise CardError on 402" do
243
- stub_request(:post, "#{Stripe.api_base}/v1/charges").
244
- to_return(body: JSON.generate(make_missing_id_error), status: 402)
245
- client = StripeClient.new
246
- begin
247
- client.execute_request(:post, '/v1/charges')
248
- rescue Stripe::CardError => e
249
- assert_equal(402, e.http_status)
250
- assert_equal(true, !!e.http_body)
251
- assert_equal(true, e.json_body.kind_of?(Hash))
252
- end
253
- end
254
-
255
- should "raise PermissionError on 403" do
256
- stub_request(:post, "#{Stripe.api_base}/v1/charges").
257
- to_return(body: JSON.generate(make_missing_id_error), status: 403)
258
- client = StripeClient.new
259
- begin
260
- client.execute_request(:post, '/v1/charges')
261
- rescue Stripe::PermissionError => e
262
- assert_equal(403, e.http_status)
263
- assert_equal(true, !!e.http_body)
264
- assert_equal(true, e.json_body.kind_of?(Hash))
265
- end
266
- end
267
-
268
- should "raise InvalidRequestError on 404" do
269
- stub_request(:post, "#{Stripe.api_base}/v1/charges").
270
- to_return(body: JSON.generate(make_missing_id_error), status: 404)
271
- client = StripeClient.new
272
- begin
273
- client.execute_request(:post, '/v1/charges')
274
- rescue Stripe::InvalidRequestError => e
275
- assert_equal(404, e.http_status)
276
- assert_equal(true, !!e.http_body)
277
- assert_equal(true, e.json_body.kind_of?(Hash))
278
- end
279
- end
280
-
281
- should "raise RateLimitError on 429" do
282
- stub_request(:post, "#{Stripe.api_base}/v1/charges").
283
- to_return(body: JSON.generate(make_rate_limit_error), status: 429)
284
- client = StripeClient.new
285
- begin
286
- client.execute_request(:post, '/v1/charges')
287
- rescue Stripe::RateLimitError => e
288
- assert_equal(429, e.http_status)
289
- assert_equal(true, !!e.http_body)
290
- assert_equal(true, e.json_body.kind_of?(Hash))
291
- end
292
- end
293
- end
294
-
295
- context "idempotency keys" do
296
- setup do
297
- Stripe.stubs(:max_network_retries).returns(2)
298
- end
299
-
300
- should 'not add an idempotency key to GET requests' do
301
- SecureRandom.expects(:uuid).times(0)
302
- stub_request(:get, "#{Stripe.api_base}/v1/charges/#{API_FIXTURES.fetch(:charge)[:id]}").
303
- with { |req|
304
- req.headers['Idempotency-Key'].nil?
305
- }.to_return(body: JSON.generate(API_FIXTURES.fetch(:charge)))
306
- client = StripeClient.new
307
- client.execute_request(:get, "/v1/charges/#{API_FIXTURES.fetch(:charge)[:id]}")
308
- end
309
-
310
- should 'ensure there is always an idempotency_key on POST requests' do
311
- SecureRandom.expects(:uuid).at_least_once.returns("random_key")
312
- stub_request(:post, "#{Stripe.api_base}/v1/charges").
313
- with(headers: {"Idempotency-Key" => "random_key"}).
314
- to_return(body: JSON.generate(API_FIXTURES.fetch(:charge)))
315
- client = StripeClient.new
316
- client.execute_request(:post, "/v1/charges")
317
- end
318
-
319
- should 'ensure there is always an idempotency_key on DELETE requests' do
320
- SecureRandom.expects(:uuid).at_least_once.returns("random_key")
321
- stub_request(:delete, "#{Stripe.api_base}/v1/charges/#{API_FIXTURES.fetch(:charge)[:id]}").
322
- with(headers: {"Idempotency-Key" => "random_key"}).
323
- to_return(body: JSON.generate(API_FIXTURES.fetch(:charge)))
324
- client = StripeClient.new
325
- client.execute_request(:delete, "/v1/charges/#{API_FIXTURES.fetch(:charge)[:id]}")
326
- end
327
-
328
- should 'not override a provided idempotency_key' do
329
- # Note that this expectation looks like `:idempotency_key` instead of
330
- # the header `Idempotency-Key` because it's user provided as seen
331
- # below. The ones injected by the library itself look like headers
332
- # (`Idempotency-Key`), but rest-client does allow this symbol
333
- # formatting and will properly override the system generated one as
334
- # expected.
335
- stub_request(:post, "#{Stripe.api_base}/v1/charges").
336
- with(headers: {"Idempotency-Key" => "provided_key"}).
337
- to_return(body: JSON.generate(API_FIXTURES.fetch(:charge)))
338
-
339
- client = StripeClient.new
340
- client.execute_request(:post, "/v1/charges",
341
- headers: {:idempotency_key => 'provided_key'})
342
- end
343
- end
344
-
345
- context "retry logic" do
346
- setup do
347
- Stripe.stubs(:max_network_retries).returns(2)
348
- end
349
-
350
- should 'retry failed requests and raise if error persists' do
351
- StripeClient.expects(:sleep_time).at_least_once.returns(0)
352
- stub_request(:post, "#{Stripe.api_base}/v1/charges").
353
- to_raise(Errno::ECONNREFUSED.new)
354
-
355
- client = StripeClient.new
356
- err = assert_raises Stripe::APIConnectionError do
357
- client.execute_request(:post, '/v1/charges')
358
- end
359
- assert_match(/Request was retried 2 times/, err.message)
360
- end
361
-
362
- should 'retry failed requests and return successful response' do
363
- StripeClient.expects(:sleep_time).at_least_once.returns(0)
364
-
365
- i = 0
366
- stub_request(:post, "#{Stripe.api_base}/v1/charges").
367
- to_return { |_|
368
- if i < 2
369
- i += 1
370
- raise Errno::ECONNREFUSED.new
371
- else
372
- { body: JSON.generate({"id" => "myid"}) }
373
- end
374
- }
375
-
376
- client = StripeClient.new
377
- client.execute_request(:post, '/v1/charges')
378
- end
379
- end
380
- end
381
-
382
- context "#request" do
383
- should "return a result and response object" do
384
- stub_request(:post, "#{Stripe.api_base}/v1/charges").
385
- to_return(body: JSON.generate(API_FIXTURES.fetch(:charge)))
386
-
387
- client = StripeClient.new
388
- charge, resp = client.request { Charge.create }
389
-
390
- assert charge.is_a?(Charge)
391
- assert resp.is_a?(StripeResponse)
392
- assert_equal 200, resp.http_status
393
- end
394
-
395
- should "return the value of given block" do
396
- client = StripeClient.new
397
- ret, _ = client.request { 7 }
398
- assert_equal 7, ret
399
- end
400
-
401
- should "reset local thread state after a call" do
402
- begin
403
- Thread.current[:stripe_client] = :stripe_client
404
-
405
- client = StripeClient.new
406
- client.request {}
407
-
408
- assert_equal :stripe_client, Thread.current[:stripe_client]
409
- ensure
410
- Thread.current[:stripe_client] = nil
411
- end
412
- end
413
- end
414
- end
415
-
416
- class SystemProfilerTest < Test::Unit::TestCase
417
- context "#get_uname" do
418
- should "run without failure" do
419
- # Don't actually check the result because we try a variety of different
420
- # strategies that will have different results depending on where this
421
- # test and running. We're mostly making sure that no exception is thrown.
422
- _ = StripeClient::SystemProfiler.get_uname
423
- end
424
- end
425
-
426
- context "#get_uname_from_system" do
427
- should "run without failure" do
428
- # as above, just verify that an exception is not thrown
429
- _ = StripeClient::SystemProfiler.get_uname_from_system
430
- end
431
- end
432
-
433
- context "#get_uname_from_system_ver" do
434
- should "run without failure" do
435
- # as above, just verify that an exception is not thrown
436
- _ = StripeClient::SystemProfiler.get_uname_from_system_ver
437
- end
438
- end
439
- end
440
- end