stripe 4.9.0 → 5.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 (224) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +10 -0
  3. data/.rubocop.yml +28 -4
  4. data/.rubocop_todo.yml +11 -22
  5. data/.travis.yml +3 -6
  6. data/.vscode/extensions.json +7 -0
  7. data/.vscode/settings.json +8 -0
  8. data/CHANGELOG.md +102 -2
  9. data/Gemfile +2 -10
  10. data/README.md +96 -40
  11. data/Rakefile +8 -7
  12. data/VERSION +1 -1
  13. data/lib/stripe.rb +64 -85
  14. data/lib/stripe/api_operations/delete.rb +23 -1
  15. data/lib/stripe/api_operations/list.rb +0 -6
  16. data/lib/stripe/api_operations/nested_resource.rb +14 -7
  17. data/lib/stripe/api_operations/request.rb +3 -7
  18. data/lib/stripe/api_operations/save.rb +1 -3
  19. data/lib/stripe/api_resource.rb +50 -2
  20. data/lib/stripe/connection_manager.rb +141 -0
  21. data/lib/stripe/error_object.rb +94 -0
  22. data/lib/stripe/errors.rb +22 -9
  23. data/lib/stripe/list_object.rb +11 -5
  24. data/lib/stripe/multipart_encoder.rb +131 -0
  25. data/lib/stripe/object_types.rb +94 -0
  26. data/lib/stripe/resources.rb +77 -0
  27. data/lib/stripe/{account.rb → resources/account.rb} +49 -27
  28. data/lib/stripe/{account_link.rb → resources/account_link.rb} +1 -1
  29. data/lib/stripe/resources/alipay_account.rb +34 -0
  30. data/lib/stripe/{apple_pay_domain.rb → resources/apple_pay_domain.rb} +1 -1
  31. data/lib/stripe/resources/application_fee.rb +13 -0
  32. data/lib/stripe/resources/application_fee_refund.rb +30 -0
  33. data/lib/stripe/{balance.rb → resources/balance.rb} +1 -1
  34. data/lib/stripe/{balance_transaction.rb → resources/balance_transaction.rb} +1 -5
  35. data/lib/stripe/{bank_account.rb → resources/bank_account.rb} +14 -4
  36. data/lib/stripe/{bitcoin_receiver.rb → resources/bitcoin_receiver.rb} +3 -3
  37. data/lib/stripe/{bitcoin_transaction.rb → resources/bitcoin_transaction.rb} +1 -1
  38. data/lib/stripe/resources/capability.rb +33 -0
  39. data/lib/stripe/{card.rb → resources/card.rb} +12 -4
  40. data/lib/stripe/resources/charge.rb +22 -0
  41. data/lib/stripe/{checkout → resources/checkout}/session.rb +2 -2
  42. data/lib/stripe/{country_spec.rb → resources/country_spec.rb} +1 -1
  43. data/lib/stripe/{coupon.rb → resources/coupon.rb} +2 -2
  44. data/lib/stripe/resources/credit_note.rb +22 -0
  45. data/lib/stripe/resources/customer.rb +35 -0
  46. data/lib/stripe/resources/customer_balance_transaction.rb +30 -0
  47. data/lib/stripe/resources/discount.rb +7 -0
  48. data/lib/stripe/{dispute.rb → resources/dispute.rb} +9 -7
  49. data/lib/stripe/{ephemeral_key.rb → resources/ephemeral_key.rb} +5 -2
  50. data/lib/stripe/{event.rb → resources/event.rb} +1 -1
  51. data/lib/stripe/{exchange_rate.rb → resources/exchange_rate.rb} +1 -1
  52. data/lib/stripe/{file.rb → resources/file.rb} +8 -11
  53. data/lib/stripe/{file_link.rb → resources/file_link.rb} +2 -2
  54. data/lib/stripe/resources/invoice.rb +73 -0
  55. data/lib/stripe/{invoice_item.rb → resources/invoice_item.rb} +2 -2
  56. data/lib/stripe/{invoice_line_item.rb → resources/invoice_line_item.rb} +1 -1
  57. data/lib/stripe/resources/issuing/authorization.rb +33 -0
  58. data/lib/stripe/resources/issuing/card.rb +24 -0
  59. data/lib/stripe/{issuing → resources/issuing}/card_details.rb +1 -1
  60. data/lib/stripe/{issuing → resources/issuing}/cardholder.rb +2 -2
  61. data/lib/stripe/{issuing → resources/issuing}/dispute.rb +2 -2
  62. data/lib/stripe/{issuing → resources/issuing}/transaction.rb +2 -2
  63. data/lib/stripe/resources/login_link.rb +14 -0
  64. data/lib/stripe/resources/order.rb +32 -0
  65. data/lib/stripe/{order_return.rb → resources/order_return.rb} +1 -1
  66. data/lib/stripe/resources/payment_intent.rb +42 -0
  67. data/lib/stripe/resources/payment_method.rb +32 -0
  68. data/lib/stripe/resources/payout.rb +22 -0
  69. data/lib/stripe/{person.rb → resources/person.rb} +8 -3
  70. data/lib/stripe/{plan.rb → resources/plan.rb} +1 -1
  71. data/lib/stripe/{product.rb → resources/product.rb} +3 -3
  72. data/lib/stripe/resources/radar/early_fraud_warning.rb +11 -0
  73. data/lib/stripe/{radar → resources/radar}/value_list.rb +2 -2
  74. data/lib/stripe/{radar → resources/radar}/value_list_item.rb +2 -2
  75. data/lib/stripe/{recipient.rb → resources/recipient.rb} +2 -6
  76. data/lib/stripe/{recipient_transfer.rb → resources/recipient_transfer.rb} +1 -1
  77. data/lib/stripe/{refund.rb → resources/refund.rb} +1 -1
  78. data/lib/stripe/{reporting → resources/reporting}/report_run.rb +2 -2
  79. data/lib/stripe/{reporting → resources/reporting}/report_type.rb +2 -2
  80. data/lib/stripe/resources/reversal.rb +29 -0
  81. data/lib/stripe/resources/review.rb +20 -0
  82. data/lib/stripe/resources/setup_intent.rb +32 -0
  83. data/lib/stripe/{sigma → resources/sigma}/scheduled_query_run.rb +2 -2
  84. data/lib/stripe/{sku.rb → resources/sku.rb} +3 -3
  85. data/lib/stripe/{source.rb → resources/source.rb} +17 -15
  86. data/lib/stripe/{source_transaction.rb → resources/source_transaction.rb} +1 -1
  87. data/lib/stripe/resources/subscription.rb +25 -0
  88. data/lib/stripe/{subscription_item.rb → resources/subscription_item.rb} +5 -2
  89. data/lib/stripe/resources/subscription_schedule.rb +32 -0
  90. data/lib/stripe/resources/tax_id.rb +26 -0
  91. data/lib/stripe/resources/tax_rate.rb +11 -0
  92. data/lib/stripe/{terminal → resources/terminal}/connection_token.rb +2 -2
  93. data/lib/stripe/{terminal → resources/terminal}/location.rb +3 -2
  94. data/lib/stripe/{terminal → resources/terminal}/reader.rb +3 -2
  95. data/lib/stripe/{three_d_secure.rb → resources/three_d_secure.rb} +1 -1
  96. data/lib/stripe/{token.rb → resources/token.rb} +1 -1
  97. data/lib/stripe/resources/topup.rb +22 -0
  98. data/lib/stripe/resources/transfer.rb +26 -0
  99. data/lib/stripe/resources/usage_record.rb +7 -0
  100. data/lib/stripe/{usage_record_summary.rb → resources/usage_record_summary.rb} +1 -1
  101. data/lib/stripe/{webhook_endpoint.rb → resources/webhook_endpoint.rb} +2 -2
  102. data/lib/stripe/singleton_api_resource.rb +3 -1
  103. data/lib/stripe/stripe_client.rb +347 -218
  104. data/lib/stripe/stripe_object.rb +72 -59
  105. data/lib/stripe/stripe_response.rb +53 -21
  106. data/lib/stripe/util.rb +54 -109
  107. data/lib/stripe/version.rb +1 -1
  108. data/lib/stripe/webhook.rb +5 -3
  109. data/stripe.gemspec +14 -5
  110. data/test/stripe/account_link_test.rb +1 -1
  111. data/test/stripe/account_test.rb +193 -32
  112. data/test/stripe/alipay_account_test.rb +1 -1
  113. data/test/stripe/api_operations_test.rb +3 -4
  114. data/test/stripe/api_resource_test.rb +119 -30
  115. data/test/stripe/apple_pay_domain_test.rb +18 -5
  116. data/test/stripe/application_fee_refund_test.rb +1 -1
  117. data/test/stripe/application_fee_test.rb +45 -1
  118. data/test/stripe/balance_test.rb +1 -1
  119. data/test/stripe/balance_transaction_test.rb +20 -0
  120. data/test/stripe/bank_account_test.rb +1 -1
  121. data/test/stripe/capability_test.rb +45 -0
  122. data/test/stripe/charge_test.rb +13 -8
  123. data/test/stripe/checkout/session_test.rb +7 -1
  124. data/test/stripe/connection_manager_test.rb +138 -0
  125. data/test/stripe/country_spec_test.rb +1 -1
  126. data/test/stripe/coupon_test.rb +16 -6
  127. data/test/stripe/credit_note_test.rb +61 -0
  128. data/test/stripe/customer_balance_transaction_test.rb +37 -0
  129. data/test/stripe/customer_card_test.rb +1 -1
  130. data/test/stripe/customer_test.rb +151 -40
  131. data/test/stripe/dispute_test.rb +10 -1
  132. data/test/stripe/ephemeral_key_test.rb +8 -1
  133. data/test/stripe/errors_test.rb +30 -9
  134. data/test/stripe/exchange_rate_test.rb +1 -1
  135. data/test/stripe/file_link_test.rb +1 -1
  136. data/test/stripe/file_test.rb +19 -5
  137. data/test/stripe/invoice_item_test.rb +18 -7
  138. data/test/stripe/invoice_line_item_test.rb +1 -1
  139. data/test/stripe/invoice_test.rb +77 -9
  140. data/test/stripe/issuing/authorization_test.rb +33 -11
  141. data/test/stripe/issuing/card_test.rb +15 -6
  142. data/test/stripe/issuing/cardholder_test.rb +1 -1
  143. data/test/stripe/issuing/dispute_test.rb +1 -1
  144. data/test/stripe/issuing/transaction_test.rb +1 -1
  145. data/test/stripe/list_object_test.rb +1 -17
  146. data/test/stripe/login_link_test.rb +2 -2
  147. data/test/stripe/multipart_encoder_test.rb +130 -0
  148. data/test/stripe/oauth_test.rb +1 -1
  149. data/test/stripe/order_return_test.rb +1 -1
  150. data/test/stripe/order_test.rb +28 -3
  151. data/test/stripe/payment_intent_test.rb +31 -4
  152. data/test/stripe/payment_method_test.rb +84 -0
  153. data/test/stripe/payout_test.rb +8 -1
  154. data/test/stripe/person_test.rb +1 -1
  155. data/test/stripe/plan_test.rb +26 -20
  156. data/test/stripe/product_test.rb +16 -6
  157. data/test/stripe/radar/early_fraud_warning_test.rb +22 -0
  158. data/test/stripe/radar/value_list_item_test.rb +16 -6
  159. data/test/stripe/radar/value_list_test.rb +16 -6
  160. data/test/stripe/recipient_test.rb +18 -5
  161. data/test/stripe/refund_test.rb +1 -1
  162. data/test/stripe/reporting/report_run_test.rb +1 -1
  163. data/test/stripe/reporting/report_type_test.rb +1 -1
  164. data/test/stripe/reversal_test.rb +1 -1
  165. data/test/stripe/review_test.rb +1 -1
  166. data/test/stripe/setup_intent_test.rb +84 -0
  167. data/test/stripe/sigma/scheduled_query_run_test.rb +1 -1
  168. data/test/stripe/sku_test.rb +16 -6
  169. data/test/stripe/source_test.rb +14 -19
  170. data/test/stripe/source_transaction_test.rb +1 -1
  171. data/test/stripe/stripe_client_test.rb +242 -26
  172. data/test/stripe/stripe_object_test.rb +8 -36
  173. data/test/stripe/stripe_response_test.rb +71 -25
  174. data/test/stripe/subscription_item_test.rb +28 -6
  175. data/test/stripe/subscription_schedule_test.rb +19 -1
  176. data/test/stripe/subscription_test.rb +29 -9
  177. data/test/stripe/tax_id_test.rb +31 -0
  178. data/test/stripe/tax_rate_test.rb +43 -0
  179. data/test/stripe/terminal/connection_token_test.rb +1 -1
  180. data/test/stripe/terminal/location_test.rb +18 -1
  181. data/test/stripe/terminal/reader_test.rb +18 -1
  182. data/test/stripe/three_d_secure_test.rb +1 -1
  183. data/test/stripe/topup_test.rb +9 -1
  184. data/test/stripe/transfer_test.rb +46 -1
  185. data/test/stripe/usage_record_summary_test.rb +1 -1
  186. data/test/stripe/util_test.rb +1 -1
  187. data/test/stripe/webhook_endpoint_test.rb +18 -1
  188. data/test/stripe/webhook_test.rb +4 -4
  189. data/test/stripe_mock.rb +4 -3
  190. data/test/stripe_test.rb +1 -14
  191. data/test/test_helper.rb +14 -11
  192. metadata +117 -125
  193. data/lib/stripe/alipay_account.rb +0 -27
  194. data/lib/stripe/application_fee.rb +0 -23
  195. data/lib/stripe/application_fee_refund.rb +0 -22
  196. data/lib/stripe/charge.rb +0 -84
  197. data/lib/stripe/customer.rb +0 -90
  198. data/lib/stripe/invoice.rb +0 -48
  199. data/lib/stripe/issuer_fraud_record.rb +0 -9
  200. data/lib/stripe/issuing/authorization.rb +0 -22
  201. data/lib/stripe/issuing/card.rb +0 -18
  202. data/lib/stripe/login_link.rb +0 -11
  203. data/lib/stripe/order.rb +0 -31
  204. data/lib/stripe/payment_intent.rb +0 -26
  205. data/lib/stripe/payout.rb +0 -20
  206. data/lib/stripe/reversal.rb +0 -22
  207. data/lib/stripe/review.rb +0 -14
  208. data/lib/stripe/subscription.rb +0 -25
  209. data/lib/stripe/subscription_schedule.rb +0 -32
  210. data/lib/stripe/subscription_schedule_revision.rb +0 -25
  211. data/lib/stripe/topup.rb +0 -16
  212. data/lib/stripe/transfer.rb +0 -23
  213. data/lib/stripe/usage_record.rb +0 -14
  214. data/test/stripe/account_external_accounts_operations_test.rb +0 -69
  215. data/test/stripe/account_login_links_operations_test.rb +0 -21
  216. data/test/stripe/account_persons_operations_test.rb +0 -70
  217. data/test/stripe/application_fee_refunds_operations_test.rb +0 -56
  218. data/test/stripe/customer_sources_operations_test.rb +0 -64
  219. data/test/stripe/file_upload_test.rb +0 -76
  220. data/test/stripe/issuer_fraud_record_test.rb +0 -20
  221. data/test/stripe/subscription_schedule_revision_test.rb +0 -37
  222. data/test/stripe/subscription_schedule_revisions_operations_test.rb +0 -35
  223. data/test/stripe/transfer_reversals_operations_test.rb +0 -57
  224. data/test/stripe/usage_record_test.rb +0 -28
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require ::File.expand_path("../../test_helper", __FILE__)
3
+ require ::File.expand_path("../test_helper", __dir__)
4
4
 
