stripe 3.0.3 → 3.1.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 (57) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +23 -0
  3. data/Gemfile +1 -2
  4. data/History.txt +4 -0
  5. data/README.md +28 -3
  6. data/Rakefile +0 -12
  7. data/VERSION +1 -1
  8. data/lib/stripe.rb +24 -0
  9. data/lib/stripe/stripe_client.rb +166 -19
  10. data/lib/stripe/util.rb +127 -8
  11. data/lib/stripe/version.rb +1 -1
  12. data/test/api_stub_helpers.rb +0 -125
  13. data/test/stripe/account_test.rb +11 -13
  14. data/test/stripe/alipay_account_test.rb +2 -4
  15. data/test/stripe/api_resource_test.rb +112 -76
  16. data/test/stripe/apple_pay_domain_test.rb +4 -6
  17. data/test/stripe/application_fee_refund_test.rb +2 -5
  18. data/test/stripe/application_fee_test.rb +0 -2
  19. data/test/stripe/bank_account_test.rb +8 -13
  20. data/test/stripe/bitcoin_receiver_test.rb +13 -16
  21. data/test/stripe/bitcoin_transaction_test.rb +2 -4
  22. data/test/stripe/charge_test.rb +9 -11
  23. data/test/stripe/country_spec_test.rb +2 -4
  24. data/test/stripe/coupon_test.rb +6 -8
  25. data/test/stripe/customer_card_test.rb +13 -9
  26. data/test/stripe/customer_test.rb +16 -18
  27. data/test/stripe/dispute_test.rb +8 -10
  28. data/test/stripe/file_upload_test.rb +3 -3
  29. data/test/stripe/invoice_item_test.rb +9 -11
  30. data/test/stripe/invoice_line_item_test.rb +0 -1
  31. data/test/stripe/invoice_test.rb +39 -21
  32. data/test/stripe/list_object_test.rb +1 -1
  33. data/test/stripe/login_link_test.rb +6 -7
  34. data/test/stripe/order_return_test.rb +2 -4
  35. data/test/stripe/order_test.rb +10 -12
  36. data/test/stripe/payout_test.rb +7 -9
  37. data/test/stripe/plan_test.rb +8 -10
  38. data/test/stripe/product_test.rb +8 -10
  39. data/test/stripe/recipient_card_test.rb +13 -9
  40. data/test/stripe/recipient_test.rb +8 -10
  41. data/test/stripe/refund_test.rb +7 -9
  42. data/test/stripe/reversal_test.rb +5 -7
  43. data/test/stripe/sku_test.rb +9 -11
  44. data/test/stripe/source_test.rb +16 -15
  45. data/test/stripe/stripe_client_test.rb +190 -26
  46. data/test/stripe/subscription_item_test.rb +12 -14
  47. data/test/stripe/subscription_test.rb +10 -12
  48. data/test/stripe/three_d_secure_test.rb +3 -5
  49. data/test/stripe/transfer_test.rb +7 -9
  50. data/test/stripe/util_test.rb +164 -0
  51. data/test/test_helper.rb +33 -18
  52. metadata +2 -8
  53. data/openapi/fixtures.json +0 -1896
  54. data/openapi/fixtures.yaml +0 -1505
  55. data/openapi/spec2.json +0 -24601
  56. data/openapi/spec2.yaml +0 -18801
  57. data/test/api_fixtures.rb +0 -29
@@ -2,8 +2,6 @@ require File.expand_path('../../test_helper', __FILE__)
2
2
 
3
3
  module Stripe
4
4
  class ProductTest < Test::Unit::TestCase
5
- FIXTURE = API_FIXTURES.fetch(:product)
6
-
7
5
  should "be listable" do
8
6
  products = Stripe::Product.list
9
7
  assert_requested :get, "#{Stripe.api_base}/v1/products"
@@ -12,8 +10,8 @@ module Stripe
12
10
  end
13
11
 
14
12
  should "be retrievable" do
15
- product = Stripe::Product.retrieve(FIXTURE[:id])
16
- assert_requested :get, "#{Stripe.api_base}/v1/products/#{FIXTURE[:id]}"
13
+ product = Stripe::Product.retrieve("prod_123")
14
+ assert_requested :get, "#{Stripe.api_base}/v1/products/prod_123"
17
15
  assert product.kind_of?(Stripe::Product)
18
16
  end
19
17
 
@@ -25,22 +23,22 @@ module Stripe
25
23
  end
26
24
 
27
25
  should "be saveable" do
