stripe 1.58.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +4 -0
  3. data/.travis.yml +1 -2
  4. data/Gemfile +11 -12
  5. data/History.txt +8 -0
  6. data/README.md +44 -31
  7. data/Rakefile +1 -1
  8. data/VERSION +1 -1
  9. data/lib/stripe.rb +4 -344
  10. data/lib/stripe/account.rb +4 -4
  11. data/lib/stripe/api_operations/create.rb +2 -2
  12. data/lib/stripe/api_operations/delete.rb +2 -2
  13. data/lib/stripe/api_operations/list.rb +2 -2
  14. data/lib/stripe/api_operations/request.rb +9 -3
  15. data/lib/stripe/api_operations/save.rb +4 -6
  16. data/lib/stripe/api_resource.rb +2 -2
  17. data/lib/stripe/bank_account.rb +2 -2
  18. data/lib/stripe/bitcoin_receiver.rb +1 -1
  19. data/lib/stripe/charge.rb +12 -12
  20. data/lib/stripe/customer.rb +6 -6
  21. data/lib/stripe/dispute.rb +2 -3
  22. data/lib/stripe/errors.rb +20 -10
  23. data/lib/stripe/invoice.rb +4 -4
  24. data/lib/stripe/list_object.rb +2 -2
  25. data/lib/stripe/order.rb +4 -4
  26. data/lib/stripe/reversal.rb +1 -1
  27. data/lib/stripe/source.rb +2 -2
  28. data/lib/stripe/stripe_client.rb +396 -0
  29. data/lib/stripe/stripe_response.rb +48 -0
  30. data/lib/stripe/transfer.rb +2 -2
  31. data/lib/stripe/util.rb +6 -6
  32. data/lib/stripe/version.rb +1 -1
  33. data/spec/fixtures.json +0 -0
  34. data/spec/fixtures.yaml +0 -0
  35. data/spec/spec.json +0 -0
  36. data/spec/spec.yaml +0 -0
  37. data/stripe.gemspec +1 -1
  38. data/test/api_fixtures.rb +29 -0
  39. data/test/api_stub_helpers.rb +125 -0
  40. data/test/stripe/account_test.rb +153 -247
  41. data/test/stripe/alipay_account_test.rb +10 -2
  42. data/test/stripe/api_operations_test.rb +3 -3
  43. data/test/stripe/api_resource_test.rb +139 -499
  44. data/test/stripe/apple_pay_domain_test.rb +22 -23
  45. data/test/stripe/application_fee_refund_test.rb +22 -31
  46. data/test/stripe/application_fee_test.rb +6 -17
  47. data/test/stripe/balance_test.rb +3 -3
  48. data/test/stripe/bank_account_test.rb +31 -11
  49. data/test/stripe/bitcoin_receiver_test.rb +51 -42
  50. data/test/stripe/bitcoin_transaction_test.rb +11 -19
  51. data/test/stripe/charge_test.rb +39 -126
  52. data/test/stripe/country_spec_test.rb +7 -30
  53. data/test/stripe/coupon_test.rb +33 -17
  54. data/test/stripe/customer_card_test.rb +25 -46
  55. data/test/stripe/customer_test.rb +86 -81
  56. data/test/stripe/dispute_test.rb +27 -38
  57. data/test/stripe/errors_test.rb +2 -2
  58. data/test/stripe/file_upload_test.rb +32 -24
  59. data/test/stripe/invoice_item_test.rb +46 -10
  60. data/test/stripe/invoice_test.rb +48 -48
  61. data/test/stripe/list_object_test.rb +22 -31
  62. data/test/stripe/order_return_test.rb +11 -15
  63. data/test/stripe/order_test.rb +38 -51
  64. data/test/stripe/plan_test.rb +39 -18
  65. data/test/stripe/product_test.rb +29 -33
  66. data/test/stripe/recipient_card_test.rb +23 -40
  67. data/test/stripe/recipient_test.rb +39 -10
  68. data/test/stripe/refund_test.rb +20 -45
  69. data/test/stripe/reversal_test.rb +27 -31
  70. data/test/stripe/sku_test.rb +36 -19
  71. data/test/stripe/source_test.rb +26 -66
  72. data/test/stripe/stripe_client_test.rb +428 -0
  73. data/test/stripe/stripe_object_test.rb +6 -2
  74. data/test/stripe/stripe_response_test.rb +46 -0
  75. data/test/stripe/subscription_item_test.rb +37 -59
  76. data/test/stripe/subscription_test.rb +40 -176
  77. data/test/stripe/three_d_secure_test.rb +13 -12
  78. data/test/stripe/transfer_test.rb +36 -19
  79. data/test/stripe_test.rb +3 -36
  80. data/test/test_data.rb +5 -931
  81. data/test/test_helper.rb +21 -25
  82. metadata +22 -17
  83. data/test/stripe/charge_refund_test.rb +0 -67
  84. data/test/stripe/metadata_test.rb +0 -129
@@ -2,9 +2,17 @@ require File.expand_path('../../test_helper', __FILE__)
2
2
 
3
3
  module Stripe
4
4
  class AlipayAccountTest < Test::Unit::TestCase
5
- should "raise if accessing Stripe::Alipay.account directly" do
5
+ FIXTURE = API_FIXTURES.fetch(:alipay_account)
6
+
7
+ should "raise on #retrieve" do
8
+ assert_raises NotImplementedError do
9
+ Stripe::AlipayAccount.retrieve FIXTURE[:id]
10
+ end
11
+ end
12
+
13
+ should "raise on #update" do
6
14
  assert_raises NotImplementedError do
7
- Stripe::AlipayAccount.retrieve "card_12345"
15
+ Stripe::AlipayAccount.update FIXTURE[:id], {}
8
16
  end
9
17
  end
10
18
  end
@@ -13,9 +13,9 @@ module Stripe
13
13
 
14
14
  context ".update" do
15
15
  should "post the correct parameters to the resource URL" do
16
- @mock.expects(:post).once.
17
- with("#{Stripe.api_base}/v1/updateableresources/id", nil, 'foo=bar').
18
- returns(make_response({foo: 'bar'}))
16
+ stub_request(:post, "#{Stripe.api_base}/v1/updateableresources/id").
17
+ with(body: { foo: "bar" }).
18
+ to_return(body: JSON.generate({ foo: "bar" }))
19
19
  resource = UpdateableResource::update("id", { foo: "bar" })