5
5
  module Stripe
6
6
  class StripeObjectTest < Test::Unit::TestCase
@@ -52,9 +52,9 @@ module Stripe
52
52
  2,
53
53
  ],
54
54
  map: {
55
- :"0" => StripeObject.construct_from({ id: "index0" }, opts),
56
- :"1" => "index1",
57
- :"2" => 2,
55
+ "0": StripeObject.construct_from({ id: "index0" }, opts),
56
+ "1": "index1",
57
+ "2": 2,
58
58
  },
59
59
  }
60
60
 
@@ -235,20 +235,6 @@ module Stripe
235
235
  assert_equal true, obj.send(:metaclass).method_defined?(:foo)
236
236
  end
237
237
 
238
- should "warn that #refresh_from is deprecated" do
239
- old_stderr = $stderr
240
- $stderr = StringIO.new
241
- begin
242
- obj = Stripe::StripeObject.construct_from({})
243
- obj.refresh_from({}, {})
244
- message = "NOTE: Stripe::StripeObject#refresh_from is " \
245
- "deprecated; use #update_attributes instead"
246
- assert_match Regexp.new(message), $stderr.string
247
- ensure
248
- $stderr = old_stderr
249
- end
250
- end
251
-
252
238
  should "pass opts down to children when initializing" do