28
- product = Stripe::Product.retrieve(FIXTURE[:id])
26
+ product = Stripe::Product.retrieve("prod_123")
29
27
  product.metadata['key'] = 'value'
30
28
  product.save
31
- assert_requested :post, "#{Stripe.api_base}/v1/products/#{FIXTURE[:id]}"
29
+ assert_requested :post, "#{Stripe.api_base}/v1/products/#{product.id}"
32
30
  end
33
31
 
34
32
  should "be updateable" do
35
- product = Stripe::Product.update(FIXTURE[:id], metadata: {foo: 'bar'})
36
- assert_requested :post, "#{Stripe.api_base}/v1/products/#{FIXTURE[:id]}"
33
+ product = Stripe::Product.update("prod_123", metadata: {foo: 'bar'})
34
+ assert_requested :post, "#{Stripe.api_base}/v1/products/prod_123"
37
35
  assert product.kind_of?(Stripe::Product)
38
36
  end
39
37
 
40
38
  should "be deletable" do
41
- product = Stripe::Product.retrieve(FIXTURE[:id])
39
+ product = Stripe::Product.retrieve("prod_123")
42
40
  product = product.delete
43
- assert_requested :delete, "#{Stripe.api_base}/v1/products/#{FIXTURE[:id]}"
41
+ assert_requested :delete, "#{Stripe.api_base}/v1/products/#{product.id}"
44
42
  assert product.kind_of?(Stripe::Product)
45
43
  end
46
44
  end
@@ -2,11 +2,8 @@ require File.expand_path('../../test_helper', __FILE__)
2
2
 
3
3
  module Stripe
4
4
  class RecipientCardTest < Test::Unit::TestCase
5
- FIXTURE = API_FIXTURES.fetch(:source)
6
-
7
5
  setup do
8
- @recipient =
9
- Stripe::Recipient.retrieve(API_FIXTURES.fetch(:transfer_recipient)[:id])
6
+ @recipient = Stripe::Recipient.retrieve("rp_123")
10
7
  end
11
8
 
12
9
  should "be listable" do
@@ -17,24 +14,31 @@ module Stripe
17
14
 
18
15
  should "be creatable" do
19
16
  card = @recipient.cards.create(
20
- card: API_FIXTURES.fetch(:token)[:id]
17
+ card: "tok_123"
21
18
  )
22
19
  assert_requested :post, "#{Stripe.api_base}/v1/recipients/#{@recipient.id}/cards"
23
20
  assert card.kind_of?(Stripe::Card)
24
21
  end
25
22
 
26
23
  should "be deletable" do
27
- card = Stripe::Card.construct_from(FIXTURE.merge(recipient: @recipient.id))
24
+ card = Stripe::Card.construct_from({
25
+ id: "card_123",
26
+ recipient: @recipient.id
27
+ })
28
28
  card = card.delete
29
- assert_requested :delete, "#{Stripe.api_base}/v1/recipients/#{@recipient.id}/cards/#{FIXTURE[:id]}"
29
+ assert_requested :delete, "#{Stripe.api_base}/v1/recipients/#{@recipient.id}/cards/card_123"
30
30
  assert card.kind_of?(Stripe::Card)
31
31
  end
32
32
 
33
33
  should "be saveable" do
34
- card = Stripe::Card.construct_from(FIXTURE.merge(recipient: @recipient.id))
34
+ card = Stripe::Card.construct_from({
35
+ id: "card_123",
36
+ metadata: {},
37
+ recipient: @recipient.id
38
+ })
35
39
  card.metadata['key'] = 'value'
36
40
  card.save
37
- assert_requested :post, "#{Stripe.api_base}/v1/recipients/#{@recipient.id}/cards/#{FIXTURE[:id]}"
41
+ assert_requested :post, "#{Stripe.api_base}/v1/recipients/#{@recipient.id}/cards/card_123"
38
42
  end
39
43
  end
40
44
  end
@@ -2,8 +2,6 @@ require File.expand_path('../../test_helper', __FILE__)
2
2
 
3
3
  module Stripe
4
4
  class RecipientTest < Test::Unit::TestCase
5
- FIXTURE = API_FIXTURES.fetch(:transfer_recipient)
6
-
7
5
  should "be listable" do
8
6
  recipients = Stripe::Recipient.list
9
7
  assert_requested :get, "#{Stripe.api_base}/v1/recipients"
@@ -12,8 +10,8 @@ module Stripe
12
10
  end
13
11
 
14
12
  should "be retrievable" do