20
20
  assert_equal('bar', resource.foo)
21
21
  end
@@ -24,30 +24,30 @@ module Stripe
24
24
  end
25
25
 
26
26
  should "creating a new APIResource should not fetch over the network" do
27
- @mock.expects(:get).never
28
27
  Stripe::Customer.new("someid")
28
+ assert_not_requested :get, %r{#{Stripe.api_base}/.*}
29
29
  end
30
30
 
31
31
  should "creating a new APIResource from a hash should not fetch over the network" do
32
- @mock.expects(:get).never
33
32
  Stripe::Customer.construct_from({
34
33
  :id => "somecustomer",
35
34
  :card => {:id => "somecard", :object => "card"},
36
35
  :object => "customer"
37
36
  })
37
+ assert_not_requested :get, %r{#{Stripe.api_base}/.*}
38
38
  end
39
39
 
40
40
  should "setting an attribute should not cause a network request" do
41
- @mock.expects(:get).never
42
- @mock.expects(:post).never
43
41
  c = Stripe::Customer.new("test_customer");
44
42
  c.card = {:id => "somecard", :object => "card"}
43
+ assert_not_requested :get, %r{#{Stripe.api_base}/.*}
44
+ assert_not_requested :post, %r{#{Stripe.api_base}/.*}
45
45
  end
46
46
 
47
47
  should "accessing id should not issue a fetch" do
48
- @mock.expects(:get).never
49
48
  c = Stripe::Customer.new("test_customer")
50
49
  c.id
50
+ assert_not_requested :get, %r{#{Stripe.api_base}/.*}
51
51
  end
52
52
 
53
53
  should "not specifying api credentials should raise an exception" do
@@ -73,129 +73,41 @@ module Stripe
73
73
  end
74
74
  end
75
75
 
76
- should "specifying invalid api credentials should raise an exception" do
77
- Stripe.api_key = "invalid"
78
- response = make_response(make_invalid_api_key_error, 401)
79
- assert_raises Stripe::AuthenticationError do
80
- @mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 401))
81
- Stripe::Customer.retrieve("failing_customer")
82
- end
83
- end
84
-
85
- should "AuthenticationErrors should have an http status, http body, and JSON body" do
86
- Stripe.api_key = "invalid"
87
- response = make_response(make_invalid_api_key_error, 401)
88
- begin
89
- @mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 401))
90
- Stripe::Customer.retrieve("failing_customer")
91
- rescue Stripe::AuthenticationError => e
92
- assert_equal(401, e.http_status)
93
- assert_equal(true, !!e.http_body)
94
- assert_equal(true, !!e.json_body[:error][:message])
95
- assert_equal(make_invalid_api_key_error[:error][:message], e.json_body[:error][:message])
96
- end
97
- end
98
-
99
76
  should "send expand on fetch properly" do
100
- @mock.expects(:get).once.
101
- with("#{Stripe.api_base}/v1/charges/ch_test_charge?expand[]=customer", nil, nil).
102
- returns(make_response(make_charge))
77
+ stub_request(:get, "#{Stripe.api_base}/v1/charges/ch_test_charge").
78
+ with(query: { "expand" => ["customer"] }).
79
+ to_return(body: JSON.generate(API_FIXTURES.fetch(:charge)))
103
80
 
104
81
  Stripe::Charge.retrieve({:id => 'ch_test_charge', :expand => [:customer]})
105
82
  end
106
83
 
107
84
  should "preserve expand across refreshes" do
108
- @mock.expects(:get).twice.
109
- with("#{Stripe.api_base}/v1/charges/ch_test_charge?expand[]=customer", nil, nil).
110
- returns(make_response(make_charge))
85
+ stub_request(:get, "#{Stripe.api_base}/v1/charges/ch_test_charge").
86
+ with(query: { "expand" => ["customer"] }).
87
+ to_return(body: JSON.generate(API_FIXTURES.fetch(:charge)))
111
88
 
112
89
  ch = Stripe::Charge.retrieve({:id => 'ch_test_charge', :expand => [:customer]})
113
90
  ch.refresh
114
91
  end
115
92
 
116
93
  should "send expand when fetching through ListObject" do
117
- @mock.expects(:get).once.
118
- with("#{Stripe.api_base}/v1/customers/c_test_customer", nil, nil).
119
- returns(make_response(make_customer))
94
+ stub_request(:get, "#{Stripe.api_base}/v1/customers/c_test_customer").
95
+ to_return(body: JSON.generate(API_FIXTURES.fetch(:customer)))
120
96
 
121
- @mock.expects(:get).once.
122
- with("#{Stripe.api_base}/v1/customers/c_test_customer/sources/cc_test_card?expand[]=customer", nil, nil).
123
- returns(make_response(make_card))
97
+ stub_request(:get, "#{Stripe.api_base}/v1/customers/c_test_customer/sources/cc_test_card").
98
+ with(query: { "expand" => ["customer"] }).
99
+ to_return(body: JSON.generate(API_FIXTURES.fetch(:customer)))
124
100
 
125
101
  customer = Stripe::Customer.retrieve('c_test_customer')
126
102
  customer.sources.retrieve({:id => 'cc_test_card', :expand => [:customer]})
127
103
  end
128
104
 
129
- should "send stripe account as header when set" do
130
- stripe_account = "acct_0000"
131
- Stripe.expects(:execute_request).with do |opts|
132
- opts[:headers][:stripe_account] == stripe_account
133
- end.returns(make_response(make_charge))
134
-
135
- Stripe::Charge.create({:card => {:number => '4242424242424242'}},
136
- {:stripe_account => stripe_account, :api_key => 'sk_test_local'})
137
- end
138
-
139
- should "not send stripe account as header when not set" do
140
- Stripe.expects(:execute_request).with do |opts|
141
- opts[:headers][:stripe_account].nil?
142
- end.returns(make_response(make_charge))
143
-
144
- Stripe::Charge.create({:card => {:number => '4242424242424242'}},
145
- 'sk_test_local')
146
- end
147
-
148
- should "handle error response with empty body" do
149
- response = make_response('', 500)
150
- @mock.expects(:post).once.raises(RestClient::ExceptionWithResponse.new(response, 500))
151
-
152
- e = assert_raises Stripe::APIError do
153
- Stripe::Charge.create
154
- end
155
-
156
- assert_equal 'Invalid response object from API: "" (HTTP response code was 500)', e.message
157
- end
158
-
159
- should "handle error response with non-object error value" do
160
- response = make_response('{"error": "foo"}', 500)
161
- @mock.expects(:post).once.raises(RestClient::ExceptionWithResponse.new(response, 500))
162
-
163
- e = assert_raises Stripe::APIError do
164
- Stripe::Charge.create
165
- end
166
-
167
- assert_equal 'Invalid response object from API: "{\"error\": \"foo\"}" (HTTP response code was 500)', e.message
168
- end
169
-
170
- should "have default open and read timeouts" do
171
- assert_equal Stripe.open_timeout, 30
172
- assert_equal Stripe.read_timeout, 80
173
- end
174
-
175
- should "allow configurable open and read timeouts" do
176
- original_timeouts = Stripe.open_timeout, Stripe.read_timeout
177
-
178
- begin
179
- Stripe.open_timeout = 999
180
- Stripe.read_timeout = 998
181
-
182
- Stripe.expects(:execute_request).with do |opts|
183
- opts[:open_timeout] == 999 && opts[:timeout] == 998
184
- end.returns(make_response(make_charge))
185
-
186
- Stripe::Charge.create({:card => {:number => '4242424242424242'}},
187
- 'sk_test_local')
188
- ensure
189
- Stripe.open_timeout, Stripe.read_timeout = original_timeouts
190
- end
191
- end
192
-
193
105
  context "when specifying per-object credentials" do
194
106
  context "with no global API key set" do
195
107
  should "use the per-object credential when creating" do
196
- Stripe.expects(:execute_request).with do |opts|
197
- opts[:headers]['Authorization'] == 'Bearer sk_test_local'
198
- end.returns(make_response(make_charge))
108
+ stub_request(:post, "#{Stripe.api_base}/v1/charges").
109
+ with(headers: {"Authorization" => "Bearer sk_test_local"}).
110
+ to_return(body: JSON.generate(API_FIXTURES.fetch(:charge)))
199
111
 
200
112
  Stripe::Charge.create({:card => {:number => '4242424242424242'}},
201
113
  'sk_test_local')
@@ -212,23 +124,21 @@ module Stripe
212
124
  end
213
125
 
214
126
  should "use the per-object credential when creating" do
215
- Stripe.expects(:execute_request).with do |opts|
216
- opts[:headers]['Authorization'] == 'Bearer local'
217
- end.returns(make_response(make_charge))
127
+ stub_request(:post, "#{Stripe.api_base}/v1/charges").
128
+ with(headers: {"Authorization" => "Bearer local"}).
129
+ to_return(body: JSON.generate(API_FIXTURES.fetch(:charge)))
218
130
 
219
131
  Stripe::Charge.create({:card => {:number => '4242424242424242'}},
220
132
  'local')
221
133
  end
222
134
 
223
135
  should "use the per-object credential when retrieving and making other calls" do
224
- Stripe.expects(:execute_request).with do |opts|
225
- opts[:url] == "#{Stripe.api_base}/v1/charges/ch_test_charge" &&
226
- opts[:headers]['Authorization'] == 'Bearer local'
227
- end.returns(make_response(make_charge))
228
- Stripe.expects(:execute_request).with do |opts|
229
- opts[:url] == "#{Stripe.api_base}/v1/charges/ch_test_charge/refunds" &&
230
- opts[:headers]['Authorization'] == 'Bearer local'
231
- end.returns(make_response(make_refund))
136
+ stub_request(:get, "#{Stripe.api_base}/v1/charges/ch_test_charge").
137
+ with(headers: {"Authorization" => "Bearer local"}).
138
+ to_return(body: JSON.generate(API_FIXTURES.fetch(:charge)))
139
+ stub_request(:post, "#{Stripe.api_base}/v1/charges/ch_test_charge/refunds").
140
+ with(headers: {"Authorization" => "Bearer local"}).
141
+ to_return(body: JSON.generate(API_FIXTURES.fetch(:refund)))
232
142
 
233
143
  ch = Stripe::Charge.retrieve('ch_test_charge', 'local')
234
144
  ch.refunds.create
@@ -237,125 +147,49 @@ module Stripe
237
147
  end
238
148
 
239
149
  context "with valid credentials" do
240
- should "send along the idempotency-key header" do
241
- Stripe.expects(:execute_request).with do |opts|
242
- opts[:headers][:idempotency_key] == 'bar'
243
- end.returns(make_response(make_charge))
244
-
245
- Stripe::Charge.create({:card => {:number => '4242424242424242'}}, {
246
- :idempotency_key => 'bar',
247
- :api_key => 'local',
248
- })
249
- end
250
-
251
150
  should "urlencode values in GET params" do
252
- response = make_response(make_charge_array)
253
- @mock.expects(:get).with("#{Stripe.api_base}/v1/charges?customer=test+customer", nil, nil).returns(response)
151
+ stub_request(:get, "#{Stripe.api_base}/v1/charges").
152
+ with(query: { customer: "test customer" }).
153
+ to_return(body: JSON.generate({
154
+ data: [API_FIXTURES.fetch(:charge)]
155
+ }))
254
156
  charges = Stripe::Charge.list(:customer => 'test customer').data
255
157
  assert charges.kind_of? Array
256
158
  end
257
159
 
258
160
  should "construct URL properly with base query parameters" do
259
- response = make_response(make_invoice_customer_array)
260
- @mock.expects(:get).with("#{Stripe.api_base}/v1/invoices?customer=test_customer", nil, nil).returns(response)
161
+ stub_request(:get, "#{Stripe.api_base}/v1/invoices").
162
+ with(query: { customer: "test_customer" }).
163
+ to_return(body: JSON.generate({
164
+ data: [API_FIXTURES.fetch(:invoice)],
165
+ url: "/v1/invoices"
166
+ }))
261
167
  invoices = Stripe::Invoice.list(:customer => 'test_customer')
262
168
 
263
- @mock.expects(:get).with("#{Stripe.api_base}/v1/invoices?customer=test_customer&paid=true", nil, nil).returns(response)
169
+ stub_request(:get, "#{Stripe.api_base}/v1/invoices").
170
+ with(query: { customer: "test_customer", paid: "true" }).
171
+ to_return(body: JSON.generate({
172
+ data: [API_FIXTURES.fetch(:invoice)],
173
+ url: "/v1/invoices"
174
+ }))
264
175
  invoices.list(:paid => true)
265
176
  end
266
177
 
267
- should "a 400 should give an InvalidRequestError with http status, body, and JSON body" do
268
- response = make_response(make_missing_id_error, 400)
269
- @mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 404))
270
- begin
271
- Stripe::Customer.retrieve("foo")
272
- rescue Stripe::InvalidRequestError => e
273
- assert_equal(400, e.http_status)
274
- assert_equal(true, !!e.http_body)
275
- assert_equal(true, e.json_body.kind_of?(Hash))
276
- end
277
- end
278
-
279
- should "a 401 should give an AuthenticationError with http status, body, and JSON body" do
280
- response = make_response(make_missing_id_error, 401)
281
- @mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 404))
282
- begin
283
- Stripe::Customer.retrieve("foo")
284
- rescue Stripe::AuthenticationError => e
285
- assert_equal(401, e.http_status)
286
- assert_equal(true, !!e.http_body)
287
- assert_equal(true, e.json_body.kind_of?(Hash))
288
- end
289
- end
290
-
291
- should "a 402 should give a CardError with http status, body, and JSON body" do
292
- response = make_response(make_missing_id_error, 402)
293
- @mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 404))
294
- begin
295
- Stripe::Customer.retrieve("foo")
296
- rescue Stripe::CardError => e
297
- assert_equal(402, e.http_status)
298
- assert_equal(true, !!e.http_body)
299
- assert_equal(true, e.json_body.kind_of?(Hash))
300
- end
301
- end
302
-
303
- should "a 403 should give a PermissionError with http status, body, and JSON body" do
304
- response = make_response(make_missing_id_error, 403)
305
- @mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 403))
306
- begin
307
- Stripe::Customer.retrieve("foo")
308
- rescue Stripe::PermissionError => e
309
- assert_equal(403, e.http_status)
310
- assert_equal(true, !!e.http_body)
311
- assert_equal(true, e.json_body.kind_of?(Hash))
312
- end
313
- end
314
-
315
- should "a 404 should give an InvalidRequestError with http status, body, and JSON body" do
316
- response = make_response(make_missing_id_error, 404)
317
- @mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 404))
318
- begin
319
- Stripe::Customer.retrieve("foo")
320
- rescue Stripe::InvalidRequestError => e
321
- assert_equal(404, e.http_status)
322
- assert_equal(true, !!e.http_body)
323
- assert_equal(true, e.json_body.kind_of?(Hash))
324
- end
325
- end
326
-
327
- should "a 429 should give a RateLimitError with http status, body, and JSON body" do
328
- response = make_response(make_rate_limit_error, 429)
329
- @mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 429))
330
- begin
331
- Stripe::Customer.retrieve("foo")
332
- rescue Stripe::RateLimitError => e
333
- assert_equal(429, e.http_status)
334
- assert_equal(true, !!e.http_body)
335
- assert_equal(true, e.json_body.kind_of?(Hash))
336
- end
337
- end
338
-
339
178
  should "setting a nil value for a param should exclude that param from the request" do