253
239
  opts = { custom: "opts" }
254
240
 
@@ -302,14 +288,14 @@ module Stripe
302
288
  end
303
289
 
304
290
  should "#serialize_params on an array that shortens" do
305
- obj = Stripe::StripeObject.construct_from(foo: ["0-index", "1-index", "2-index"])
291
+ obj = Stripe::StripeObject.construct_from(foo: %w[0-index 1-index 2-index])
306
292
  obj.foo = ["new-value"]
307
293
  assert_equal({ foo: ["new-value"] },
308
294
  obj.serialize_params)
309
295
  end
310
296
 
311
297
  should "#serialize_params on an array that lengthens" do
312
- obj = Stripe::StripeObject.construct_from(foo: ["0-index", "1-index", "2-index"])
298
+ obj = Stripe::StripeObject.construct_from(foo: %w[0-index 1-index 2-index])
313
299
  obj.foo = ["new-value"] * 4
314
300
  assert_equal({ foo: ["new-value"] * 4 },
315
301
  obj.serialize_params)
@@ -331,8 +317,8 @@ module Stripe
331
317
  end
332
318
 
333
319
  should "#serialize_params on an array that is unchanged" do
334
- obj = Stripe::StripeObject.construct_from(foo: ["0-index", "1-index", "2-index"])
335
- obj.foo = ["0-index", "1-index", "2-index"]
320
+ obj = Stripe::StripeObject.construct_from(foo: %w[0-index 1-index 2-index])
321
+ obj.foo = %w[0-index 1-index 2-index]
336
322
  assert_equal({}, obj.serialize_params)
