stripe 1.58.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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