15
- recipient = Stripe::Recipient.retrieve(FIXTURE[:id])
16
- assert_requested :get, "#{Stripe.api_base}/v1/recipients/#{FIXTURE[:id]}"
13
+ recipient = Stripe::Recipient.retrieve("rp_123")
14
+ assert_requested :get, "#{Stripe.api_base}/v1/recipients/rp_123"
17
15
  assert recipient.kind_of?(Stripe::Recipient)
18
16
  end
19
17
 
@@ -27,22 +25,22 @@ module Stripe
27
25
  end
28
26
 
29
27
  should "be saveable" do
30
- recipient = Stripe::Recipient.retrieve(FIXTURE[:id])
28
+ recipient = Stripe::Recipient.retrieve("rp_123")
31
29
  recipient.metadata['key'] = 'value'
32
30
  recipient.save
33
- assert_requested :post, "#{Stripe.api_base}/v1/recipients/#{FIXTURE[:id]}"
31
+ assert_requested :post, "#{Stripe.api_base}/v1/recipients/#{recipient.id}"
34
32
  end
35
33
 
36
34
  should "be updateable" do
37
- recipient = Stripe::Recipient.update(FIXTURE[:id], metadata: {foo: 'bar'})
38
- assert_requested :post, "#{Stripe.api_base}/v1/recipients/#{FIXTURE[:id]}"
35
+ recipient = Stripe::Recipient.update("rp_123", metadata: {foo: 'bar'})
36
+ assert_requested :post, "#{Stripe.api_base}/v1/recipients/rp_123"
39
37
  assert recipient.kind_of?(Stripe::Recipient)
40
38
  end
41
39
 
42
40
  should "be deletable" do
43
- recipient = Stripe::Recipient.retrieve(FIXTURE[:id])
41
+ recipient = Stripe::Recipient.retrieve("rp_123")
44
42
  recipient = recipient.delete
45
- assert_requested :delete, "#{Stripe.api_base}/v1/recipients/#{FIXTURE[:id]}"
43
+ assert_requested :delete, "#{Stripe.api_base}/v1/recipients/#{recipient.id}"
46
44
  assert recipient.kind_of?(Stripe::Recipient)
47
45
  end
48
46
  end
@@ -2,8 +2,6 @@ require File.expand_path('../../test_helper', __FILE__)
2
2
 
3
3
  module Stripe
4
4
  class RefundTest < Test::Unit::TestCase
5
- FIXTURE = API_FIXTURES.fetch(:refund)
6
-
7
5
  should "be listable" do
8
6
  refunds = Stripe::Refund.list
9
7
  assert_requested :get, "#{Stripe.api_base}/v1/refunds"
@@ -12,27 +10,27 @@ module Stripe
12
10
  end
13
11
 
14
12
  should "be retrievable" do
15
- refund = Stripe::Refund.retrieve(FIXTURE[:id])
16
- assert_requested :get, "#{Stripe.api_base}/v1/refunds/#{FIXTURE[:id]}"
13
+ refund = Stripe::Refund.retrieve("re_123")
14
+ assert_requested :get, "#{Stripe.api_base}/v1/refunds/re_123"
17
15
  assert refund.kind_of?(Stripe::Refund)
18
16
  end
19
17
 
20
18
  should "be creatable" do
21
- refund = Stripe::Refund.create(:charge => API_FIXTURES[:charge][:id])
19
+ refund = Stripe::Refund.create(:charge => "ch_123")
22
20
  assert_requested :post, "#{Stripe.api_base}/v1/refunds"
23
21
  assert refund.kind_of?(Stripe::Refund)
24
22
  end
25
23
 
26
24
  should "be saveable" do
27
- refund = Stripe::Refund.retrieve(FIXTURE[:id])
25
+ refund = Stripe::Refund.retrieve("re_123")
28
26
  refund.metadata['key'] = 'value'
29
27
  refund.save
30
- assert_requested :post, "#{Stripe.api_base}/v1/refunds/#{FIXTURE[:id]}"
28
+ assert_requested :post, "#{Stripe.api_base}/v1/refunds/#{refund.id}"
31
29
  end
32
30
 
33
31
  should "be updateable" do
34
- refund = Stripe::Refund.update(FIXTURE[:id], metadata: { key: 'value' })
35
- assert_requested :post, "#{Stripe.api_base}/v1/refunds/#{FIXTURE[:id]}"
32
+ refund = Stripe::Refund.update("re_123", metadata: { key: 'value' })
33
+ assert_requested :post, "#{Stripe.api_base}/v1/refunds/re_123"
36
34
  assert refund.kind_of?(Stripe::Refund)