337
323
  end
338
324
 
@@ -475,20 +461,6 @@ module Stripe
475
461
  assert_equal(expected, obj.to_s)
476
462
  end
477
463
 
478
- should "warn that .serialize_params is deprecated" do
479
- old_stderr = $stderr
480
- $stderr = StringIO.new
481
- begin
482
- obj = Stripe::StripeObject.construct_from({})
483
- Stripe::StripeObject.serialize_params(obj)
484
- message = "NOTE: Stripe::StripeObject.serialize_params is " \
485
- "deprecated; use #serialize_params instead"
486
- assert_match Regexp.new(message), $stderr.string
487
- ensure
488
- $stderr = old_stderr
489
- end
490
- end
491
-
492
464
  should "error on setting a property to an empty string" do
493
465
  obj = Stripe::StripeObject.construct_from(foo: "bar")
494
466
  e = assert_raises ArgumentError do
@@ -1,49 +1,95 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require ::File.expand_path("../../test_helper", __FILE__)
3
+ require ::File.expand_path("../test_helper", __dir__)
4
4
 
5
5
  module Stripe
6
6
  class StripeResponseTest < Test::Unit::TestCase
7
- context ".from_faraday_hash" do
8
- should "converts to StripeResponse" do
9
- body = '{"foo": "bar"}'
7
+ context "Headers" do
8
+ should "allow case-insensitive header access" do
10
9
  headers = { "Request-Id" => "request-id" }