340
- @mock.expects(:get).with do |url, api_key, params|
341
- uri = URI(url)
342
- query = CGI.parse(uri.query)
343
- (url =~ %r{^#{Stripe.api_base}/v1/charges?} &&
344
- query.keys.sort == ['offset', 'sad'])
345
- end.returns(make_response({ :count => 1, :data => [make_charge] }))
179
+ stub_request(:get, "#{Stripe.api_base}/v1/charges").
180
+ with(query: { offset: 5, sad: false }).
181
+ to_return(body: JSON.generate({ :count => 1, :data => [API_FIXTURES.fetch(:charge)] }))
346
182
  Stripe::Charge.list(:count => nil, :offset => 5, :sad => false)
347
183
 
348
- @mock.expects(:post).with do |url, api_key, params|
349
- url == "#{Stripe.api_base}/v1/charges" &&
350
- api_key.nil? &&
351
- CGI.parse(params) == { 'amount' => ['50'], 'currency' => ['usd'] }
352
- end.returns(make_response({ :count => 1, :data => [make_charge] }))
184
+ stub_request(:post, "#{Stripe.api_base}/v1/charges").
185
+ with(body: { 'amount' => '50', 'currency' => 'usd' }).
186
+ to_return(body: JSON.generate({ :count => 1, :data => [API_FIXTURES.fetch(:charge)] }))
353
187
  Stripe::Charge.create(:amount => 50, :currency => 'usd', :card => { :number => nil })
354
188
  end
355
189
 
356
190
  should "requesting with a unicode ID should result in a request" do
357
- response = make_response(make_missing_id_error, 404)
358
- @mock.expects(:get).once.with("#{Stripe.api_base}/v1/customers/%E2%98%83", nil, nil).raises(RestClient::ExceptionWithResponse.new(response, 404))
191
+ stub_request(:get, "#{Stripe.api_base}/v1/customers/%E2%98%83").
192
+ to_return(body: JSON.generate(make_missing_id_error), status: 404)
359
193
  c = Stripe::Customer.new("☃")
360
194
  assert_raises(Stripe::InvalidRequestError) { c.refresh }
361
195
  end
@@ -366,28 +200,29 @@ module Stripe
366
200
  end
367
201
 
368
202
  should "making a GET request with parameters should have a query string and no body" do
369
- params = { :limit => 1 }
370
- @mock.expects(:get).once.with("#{Stripe.api_base}/v1/charges?limit=1", nil, nil).
371
- returns(make_response({ :data => [make_charge] }))
372
- Stripe::Charge.list(params)
203
+ stub_request(:get, "#{Stripe.api_base}/v1/charges").
204
+ with(query: { limit: 1 }).
205
+ to_return(body: JSON.generate({ :data => [API_FIXTURES.fetch(:charge)] }))
206
+ Stripe::Charge.list({ :limit => 1 })
373
207
  end
374
208
 
375
209
  should "making a POST request with parameters should have a body and no query string" do
376
- params = { :amount => 100, :currency => 'usd', :card => 'sc_token' }
377
- @mock.expects(:post).once.with do |url, get, post|
378
- get.nil? && CGI.parse(post) == {'amount' => ['100'], 'currency' => ['usd'], 'card' => ['sc_token']}
379
- end.returns(make_response(make_charge))
380
- Stripe::Charge.create(params)
210
+ stub_request(:post, "#{Stripe.api_base}/v1/charges").
211
+ with(body: {'amount' => '100', 'currency' => 'usd', 'card' => 'sc_token'}).
212
+ to_return(body: JSON.generate(API_FIXTURES.fetch(:charge)))
213
+ Stripe::Charge.create({ :amount => 100, :currency => 'usd', :card => 'sc_token' })
381
214
  end
382
215
 
383
216
  should "loading an object should issue a GET request" do
384
- @mock.expects(:get).once.returns(make_response(make_customer))
217
+ stub_request(:get, "#{Stripe.api_base}/v1/customers/test_customer").
218
+ to_return(body: JSON.generate(API_FIXTURES.fetch(:customer)))
385
219
  c = Stripe::Customer.new("test_customer")
386
220
  c.refresh
387
221
  end
388
222
 
389
223
  should "using array accessors should be the same as the method interface" do
390
- @mock.expects(:get).once.returns(make_response(make_customer))
224
+ stub_request(:get, "#{Stripe.api_base}/v1/customers/test_customer").
225
+ to_return(body: JSON.generate(API_FIXTURES.fetch(:customer)))
391
226
  c = Stripe::Customer.new("test_customer")
392
227
  c.refresh
393
228
  assert_equal c.created, c[:created]
@@ -397,37 +232,32 @@ module Stripe
397
232
  end
398
233
 
399
234
  should "accessing a property other than id or parent on an unfetched object should fetch it" do
400
- @mock.expects(:get).once.returns(make_response(make_customer))
235
+ stub_request(:get, "#{Stripe.api_base}/v1/charges").
236
+ with(query: { customer: "test_customer" }).
237
+ to_return(body: JSON.generate(API_FIXTURES.fetch(:customer)))
401
238
  c = Stripe::Customer.new("test_customer")
402
239
  c.charges
403
240
  end
404
241
 
405
242
  should "updating an object should issue a POST request with only the changed properties" do
406
- @mock.expects(:post).with do |url, api_key, params|
407
- url == "#{Stripe.api_base}/v1/customers/c_test_customer" && api_key.nil? && CGI.parse(params) == {'description' => ['another_mn']}
408
- end.once.returns(make_response(make_customer))
409
- c = Stripe::Customer.construct_from(make_customer)
243
+ stub_request(:post, "#{Stripe.api_base}/v1/customers/c_test_customer").
244
+ with(body: { 'description' => 'another_mn' }).
245
+ to_return(body: JSON.generate(API_FIXTURES.fetch(:customer)))
246
+ c = Stripe::Customer.construct_from(API_FIXTURES.fetch(:customer))
410
247
  c.description = "another_mn"
411
248
  c.save
412
249
  end
413
250
 
414
251
  should "updating should merge in returned properties" do
415
- @mock.expects(:post).once.returns(make_response(make_customer))
252
+ stub_request(:post, "#{Stripe.api_base}/v1/customers/c_test_customer").
253
+ with(body: { 'description' => 'another_mn' }).
254
+ to_return(body: JSON.generate(API_FIXTURES.fetch(:customer)))
416
255
  c = Stripe::Customer.new("c_test_customer")
417
256
  c.description = "another_mn"
418
257
  c.save
419
258
  assert_equal false, c.livemode
420
259
  end
421
260
 
422
- should "updating should send along the idempotency-key header" do
423
- Stripe.expects(:execute_request).with do |opts|
424
- opts[:headers][:idempotency_key] == 'bar'
425
- end.returns(make_response(make_customer))
426
- c = Stripe::Customer.new
427
- c.save({}, { :idempotency_key => 'bar' })
428
- assert_equal false, c.livemode
429
- end
430
-
431
261
  should "updating should fail if api_key is overwritten with nil" do
432
262
  c = Stripe::Customer.new
433
263
  assert_raises TypeError do
@@ -436,124 +266,52 @@ module Stripe
436
266
  end
437
267
 
438
268
  should "updating should use the supplied api_key" do
439
- Stripe.expects(:execute_request).with do |opts|
440
- opts[:headers]['Authorization'] == 'Bearer sk_test_local'
441
- end.returns(make_response(make_customer))
269
+ stub_request(:post, "#{Stripe.api_base}/v1/customers").
270
+ with(headers: {"Authorization" => "Bearer sk_test_local"}).
271
+ to_return(body: JSON.generate(API_FIXTURES.fetch(:customer)))
442
272
  c = Stripe::Customer.new
443
273
  c.save({}, { :api_key => 'sk_test_local' })
444
274
  assert_equal false, c.livemode
445
275
  end
446
276
 
447
277
  should "deleting should send no props and result in an object that has no props other deleted" do
448
- @mock.expects(:get).never
449
- @mock.expects(:post).never
450
- @mock.expects(:delete).with("#{Stripe.api_base}/v1/customers/c_test_customer", nil, nil).once.returns(make_response({ "id" => "test_customer", "deleted" => true }))
451
- c = Stripe::Customer.construct_from(make_customer)
278
+ stub_request(:delete, "#{Stripe.api_base}/v1/customers/c_test_customer").
279
+ to_return(body: JSON.generate({ "id" => "test_customer", "deleted" => true }))
280
+ c = Stripe::Customer.construct_from(API_FIXTURES.fetch(:customer))
452
281
  c.delete
453
- assert_equal true, c.deleted
454
-
455
- assert_raises NoMethodError do
456
- c.livemode
457
- end
458
- end
459
-
460
- should "loading an object with properties that have specific types should instantiate those classes" do
461
- @mock.expects(:get).once.returns(make_response(make_charge))
462
- c = Stripe::Charge.retrieve("test_charge")
463
- assert c.card.kind_of?(Stripe::StripeObject) && c.card.object == 'card'
464
282
  end
465
283
 
466
284
  should "loading all of an APIResource should return an array of recursively instantiated objects" do
467
- @mock.expects(:get).once.returns(make_response(make_charge_array))
468
- c = Stripe::Charge.list.data
469
- assert c.kind_of? Array
470
- assert c[0].kind_of? Stripe::Charge
471
- assert c[0].card.kind_of?(Stripe::StripeObject) && c[0].card.object == 'card'
285
+ stub_request(:get, "#{Stripe.api_base}/v1/charges").
286
+ to_return(body: JSON.generate({
287
+ data: [API_FIXTURES.fetch(:charge)]
288
+ }))
289
+ charges = Stripe::Charge.list.data
290
+ assert charges.kind_of? Array
291
+ assert charges[0].kind_of? Stripe::Charge
292
+ assert charges[0].card.kind_of?(Stripe::StripeObject)
472
293
  end
473
294
 
474
295
  should "passing in a stripe_account header should pass it through on call" do
475
- Stripe.expects(:execute_request).with do |opts|
476
- opts[:method] == :get &&
477
- opts[:url] == "#{Stripe.api_base}/v1/customers/c_test_customer" &&
478
- opts[:headers][:stripe_account] == 'acct_abc'
479
- end.once.returns(make_response(make_customer))
296
+ stub_request(:get, "#{Stripe.api_base}/v1/customers/c_test_customer").
297
+ with(headers: {"Stripe-Account" => "acct_abc"}).
298
+ to_return(body: JSON.generate(API_FIXTURES.fetch(:customer)))
480
299
  Stripe::Customer.retrieve("c_test_customer", {:stripe_account => 'acct_abc'})
481
300
  end
482
301
 
483
302
  should "passing in a stripe_account header should pass it through on save" do
484
- Stripe.expects(:execute_request).with do |opts|
485
- opts[:method] == :get &&
486
- opts[:url] == "#{Stripe.api_base}/v1/customers/c_test_customer" &&
487
- opts[:headers][:stripe_account] == 'acct_abc'
488
- end.once.returns(make_response(make_customer))
303
+ stub_request(:get, "#{Stripe.api_base}/v1/customers/c_test_customer").
304
+ with(headers: {"Stripe-Account" => "acct_abc"}).
305
+ to_return(body: JSON.generate(API_FIXTURES.fetch(:customer)))
489
306
  c = Stripe::Customer.retrieve("c_test_customer", {:stripe_account => 'acct_abc'})
490
307
 
491
- Stripe.expects(:execute_request).with do |opts|
492
- opts[:method] == :post &&
493
- opts[:url] == "#{Stripe.api_base}/v1/customers/c_test_customer" &&
494
- opts[:headers][:stripe_account] == 'acct_abc' &&
495
- opts[:payload] == 'description=FOO'
496
- end.once.returns(make_response(make_customer))
308
+ stub_request(:post, "#{Stripe.api_base}/v1/customers/c_test_customer").
309
+ with(headers: {"Stripe-Account" => "acct_abc"}).
310
+ to_return(body: JSON.generate(API_FIXTURES.fetch(:customer)))
497
311
  c.description = 'FOO'
498
312
  c.save
499
313
  end
500
314
 
501
- context "error checking" do
502
-
503
- should "404s should raise an InvalidRequestError" do
504
- response = make_response(make_missing_id_error, 404)
505
- @mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 404))
506
-
507
- rescued = false
508
- begin
509
- Stripe::Customer.new("test_customer").refresh
510
- assert false #shouldn't get here either
511
- rescue Stripe::InvalidRequestError => e # we don't use assert_raises because we want to examine e
512
- rescued = true
513
- assert e.kind_of? Stripe::InvalidRequestError
514
- assert_equal "id", e.param
515
- assert_equal "Missing id", e.message
516
- end
517
-
518
- assert_equal true, rescued
519
- end
520
-
521
- should "5XXs should raise an APIError" do
522
- response = make_response(make_api_error, 500)
523
- @mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 500))
524
-
525
- rescued = false
526
- begin
527
- Stripe::Customer.new("test_customer").refresh
528
- assert false #shouldn't get here either
529
- rescue Stripe::APIError => e # we don't use assert_raises because we want to examine e
530
- rescued = true
531
- assert e.kind_of? Stripe::APIError
532
- end
533
-
534
- assert_equal true, rescued
535
- end
536
-
537
- should "402s should raise a CardError" do
538
- response = make_response(make_invalid_exp_year_error, 402)
539
- @mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 402))
540
-
541
- rescued = false
542
- begin
543
- Stripe::Customer.new("test_customer").refresh
544
- assert false #shouldn't get here either
545
- rescue Stripe::CardError => e # we don't use assert_raises because we want to examine e
546
- rescued = true
547
- assert e.kind_of? Stripe::CardError
548
- assert_equal "invalid_expiry_year", e.code
549
- assert_equal "exp_year", e.param
550
- assert_equal "Your card's expiration year is invalid", e.message
551
- end
552
-
553
- assert_equal true, rescued
554
- end
555
- end
556
-
557
315
  should 'add key to nested objects' do