37
35
  end
38
36
  end
@@ -2,10 +2,8 @@ require File.expand_path('../../test_helper', __FILE__)
2
2
 
3
3
  module Stripe
4
4
  class ReversalTest < Test::Unit::TestCase
5
- FIXTURE = API_FIXTURES.fetch(:transfer_reversal)
6
-
7
5
  setup do
8
- @transfer = Stripe::Transfer.retrieve(API_FIXTURES.fetch(:transfer)[:id])
6
+ @transfer = Stripe::Transfer.retrieve("tr_123")
9
7
  end
10
8
 
11
9
  should "be listable" do
@@ -17,9 +15,9 @@ module Stripe
17
15
  end
18
16
 
19
17
  should "be retrievable" do
20
- reversal = @transfer.reversals.retrieve(FIXTURE[:id])
18
+ reversal = @transfer.reversals.retrieve("trr_123")
21
19
  assert_requested :get,
22
- "#{Stripe.api_base}/v1/transfers/#{@transfer.id}/reversals/#{FIXTURE[:id]}"
20
+ "#{Stripe.api_base}/v1/transfers/#{@transfer.id}/reversals/trr_123"
23
21
  assert reversal.kind_of?(Stripe::Reversal)
24
22
  end
25
23
 
@@ -33,11 +31,11 @@ module Stripe
33
31
  end
34
32
 
35
33
  should "be saveable" do
36
- reversal = @transfer.reversals.retrieve(FIXTURE[:id])
34
+ reversal = @transfer.reversals.retrieve("trr_123")
37
35
  reversal.metadata['key'] = 'value'
38
36
  reversal.save
39
37
  assert_requested :post,
40
- "#{Stripe.api_base}/v1/transfers/#{@transfer.id}/reversals/#{FIXTURE[:id]}"
38
+ "#{Stripe.api_base}/v1/transfers/#{@transfer.id}/reversals/#{reversal.id}"
41
39
  end
42
40
  end
43
41
  end
@@ -2,8 +2,6 @@ require File.expand_path('../../test_helper', __FILE__)
2
2
 
3
3
  module Stripe
4
4
  class SKUTest < Test::Unit::TestCase
5
- FIXTURE = API_FIXTURES.fetch(:sku)
6
-
7
5
  should "be listable" do
8
6
  skus = Stripe::SKU.list
9
7
  assert_requested :get, "#{Stripe.api_base}/v1/skus"
@@ -12,8 +10,8 @@ module Stripe
12
10
  end
13
11
 
14
12
  should "be retrievable" do
15
- sku = Stripe::SKU.retrieve(FIXTURE[:id])
16
- assert_requested :get, "#{Stripe.api_base}/v1/skus/#{FIXTURE[:id]}"
13
+ sku = Stripe::SKU.retrieve("sku_123")
14
+ assert_requested :get, "#{Stripe.api_base}/v1/skus/sku_123"
17
15
  assert sku.kind_of?(Stripe::SKU)
18
16
  end
19
17
 
@@ -22,28 +20,28 @@ module Stripe
22
20
  currency: "USD",
23
21
  inventory: { type: "finite", quantity: 500 },
24
22
  price: 100,
25
- product: API_FIXTURES.fetch(:product)[:id]
23
+ product: "prod_123"
26
24
  )
27
25
  assert_requested :post, "#{Stripe.api_base}/v1/skus"
28
26
  end
29
27
 
30
28
  should "be saveable" do
31
- sku = Stripe::SKU.retrieve(FIXTURE[:id])
29
+ sku = Stripe::SKU.retrieve("sku_123")
32
30
  sku.metadata['key'] = 'value'
33
31
  sku.save
34
- assert_requested :post, "#{Stripe.api_base}/v1/skus/#{FIXTURE[:id]}"
32
+ assert_requested :post, "#{Stripe.api_base}/v1/skus/#{sku.id}"
35
33
  end
36
34
 
37
35
  should "be updateable" do
38
- sku = Stripe::SKU.update(FIXTURE[:id], metadata: {foo: 'bar'})
39
- assert_requested :post, "#{Stripe.api_base}/v1/skus/#{FIXTURE[:id]}"
36
+ sku = Stripe::SKU.update("sku_123", metadata: {foo: 'bar'})
37
+ assert_requested :post, "#{Stripe.api_base}/v1/skus/sku_123"
40
38
  assert sku.kind_of?(Stripe::SKU)