10
+ http_resp = create_net_http_resp(200, "", headers)
11
11
 
12
- http_resp = {
13
- body: body,
14
- headers: headers,
15
- status: 200,
16
- }
12
+ headers = StripeResponse::Headers.from_net_http(http_resp)
17
13
 
18
- resp = StripeResponse.from_faraday_hash(http_resp)
14
+ assert_equal "request-id", headers["request-id"]
15
+ assert_equal "request-id", headers["Request-Id"]
16
+ assert_equal "request-id", headers["Request-ID"]
17
+ end
19
18
 
20
- assert_equal JSON.parse(body, symbolize_names: true), resp.data
21
- assert_equal body, resp.http_body
22
- assert_equal headers, resp.http_headers
23
- assert_equal 200, resp.http_status
24
- assert_equal "request-id", resp.request_id
19
+ should "initialize without error" do
20
+ StripeResponse::Headers.new({})
21
+ StripeResponse::Headers.new("Request-Id" => [])
22
+ StripeResponse::Headers.new("Request-Id" => ["request-id"])
23
+ end
24
+
25
+ should "initialize with error on a malformed hash" do
26
+ assert_raises(ArgumentError) do
27
+ StripeResponse::Headers.new(nil)
28
+ end
29
+
30
+ assert_raises(ArgumentError) do
31
+ StripeResponse::Headers.new(1 => [])
32
+ end
33
+
34
+ assert_raises(ArgumentError) do
35
+ StripeResponse::Headers.new("Request-Id" => 1)
36
+ end
37
+
38
+ assert_raises(ArgumentError) do
39
+ StripeResponse::Headers.new("Request-Id" => [1])
40
+ end
41
+ end
42
+
43
+ should "warn on duplicate header values" do
44
+ old_stderr = $stderr
45
+ $stderr = StringIO.new
46
+ begin
47
+ headers = StripeResponse::Headers.new("Duplicated" => %w[a b])
48
+ assert_equal "a", headers["Duplicated"]
49
+ assert_equal "Duplicate header values for `Duplicated`; returning only first",
50
+ $stderr.string.rstrip
51
+ ensure
52
+ $stderr = old_stderr
53
+ end
25
54
  end