558
316
  acct = Stripe::Account.construct_from({
559
317
  :id => 'myid',
@@ -564,7 +322,9 @@ module Stripe
564
322
  }
565
323
  })
566
324
 
567
- @mock.expects(:post).once.with("#{Stripe.api_base}/v1/accounts/myid", nil, 'legal_entity[first_name]=Bob').returns(make_response({"id" => "myid"}))
325
+ stub_request(:post, "#{Stripe.api_base}/v1/accounts/myid").
326
+ with(body: { legal_entity: { first_name: "Bob" } }).
327
+ to_return(body: JSON.generate({ "id" => "myid" }))
568
328
 
569
329
  acct.legal_entity.first_name = 'Bob'
570
330
  acct.save
@@ -572,27 +332,31 @@ module Stripe
572
332
 
573
333
  should 'save nothing if nothing changes' do
574
334
  acct = Stripe::Account.construct_from({
575
- :id => 'myid',
335
+ :id => 'acct_id',
576
336
  :metadata => {
577
337
  :key => 'value'
578
338
  }
579
339
  })
580
340
 
581
- @mock.expects(:post).once.with("#{Stripe.api_base}/v1/accounts/myid", nil, '').returns(make_response({"id" => "myid"}))
341
+ stub_request(:post, "#{Stripe.api_base}/v1/accounts/acct_id").
342
+ with(body: {}).
343
+ to_return(body: JSON.generate({ "id" => "acct_id" }))
582
344
 