41
39
  end
42
40
 
43
41
  should "be deletable" do
44
- sku = Stripe::SKU.retrieve(FIXTURE[:id])
42
+ sku = Stripe::SKU.retrieve("sku_123")
45
43
  sku = sku.delete
46
- assert_requested :delete, "#{Stripe.api_base}/v1/skus/#{FIXTURE[:id]}"
44
+ assert_requested :delete, "#{Stripe.api_base}/v1/skus/#{sku.id}"
47
45
  assert sku.kind_of?(Stripe::SKU)
48
46
  end
49
47
  end
@@ -2,39 +2,37 @@ require File.expand_path('../../test_helper', __FILE__)
2
2
 
3
3
  module Stripe
4
4
  class SourceTest < Test::Unit::TestCase
5
- FIXTURE = API_FIXTURES.fetch(:source)
6
-
7
5
  should "be retrievable" do
8
- source = Stripe::Source.retrieve(FIXTURE[:id])
9
- assert_requested :get, "#{Stripe.api_base}/v1/sources/#{FIXTURE[:id]}"
6
+ source = Stripe::Source.retrieve("src_123")
7
+ assert_requested :get, "#{Stripe.api_base}/v1/sources/src_123"
10
8
  assert source.kind_of?(Stripe::Source)
11
9
  end
12
10
 
13
11
  should "be creatable" do
14
12
  source = Stripe::Source.create(
15
13
  type: 'card',
16
- token: API_FIXTURES.fetch(:token)[:id]
14
+ token: "tok_123"
17
15
  )
18
16
  assert_requested :post, "#{Stripe.api_base}/v1/sources"
19
17
  assert source.kind_of?(Stripe::Source)
20
18
  end
21
19
 
22
20
  should "be saveable" do
23
- source = Stripe::Source.retrieve(FIXTURE[:id])
21
+ source = Stripe::Source.retrieve("src_123")
24
22
  source.metadata['key'] = 'value'
25
23
  source.save
26
- assert_requested :post, "#{Stripe.api_base}/v1/sources/#{FIXTURE[:id]}"
24
+ assert_requested :post, "#{Stripe.api_base}/v1/sources/#{source.id}"
27
25
  end
28
26
 
29
27
  should "be updateable" do
30
- source = Stripe::Source.update(FIXTURE[:id], metadata: {foo: 'bar'})
31
- assert_requested :post, "#{Stripe.api_base}/v1/sources/#{FIXTURE[:id]}"
28
+ source = Stripe::Source.update("src_123", metadata: {foo: 'bar'})
29
+ assert_requested :post, "#{Stripe.api_base}/v1/sources/src_123"
32
30
  assert source.kind_of?(Stripe::Source)
33
31
  end
34
32
 
35
33
  context "#delete" do
36
34
  should "not be deletable when unattached" do
37
- source = Stripe::Source.retrieve(FIXTURE[:id])
35
+ source = Stripe::Source.retrieve("src_123")
38
36
 
39
37
  assert_raises NotImplementedError do
40
38
  source.delete
@@ -42,10 +40,13 @@ module Stripe
42
40
  end
43
41
 
44
42
  should "be deletable when attached to a customer" do
45
- customer_id = API_FIXTURES.fetch(:customer)[:id]
46
- source = Stripe::Source.construct_from(FIXTURE.merge(customer: customer_id))
47
- stub_request(:delete, "#{Stripe.api_base}/v1/customers/#{customer_id}/sources/#{FIXTURE[:id]}").
48
- to_return(body: JSON.generate(FIXTURE))
43
+ source = Stripe::Source.construct_from({
44
+ customer: "cus_123",
45
+ id: "src_123",
46
+ object: "source"
47
+ })
48
+ source = source.delete
49
+ assert_requested :delete, "#{Stripe.api_base}/v1/customers/cus_123/sources/src_123"
49
50
  assert source.kind_of?(Stripe::Source)
50
51
  end
51
52
  end
@@ -58,7 +59,7 @@ module Stripe
58
59
 
59
60
  context "#verify" do
60
61
  should "verify the source" do
61
- source = Stripe::Source.retrieve(FIXTURE[:id])
62
+ source = Stripe::Source.retrieve("src_123")
62
63
  source = source.verify(:values => [1,2])
63
64
  assert source.kind_of?(Stripe::Source)
64
65
  end
@@ -121,7 +121,7 @@ module Stripe
121
121
  should "support literal headers" do
122
122
  stub_request(:post, "#{Stripe.api_base}/v1/account").