26
55
  end
27
56
 
28
- context ".from_faraday_response" do
57
+ context ".from_net_http" do
29
58
  should "converts to StripeResponse" do
59
+ code = 200
30
60
  body = '{"foo": "bar"}'
31
61
  headers = { "Request-Id" => "request-id" }
62
+ http_resp = create_net_http_resp(code, body, headers)
32
63
 
33
- env = Faraday::Env.from(
34
- status: 200, body: body,
35
- response_headers: headers
36
- )
37
- http_resp = Faraday::Response.new(env)
38
-
39
- resp = StripeResponse.from_faraday_response(http_resp)
64
+ resp = StripeResponse.from_net_http(http_resp)
40
65
 
41
66
  assert_equal JSON.parse(body, symbolize_names: true), resp.data
42
67
  assert_equal body, resp.http_body
43
- assert_equal headers, resp.http_headers
44
- assert_equal 200, resp.http_status
68
+ assert_equal "request-id", resp.http_headers["Request-ID"]
69
+ assert_equal code, resp.http_status
45
70
  assert_equal "request-id", resp.request_id
46
71
  end
47
72
  end
73
+
74
+ # Synthesizes a `Net::HTTPResponse` object for testing purposes.
75
+ private def create_net_http_resp(code, body, headers)
76
+ # The "1.1" is HTTP version.
77
+ http_resp = Net::HTTPResponse.new("1.1", code.to_s, nil)
78
+ http_resp.body = body
79
+
80
+ # This is obviously super sketchy, but the Ruby team has done everything
81
+ # in their power to make these objects as difficult to test with as
82
+ # possible. Even if you specify a body, accessing `#body` the first time
83
+ # will attempt to read from a non-existent socket which will subsequently
84
+ # blow up. Setting this internal variable skips that read and allows the
85
+ # object to use the body that we specified above.
86
+ http_resp.instance_variable_set(:@read, true)
87
+
88
+ headers.each do |name, value|
89
+ http_resp[name] = value
90
+ end
91
+
92
+ http_resp
93
+ end
48
94
  end
49
95
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require ::File.expand_path("../../test_helper", __FILE__)
3
+ require ::File.expand_path("../test_helper", __dir__)
4
4
 
5
5
  module Stripe
6
6
  class SubscriptionItemTest < Test::Unit::TestCase
@@ -43,11 +43,33 @@ module Stripe
43
43
  assert item.is_a?(Stripe::SubscriptionItem)
44
44
  end
45
45
 
46
- should "be deletable" do
47
- item = Stripe::SubscriptionItem.retrieve("si_123")
48
- item = item.delete
49
- assert_requested :delete, "#{Stripe.api_base}/v1/subscription_items/#{item.id}"
50
- assert item.is_a?(Stripe::SubscriptionItem)
46
+ context "#delete" do
47
+ should "be deletable" do
48
+ item = Stripe::SubscriptionItem.retrieve("si_123")
49
+ item = item.delete
50
+ assert_requested :delete, "#{Stripe.api_base}/v1/subscription_items/#{item.id}"
51
+ assert item.is_a?(Stripe::SubscriptionItem)
52
+ end
53
+ end
54
+
55
+ context ".delete" do
56
+ should "be deletable" do
57
+ item = Stripe::SubscriptionItem.delete("si_123")
58
+ assert_requested :delete, "#{Stripe.api_base}/v1/subscription_items/si_123"
59
+ assert item.is_a?(Stripe::SubscriptionItem)
60
+ end
61
+ end
62
+
63
+ context "#create_usage_record" do
64
+ should "create a usage record" do
65
+ Stripe::SubscriptionItem.create_usage_record(
66
+ "si_123",
67
+ quantity: 5000,
68
+ timestamp: Time.now.to_i,
69
+ action: "increment"
70
+ )
71
+ assert_requested :post, "#{Stripe.api_base}/v1/subscription_items/si_123/usage_records"
72
+ end
51
73
  end