583
345
  acct.save
584
346
  end
585
347
 
586
348
  should 'not save nested API resources' do
587
349
  ch = Stripe::Charge.construct_from({
588
- :id => 'charge_id',
350
+ :id => 'ch_id',
589
351
  :customer => {
590
352
  :object => 'customer',
591
353
  :id => 'customer_id'
592
354
  }
593
355
  })
594
356
 
595
- @mock.expects(:post).once.with("#{Stripe.api_base}/v1/charges/charge_id", nil, '').returns(make_response({"id" => "charge_id"}))
357
+ stub_request(:post, "#{Stripe.api_base}/v1/charges/ch_id").
358
+ with(body: {}).
359
+ to_return(body: JSON.generate({ "id" => "ch_id" }))
596
360
 
597
361
  ch.customer.description = 'Bob'
598
362
  ch.save
@@ -610,14 +374,9 @@ module Stripe
610
374
  }
611
375
  })
612
376
 
613
- @mock.expects(:post).once.with(
614
- "#{Stripe.api_base}/v1/accounts/myid",
615
- nil,
616
- any_of(
617
- 'legal_entity[address][line1]=Test2&legal_entity[address][city]=',
618
- 'legal_entity[address][city]=&legal_entity[address][line1]=Test2'
619
- )
620
- ).returns(make_response({"id" => "myid"}))
377
+ stub_request(:post, "#{Stripe.api_base}/v1/accounts/myid").
378
+ with(body: { legal_entity: { address: { line1: "Test2", city: "" } } }).
379
+ to_return(body: JSON.generate({ "id" => "my_id" }))
621
380
 