123
123
  with(headers: { "Stripe-Account" => "bar" }).
124
- to_return(body: JSON.generate(API_FIXTURES.fetch(:account)))
124
+ to_return(body: JSON.generate({ object: "account" }))
125
125
 
126
126
  client = StripeClient.new
127
127
  client.execute_request(:post, '/v1/account',
@@ -132,7 +132,7 @@ module Stripe
132
132
  should "support RestClient-style header keys" do
133
133
  stub_request(:post, "#{Stripe.api_base}/v1/account").
134
134
  with(headers: { "Stripe-Account" => "bar" }).
135
- to_return(body: JSON.generate(API_FIXTURES.fetch(:account)))
135
+ to_return(body: JSON.generate({ object: "account" }))
136
136
 
137
137
  client = StripeClient.new
138
138
  client.execute_request(:post, '/v1/account',
@@ -141,6 +141,158 @@ module Stripe
141
141
  end
142
142
  end
143
143
 
144
+ context "logging" do
145
+ setup do
146
+ # Freeze time for the purposes of the `elapsed` parameter that we
147
+ # emit for responses. I didn't want to bring in a new dependency for
148
+ # this, but Mocha's `anything` parameter can't match inside of a hash
149
+ # and is therefore not useful for this purpose. If we switch over to
150
+ # rspec-mocks at some point, we can probably remove Timecop from the
151
+ # project.
152
+ Timecop.freeze(Time.local(1990))
153
+ end
154
+
155
+ teardown do
156
+ Timecop.return
157
+ end
158
+
159
+ should "produce appropriate logging" do
160
+ body = JSON.generate({ object: "account" })
161
+
162
+ Util.expects(:log_info).with("Request to Stripe API",
163
+ api_version: '2010-11-12',
164
+ idempotency_key: "abc",
165
+ method: :post,
166
+ path: "/v1/account"
167
+ )
168
+ Util.expects(:log_debug).with("Request details",
169
+ body: '',
170
+ idempotency_key: "abc"
171
+ )
172
+
173
+ Util.expects(:log_info).with("Response from Stripe API",
174
+ api_version: '2010-11-12',
175
+ elapsed: 0.0,
176
+ idempotency_key: "abc",
177
+ method: :post,
178
+ path: "/v1/account",
179
+ request_id: "req_123",
180
+ status: 200
181
+ )
182
+ Util.expects(:log_debug).with("Response details",
183
+ body: body,
184
+ idempotency_key: "abc",
185
+ request_id: "req_123"
186
+ )
187
+ Util.expects(:log_debug).with("Dashboard link for request",
188
+ idempotency_key: "abc",
189
+ request_id: "req_123",
190
+ url: Util.request_id_dashboard_url("req_123", Stripe.api_key)
191
+ )
192
+
193
+ stub_request(:post, "#{Stripe.api_base}/v1/account").
194
+ to_return(
195
+ body: body,
196
+ headers: {
197
+ "Idempotency-Key" => "abc",
198
+ "Request-Id" => "req_123",
199
+ "Stripe-Version" => "2010-11-12"
200
+ }
201
+ )
202
+
203
+ client = StripeClient.new
204
+ client.execute_request(:post, '/v1/account',
205
+ headers: {
206
+ "Idempotency-Key" => "abc",
207
+ "Stripe-Version" => "2010-11-12"
208
+ }
209
+ )
210
+ end
211
+
212
+ should "produce logging on API error" do
213
+ Util.expects(:log_info).with("Request to Stripe API",
214
+ api_version: nil,
215
+ idempotency_key: nil,
216
+ method: :post,
217
+ path: "/v1/account"
218
+ )
219
+ Util.expects(:log_info).with("Response from Stripe API",
220
+ api_version: nil,
221
+ elapsed: 0.0,
222
+ idempotency_key: nil,
223
+ method: :post,
224
+ path: "/v1/account",
225
+ request_id: nil,
226
+ status: 500
227
+ )
228
+
229
+ error = {
230
+ code: 'code',
231
+ message: 'message',
232
+ param: 'param',
233
+ type: 'type',
234
+ }
235
+ Util.expects(:log_info).with('Stripe API error',
236
+ status: 500,
237
+ error_code: error['code'],
238
+ error_message: error['message'],
239
+ error_param: error['param'],
240
+ error_type: error['type'],
241
+ idempotency_key: nil,
242
+ request_id: nil
243
+ )
244
+
245
+ stub_request(:post, "#{Stripe.api_base}/v1/account").
246
+ to_return(
247
+ body: JSON.generate({ :error => error }),
248
+ status: 500
249
+ )
250
+
251
+ client = StripeClient.new
252
+ assert_raises Stripe::APIError do
253
+ client.execute_request(:post, '/v1/account')
254
+ end
255
+ end
256
+
257
+ should "produce logging on OAuth error" do
258
+ Util.expects(:log_info).with("Request to Stripe API",
259
+ api_version: nil,
260
+ idempotency_key: nil,
261
+ method: :post,
262
+ path: "/oauth/token"
263
+ )
264
+ Util.expects(:log_info).with("Response from Stripe API",
265
+ api_version: nil,
266
+ elapsed: 0.0,
267
+ idempotency_key: nil,
268
+ method: :post,
269
+ path: "/oauth/token",
270
+ request_id: nil,
271
+ status: 400
272
+ )
273
+
274
+ Util.expects(:log_info).with('Stripe OAuth error',
275
+ status: 400,
276
+ error_code: "invalid_request",
277
+ error_description: "No grant type specified",
278
+ idempotency_key: nil,
279
+ request_id: nil
280
+ )
281
+
282
+ stub_request(:post, "#{Stripe.connect_base}/oauth/token").
283
+ to_return(body: JSON.generate({
284
+ error: "invalid_request",
285
+ error_description: "No grant type specified",
286
+ }), status: 400)
287
+
288
+ client = StripeClient.new
289
+ opts = {api_base: Stripe.connect_base}
290
+ assert_raises Stripe::OAuth::InvalidRequestError do
291
+ client.execute_request(:post, '/oauth/token', opts)
292
+ end
293
+ end
294
+ end
295
+
144
296
  context "Stripe-Account header" do
145
297
  should "use a globally set header" do
146
298
  begin
@@ -149,7 +301,7 @@ module Stripe
149
301
 
150
302
  stub_request(:post, "#{Stripe.api_base}/v1/account").
151
303
  with(headers: {"Stripe-Account" => Stripe.stripe_account}).
152
- to_return(body: JSON.generate(API_FIXTURES.fetch(:account)))
304
+ to_return(body: JSON.generate({ object: "account" }))
153
305
 
154
306
  client = StripeClient.new
155
307
  client.execute_request(:post, '/v1/account')
@@ -162,7 +314,7 @@ module Stripe
162
314
  stripe_account = "acct_0000"
163
315
  stub_request(:post, "#{Stripe.api_base}/v1/account").
164
316
  with(headers: {"Stripe-Account" => stripe_account}).
165
- to_return(body: JSON.generate(API_FIXTURES.fetch(:account)))
317
+ to_return(body: JSON.generate({ object: "account" }))
166
318
 
167
319
  client = StripeClient.new
168
320
  client.execute_request(:post, '/v1/account',
@@ -174,7 +326,7 @@ module Stripe
174
326
  stub_request(:post, "#{Stripe.api_base}/v1/account").
175
327
  with { |req|
176
328
  req.headers["Stripe-Account"].nil?
177
- }.to_return(body: JSON.generate(API_FIXTURES.fetch(:account)))
329
+ }.to_return(body: JSON.generate({ object: "account" }))
178
330
 
179
331
  client = StripeClient.new
180
332
  client.execute_request(:post, '/v1/account')
@@ -208,7 +360,7 @@ module Stripe
208
360
  }, data[:application])