52
74
  end
53
75
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require ::File.expand_path("../../test_helper", __FILE__)
3
+ require ::File.expand_path("../test_helper", __dir__)
4
4
 
5
5
  module Stripe
6
6
  class SubscriptionScheduleTest < Test::Unit::TestCase
@@ -51,6 +51,15 @@ module Stripe
51
51
  end
52
52
  end
53
53
 
54
+ context ".cancel" do
55
+ should "cancel a subscription schedule" do
56
+ schedule = Stripe::SubscriptionSchedule.cancel("sub_sched_123")
57
+ assert_requested :post,
58
+ "#{Stripe.api_base}/v1/subscription_schedules/sub_sched_123/cancel"
59
+ assert schedule.is_a?(Stripe::SubscriptionSchedule)
60
+ end
61
+ end
62
+
54
63
  context "#release" do
55
64
  should "release a subscription schedule" do
56
65
  schedule = Stripe::SubscriptionSchedule.retrieve("sub_sched_123")
@@ -60,5 +69,14 @@ module Stripe
60
69
  assert schedule.is_a?(Stripe::SubscriptionSchedule)
61
70
  end
62
71
  end
72
+
73
+ context ".release" do
74
+ should "release a subscription schedule" do
75
+ schedule = Stripe::SubscriptionSchedule.release("sub_sched_123")
76
+ assert_requested :post,
77
+ "#{Stripe.api_base}/v1/subscription_schedules/sub_sched_123/release"
78
+ assert schedule.is_a?(Stripe::SubscriptionSchedule)
79
+ end
80
+ end
63
81
  end
64
82
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require ::File.expand_path("../../test_helper", __FILE__)
3
+ require ::File.expand_path("../test_helper", __dir__)
4
4
 
5
5
  module Stripe
6
6
  class SubscriptionTest < Test::Unit::TestCase
@@ -41,19 +41,39 @@ module Stripe
41
41
  assert subscription.is_a?(Stripe::Subscription)
42
42
  end
43
43
 
44
- should "be deletable" do
45
- subscription = Stripe::Subscription.retrieve("sub_123")
46
- subscription = subscription.delete
47
- assert_requested :delete,
48
- "#{Stripe.api_base}/v1/subscriptions/#{subscription.id}"
49
- assert subscription.is_a?(Stripe::Subscription)
44
+ context "#delete" do
45
+ should "be deletable" do
46
+ subscription = Stripe::Subscription.retrieve("sub_123")
47
+ subscription = subscription.delete
48
+ assert_requested :delete,
49
+ "#{Stripe.api_base}/v1/subscriptions/#{subscription.id}"
50
+ assert subscription.is_a?(Stripe::Subscription)
51
+ end
52
+ end
53
+
54
+ context ".delete" do
55
+ should "be deletable" do
56
+ subscription = Stripe::Subscription.delete("sub_123")
57
+ assert_requested :delete,
58
+ "#{Stripe.api_base}/v1/subscriptions/sub_123"
59
+ assert subscription.is_a?(Stripe::Subscription)
60
+ end
50
61
  end
51
62
 
52
63
  context "#delete_discount" do
53
64
  should "be able to delete a subscriptions's discount" do
54
65
  subscription = Stripe::Subscription.retrieve("sub_123")
55
- subscription = subscription.delete_discount
56
- assert subscription.is_a?(Stripe::Subscription)
66
+ discount = subscription.delete_discount
67
+ assert_requested :delete, "#{Stripe.api_base}/v1/subscriptions/sub_123/discount"
68
+ assert discount.is_a?(Stripe::Discount)
69
+ end
70
+ end
71
+
72
+ context ".delete_discount" do
73
+ should "be able to delete a subscriptions's discount" do
74
+ discount = Stripe::Subscription.delete_discount("sub_123")
75
+ assert_requested :delete, "#{Stripe.api_base}/v1/subscriptions/sub_123/discount"
76
+ assert discount.is_a?(Stripe::Discount)
57
77
  end