622
381
  acct.legal_entity.address = {:line1 => 'Test2'}
623
382
  acct.save
@@ -629,7 +388,9 @@ module Stripe
629
388
  :legal_entity => {}
630
389
  })
631
390
 
632
- @mock.expects(:post).once.with("#{Stripe.api_base}/v1/accounts/myid", nil, 'legal_entity[additional_owners][0][first_name]=Bob').returns(make_response({"id" => "myid"}))
391
+ stub_request(:post, "#{Stripe.api_base}/v1/accounts/myid").
392
+ with(body: { legal_entity: { additional_owners: [{ first_name: "Bob" }] } }).
393
+ to_return(body: JSON.generate({ "id" => "myid" }))
633
394
 
634
395
  acct.legal_entity.additional_owners = [{:first_name => 'Bob'}]
635
396
  acct.save
@@ -643,7 +404,12 @@ module Stripe
643
404
  }
644
405
  })
645
406
 
646
- @mock.expects(:post).once.with("#{Stripe.api_base}/v1/accounts/myid", nil, 'legal_entity[additional_owners][0][first_name]=Bob').returns(make_response({"id" => "myid"}))
407
+ # Note that this isn't a perfect check because we're using webmock's
408
+ # data decoding, which isn't aware of the Stripe array encoding that we
409
+ # use here.
410
+ stub_request(:post, "#{Stripe.api_base}/v1/accounts/myid").
411
+ with(body: { legal_entity: { additional_owners: [{ first_name: "Bob" }] } }).
412
+ to_return(body: JSON.generate({ "id" => "myid" }))
647
413
 