209
361
 
210
362
  true
211
- }.to_return(body: JSON.generate(API_FIXTURES.fetch(:account)))
363
+ }.to_return(body: JSON.generate({ object: "account" }))
212
364
 
213
365
  client = StripeClient.new
214
366
  client.execute_request(:post, '/v1/account')
@@ -413,30 +565,30 @@ module Stripe
413
565
 
414
566
  should 'not add an idempotency key to GET requests' do
415
567
  SecureRandom.expects(:uuid).times(0)
416
- stub_request(:get, "#{Stripe.api_base}/v1/charges/#{API_FIXTURES.fetch(:charge)[:id]}").
568
+ stub_request(:get, "#{Stripe.api_base}/v1/charges/ch_123").
417
569
  with { |req|
418
570
  req.headers['Idempotency-Key'].nil?
419
- }.to_return(body: JSON.generate(API_FIXTURES.fetch(:charge)))
571
+ }.to_return(body: JSON.generate({ object: "charge" }))
420
572
  client = StripeClient.new
421
- client.execute_request(:get, "/v1/charges/#{API_FIXTURES.fetch(:charge)[:id]}")
573
+ client.execute_request(:get, "/v1/charges/ch_123")
422
574
  end
423
575
 
424
576
  should 'ensure there is always an idempotency_key on POST requests' do