58
78
  end
59
79
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require ::File.expand_path("../test_helper", __dir__)
4
+
5
+ module Stripe
6
+ class TaxIdTest < Test::Unit::TestCase
7
+ context "#resource_url" do
8
+ should "return a resource URL" do
9
+ tax_id = Stripe::TaxId.construct_from(
10
+ id: "txi_123",
11
+ customer: "cus_123"
12
+ )
13
+ assert_equal "/v1/customers/cus_123/tax_ids/txi_123",
14
+ tax_id.resource_url
15
+ end
16
+
17
+ should "raise without a customer" do
18
+ tax_id = Stripe::TaxId.construct_from(id: "txi_123")
19
+ assert_raises NotImplementedError do
20
+ tax_id.resource_url
21
+ end
22
+ end
23
+ end
24
+
25
+ should "raise on #retrieve" do
26
+ assert_raises NotImplementedError do
27
+ Stripe::TaxId.retrieve("txi_123")
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require ::File.expand_path("../test_helper", __dir__)
4
+
5
+ module Stripe
6
+ class TaxRateTest < Test::Unit::TestCase
7
+ should "be listable" do
8
+ tax_rates = Stripe::TaxRate.list
9
+ assert_requested :get, "#{Stripe.api_base}/v1/tax_rates"
10
+ assert tax_rates.data.is_a?(Array)
11
+ assert tax_rates.first.is_a?(Stripe::TaxRate)
12
+ end
13
+
14
+ should "be retrievable" do
15
+ tax_rate = Stripe::TaxRate.retrieve("txr_123")
16
+ assert_requested :get, "#{Stripe.api_base}/v1/tax_rates/txr_123"
17
+ assert tax_rate.is_a?(Stripe::TaxRate)
18
+ end
19
+
20
+ should "be creatable" do
21
+ tax_rate = Stripe::TaxRate.create(
22
+ display_name: "name",
23
+ inclusive: false,
24
+ percentage: 10.15
25
+ )
26
+ assert_requested :post, "#{Stripe.api_base}/v1/tax_rates"
27
+ assert tax_rate.is_a?(Stripe::TaxRate)
28
+ end
29
+
30
+ should "be saveable" do
31
+ tax_rate = Stripe::TaxRate.retrieve("txr_123")
32
+ tax_rate.metadata["key"] = "value"
33
+ tax_rate.save
34
+ assert_requested :post, "#{Stripe.api_base}/v1/tax_rates/#{tax_rate.id}"
35
+ end
36
+
37
+ should "be updateable" do
38
+ tax_rate = Stripe::TaxRate.update("txr_123", metadata: { key: "value" })
39
+ assert_requested :post, "#{Stripe.api_base}/v1/tax_rates/txr_123"
40
+ assert tax_rate.is_a?(Stripe::TaxRate)
41
+ end
42
+ end
43
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require ::File.expand_path("../../../test_helper", __FILE__)
3
+ require ::File.expand_path("../../test_helper", __dir__)
4
4
 
5
5
  module Stripe
6
6
  module Terminal
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require ::File.expand_path("../../../test_helper", __FILE__)
3
+ require ::File.expand_path("../../test_helper", __dir__)
4
4
 
5
5
  module Stripe
6
6
  module Terminal
@@ -46,6 +46,23 @@ module Stripe
46
46
  assert_requested :post, "#{Stripe.api_base}/v1/terminal/locations/loc_123"
47
47
  assert location.is_a?(Stripe::Terminal::Location)
48
48
  end
49
+
50
+ context "#delete" do
51
+ should "be deletable" do
52
+ location = Stripe::Terminal::Location.retrieve("loc_123")
53
+ location = location.delete
54
+ assert_requested :delete, "#{Stripe.api_base}/v1/terminal/locations/#{location.id}"
55
+ assert location.is_a?(Stripe::Terminal::Location)
56
+ end
57
+ end
58
+
59
+ context ".delete" do
60
+ should "be deletable" do
61
+ location = Stripe::Terminal::Location.delete("loc_123")
62
+ assert_requested :delete, "#{Stripe.api_base}/v1/terminal/locations/loc_123"
63
+ assert location.is_a?(Stripe::Terminal::Location)
64
+ end
65
+ end
49
66
  end
50
67
  end
51
68
  end