648
414
  acct.legal_entity.additional_owners << {:first_name => 'Bob'}
649
415
  acct.save
@@ -657,7 +423,12 @@ module Stripe
657
423
  }
658
424
  })
659
425
 
660
- @mock.expects(:post).once.with("#{Stripe.api_base}/v1/accounts/myid", nil, 'legal_entity[additional_owners][1][first_name]=Janet').returns(make_response({"id" => "myid"}))
426
+ # Note that this isn't a perfect check because we're using webmock's
427
+ # data decoding, which isn't aware of the Stripe array encoding that we
428
+ # use here.
429
+ stub_request(:post, "#{Stripe.api_base}/v1/accounts/myid").
430
+ with(body: { legal_entity: { additional_owners: [{ first_name: "Janet" }] } }).
431
+ to_return(body: JSON.generate({ "id" => "myid" }))
661
432
 
662
433
  acct.legal_entity.additional_owners[1].first_name = 'Janet'
663
434
  acct.save
@@ -672,7 +443,9 @@ module Stripe
672
443
  :currencies_supported => ['usd', 'cad']
673
444
  })
674
445
 
675
- @mock.expects(:post).once.with("#{Stripe.api_base}/v1/accounts/myid", nil, '').returns(make_response({"id" => "myid"}))
446
+ stub_request(:post, "#{Stripe.api_base}/v1/accounts/myid").
447
+ with(body: {}).
448
+ to_return(body: JSON.generate({ "id" => "myid" }))
676
449
 
677
450
  acct.save
678
451
  end
@@ -685,7 +458,9 @@ module Stripe
685
458
  }
686
459
  })
687
460
 
688
- @mock.expects(:post).once.with("#{Stripe.api_base}/v1/accounts/myid", nil, '').returns(make_response({"id" => "myid"}))
461
+ stub_request(:post, "#{Stripe.api_base}/v1/accounts/myid").
462
+ with(body: {}).
463
+ to_return(body: JSON.generate({ "id" => "myid" }))
689
464
 
690
465
  acct.save
691
466
  end
@@ -696,8 +471,9 @@ module Stripe
696
471
  :display_name => nil,
697
472
  })
698
473
 
699
- @mock.expects(:post).once.with("#{Stripe.api_base}/v1/accounts", nil, 'display_name=stripe').
700
- returns(make_response({"id" => "charge_id"}))
474
+ stub_request(:post, "#{Stripe.api_base}/v1/accounts").
475
+ with(body: { display_name: "stripe" }).
476
+ to_return(body: JSON.generate({ "id" => "acct_123" }))
701
477
 
702
478
  account.display_name = 'stripe'
703
479
  account.save
@@ -709,148 +485,12 @@ module Stripe
709
485
  :display_name => nil,
710
486
  })
711
487
 
712
- @mock.expects(:post).once.with("#{Stripe.api_base}/v1/accounts", nil, 'display_name=stripe&metadata[key]=value').
713
- returns(make_response({"id" => "charge_id"}))
488
+ stub_request(:post, "#{Stripe.api_base}/v1/accounts").
489
+ with(body: { display_name: "stripe", metadata: { key: "value" } }).
490
+ to_return(body: JSON.generate({ "id" => "acct_123" }))
714
491
 
715
492
  account.save(:display_name => 'stripe', :metadata => {:key => 'value' })
716
493
  end
717
494
  end