425
577
  SecureRandom.expects(:uuid).at_least_once.returns("random_key")
426
578
  stub_request(:post, "#{Stripe.api_base}/v1/charges").
427
579
  with(headers: {"Idempotency-Key" => "random_key"}).
428
- to_return(body: JSON.generate(API_FIXTURES.fetch(:charge)))
580
+ to_return(body: JSON.generate({ object: "charge" }))
429
581
  client = StripeClient.new
430
582
  client.execute_request(:post, "/v1/charges")
431
583
  end
432
584
 
433
585
  should 'ensure there is always an idempotency_key on DELETE requests' do
434
586
  SecureRandom.expects(:uuid).at_least_once.returns("random_key")
435
- stub_request(:delete, "#{Stripe.api_base}/v1/charges/#{API_FIXTURES.fetch(:charge)[:id]}").
587
+ stub_request(:delete, "#{Stripe.api_base}/v1/charges/ch_123").
436
588
  with(headers: {"Idempotency-Key" => "random_key"}).
437
- to_return(body: JSON.generate(API_FIXTURES.fetch(:charge)))
589
+ to_return(body: JSON.generate({ object: "charge" }))
438
590
  client = StripeClient.new
439
- client.execute_request(:delete, "/v1/charges/#{API_FIXTURES.fetch(:charge)[:id]}")
591
+ client.execute_request(:delete, "/v1/charges/ch_123")
440
592
  end
441
593
 
442
594
  should 'not override a provided idempotency_key' do
@@ -448,7 +600,7 @@ module Stripe
448
600
  # expected.
449
601
  stub_request(:post, "#{Stripe.api_base}/v1/charges").
450
602
  with(headers: {"Idempotency-Key" => "provided_key"}).
451
- to_return(body: JSON.generate(API_FIXTURES.fetch(:charge)))
603
+ to_return(body: JSON.generate({ object: "charge" }))
452
604
 
453
605
  client = StripeClient.new
454
606
  client.execute_request(:post, "/v1/charges",
@@ -495,21 +647,33 @@ module Stripe
495
647
  context "params serialization" do
496
648
  should 'allows empty strings in params' do
497
649
  client = StripeClient.new
498
- client.execute_request(:get, '/v1/invoices/upcoming',
499
- params: { customer: API_FIXTURES[:customer][:id],
500
- coupon: '' })
501
- assert_requested(:get, "#{Stripe.api_base}/v1/invoices/upcoming?",
502
- query: { customer: API_FIXTURES[:customer][:id],
503
- coupon: '' })
650
+ client.execute_request(:get, '/v1/invoices/upcoming', params: {
651
+ customer: 'cus_123',
652
+ coupon: ''
653
+ })
654
+ assert_requested(
655
+ :get,
656
+ "#{Stripe.api_base}/v1/invoices/upcoming?",
657
+ query: {
658
+ customer: 'cus_123',
659
+ coupon: ''
660
+ }
661
+ )
504
662
  end
505
663
 
506
664
  should 'filter nils in params' do
507
665
  client = StripeClient.new
508
- client.execute_request(:get, '/v1/invoices/upcoming',
509
- params: { customer: API_FIXTURES[:customer][:id],
510
- coupon: nil })
511
- assert_requested(:get, "#{Stripe.api_base}/v1/invoices/upcoming?",
512
- query: { customer: API_FIXTURES[:customer][:id] })
666
+ client.execute_request(:get, '/v1/invoices/upcoming', params: {
667
+ customer: 'cus_123',
668
+ coupon: nil
669
+ })
670
+ assert_requested(
671
+ :get,
672
+ "#{Stripe.api_base}/v1/invoices/upcoming?",
673
+ query: {
674
+ customer: 'cus_123'
675
+ }
676
+ )
513
677
  end
514
678
  end
515
679
  end
@@ -517,7 +681,7 @@ module Stripe
517
681
  context "#request" do
518
682
  should "return a result and response object" do
519
683
  stub_request(:post, "#{Stripe.api_base}/v1/charges").
520
- to_return(body: JSON.generate(API_FIXTURES.fetch(:charge)))
684
+ to_return(body: JSON.generate({ object: "charge" }))
521
685
 
522
686
  client = StripeClient.new
523
687
  charge, resp = client.request { Charge.create }