718
-
719
- context "with retries" do
720
- setup do
721
- Stripe.stubs(:max_network_retries).returns(2)
722
- end
723
-
724
- should 'retry failed network requests if specified and raise if error persists' do
725
- Stripe.expects(:sleep_time).at_least_once.returns(0)
726
- @mock.expects(:post).times(3).with('https://api.stripe.com/v1/charges', nil, 'amount=50&currency=usd').
727
- raises(Errno::ECONNREFUSED.new)
728
-
729
- err = assert_raises Stripe::APIConnectionError do
730
- Stripe::Charge.create(:amount => 50, :currency => 'usd', :card => { :number => nil })
731
- end
732
- assert_match(/Request was retried 2 times/, err.message)
733
- end
734
-
735
- should 'retry failed network requests if specified and return successful response' do
736
- Stripe.expects(:sleep_time).at_least_once.returns(0)
737
- response = make_response({"id" => "myid"})
738
- @mock.expects(:post).times(2).with('https://api.stripe.com/v1/charges', nil, 'amount=50&currency=usd').
739
- raises(Errno::ECONNREFUSED.new).
740
- then.
741
- returns(response)
742
-
743
- result = Stripe::Charge.create(:amount => 50, :currency => 'usd', :card => { :number => nil })
744
- assert_equal "myid", result.id
745
- end
746
-
747
- should 'not add an idempotency key to GET requests' do
748
- SecureRandom.expects(:uuid).times(0)
749
- Stripe.expects(:execute_request).with do |opts|
750
- opts[:headers][:idempotency_key].nil?
751
- end.returns(make_response({"id" => "myid"}))
752
-
753
- Stripe::Charge.list
754
- end
755
-
756
- should 'ensure there is always an idempotency_key on POST requests' do
757
- SecureRandom.expects(:uuid).at_least_once.returns("random_key")
758
- Stripe.expects(:execute_request).with do |opts|
759
- opts[:headers]['Idempotency-Key'] == "random_key"
760
- end.returns(make_response({"id" => "myid"}))
761
-
762
- Stripe::Charge.create(:amount => 50, :currency => 'usd', :card => { :number => nil })
763
- end
764
-
765
- should 'ensure there is always an idempotency_key on DELETE requests' do
766
- SecureRandom.expects(:uuid).at_least_once.returns("random_key")
767
- Stripe.expects(:execute_request).with do |opts|
768
- opts[:headers]['Idempotency-Key'] == "random_key"
769
- end.returns(make_response({"id" => "myid"}))
770
-
771
- c = Stripe::Customer.construct_from(make_customer)
772
- c.delete
773
- end
774
-
775
- should 'not override a provided idempotency_key' do
776
- # Note that this expectation looks like `:idempotency_key` instead of
777
- # the header `Idempotency-Key` because it's user provided as seen
778
- # below. The ones injected by the library itself look like headers
779
- # (`Idempotency-Key`), but rest-client does allow this symbol
780
- # formatting and will properly override the system generated one as
781
- # expected.
782
- Stripe.expects(:execute_request).with do |opts|
783
- opts[:headers][:idempotency_key] == "provided_key"
784
- end.returns(make_response({"id" => "myid"}))
785
-
786
- Stripe::Charge.create({:amount => 50, :currency => 'usd', :card => { :number => nil }}, {:idempotency_key => 'provided_key'})
787
- end
788
-
789
- end
790
-
791
- context ".should_retry?" do
792
- setup do
793
- Stripe.stubs(:max_network_retries).returns(2)
794
- end
795
-
796
- should 'retry on a low-level network error' do
797
- assert Stripe.should_retry?(Errno::ECONNREFUSED.new, 0)
798
- end
799
-
800
- should 'retry on timeout' do
801
- assert Stripe.should_retry?(RestClient::RequestTimeout.new, 0)
802
- end
803
-
804
- should 'retry on a conflict' do
805
- assert Stripe.should_retry?(RestClient::Conflict.new, 0)
806
- end
807
-
808
- should 'not retry at maximum count' do
809
- refute Stripe.should_retry?(RuntimeError.new, Stripe.max_network_retries)
810
- end
811
-
812
- should 'not retry on a certificate validation error' do
813
- refute Stripe.should_retry?(RestClient::SSLCertificateNotVerified.new('message'), 0)
814
- end
815
- end
816
-
817
- context ".sleep_time" do
818
- should "should grow exponentially" do
819
- Stripe.stubs(:rand).returns(1)
820
- Stripe.stubs(:max_network_retry_delay).returns(999)
821
- assert_equal(Stripe.initial_network_retry_delay, Stripe.sleep_time(1))
822
- assert_equal(Stripe.initial_network_retry_delay * 2, Stripe.sleep_time(2))
823
- assert_equal(Stripe.initial_network_retry_delay * 4, Stripe.sleep_time(3))
824
- assert_equal(Stripe.initial_network_retry_delay * 8, Stripe.sleep_time(4))
825
- end
826
-
827
- should "enforce the max_network_retry_delay" do
828
- Stripe.stubs(:rand).returns(1)
829
- Stripe.stubs(:initial_network_retry_delay).returns(1)
830
- Stripe.stubs(:max_network_retry_delay).returns(2)
831
- assert_equal(1, Stripe.sleep_time(1))
832
- assert_equal(2, Stripe.sleep_time(2))
833
- assert_equal(2, Stripe.sleep_time(3))
834
- assert_equal(2, Stripe.sleep_time(4))
835
- end
836
-
837
- should "add some randomness" do
838
- random_value = 0.8
839
- Stripe.stubs(:rand).returns(random_value)
840
- Stripe.stubs(:initial_network_retry_delay).returns(1)
841
- Stripe.stubs(:max_network_retry_delay).returns(8)
842
-
843
- base_value = Stripe.initial_network_retry_delay * (0.5 * (1 + random_value))
844
-
845
- # the initial value cannot be smaller than the base,
846
- # so the randomness is ignored
847
- assert_equal(Stripe.initial_network_retry_delay, Stripe.sleep_time(1))
848
-
849
- # after the first one, the randomness is applied
850
- assert_equal(base_value * 2, Stripe.sleep_time(2))
851
- assert_equal(base_value * 4, Stripe.sleep_time(3))
852
- assert_equal(base_value * 8, Stripe.sleep_time(4))
853
- end
854
- end
855
495
  end
856
496
  end