stripe 3.2.0 → 5.16.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (230) hide show
  1. checksums.yaml +5 -5
  2. data/.editorconfig +10 -0
  3. data/.gitignore +3 -0
  4. data/.rubocop.yml +80 -0
  5. data/.rubocop_todo.yml +33 -0
  6. data/.travis.yml +9 -7
  7. data/.vscode/extensions.json +7 -0
  8. data/.vscode/settings.json +8 -0
  9. data/CHANGELOG.md +876 -0
  10. data/CODE_OF_CONDUCT.md +77 -0
  11. data/Gemfile +21 -21
  12. data/History.txt +1 -678
  13. data/README.md +195 -53
  14. data/Rakefile +18 -12
  15. data/VERSION +1 -1
  16. data/bin/stripe-console +5 -3
  17. data/lib/stripe/api_operations/create.rb +3 -1
  18. data/lib/stripe/api_operations/delete.rb +26 -2
  19. data/lib/stripe/api_operations/list.rb +3 -12
  20. data/lib/stripe/api_operations/nested_resource.rb +72 -0
  21. data/lib/stripe/api_operations/request.rb +33 -15
  22. data/lib/stripe/api_operations/save.rb +18 -9
  23. data/lib/stripe/api_resource.rb +60 -10
  24. data/lib/stripe/connection_manager.rb +159 -0
  25. data/lib/stripe/error_object.rb +94 -0
  26. data/lib/stripe/errors.rb +39 -19
  27. data/lib/stripe/instrumentation.rb +82 -0
  28. data/lib/stripe/list_object.rb +54 -22
  29. data/lib/stripe/multipart_encoder.rb +131 -0
  30. data/lib/stripe/oauth.rb +22 -14
  31. data/lib/stripe/object_types.rb +96 -0
  32. data/lib/stripe/{account.rb → resources/account.rb} +72 -34
  33. data/lib/stripe/resources/account_link.rb +9 -0
  34. data/lib/stripe/resources/alipay_account.rb +34 -0
  35. data/lib/stripe/{apple_pay_domain.rb → resources/apple_pay_domain.rb} +4 -2
  36. data/lib/stripe/resources/application_fee.rb +13 -0
  37. data/lib/stripe/resources/application_fee_refund.rb +30 -0
  38. data/lib/stripe/{balance.rb → resources/balance.rb} +3 -1
  39. data/lib/stripe/{balance_transaction.rb → resources/balance_transaction.rb} +3 -5
  40. data/lib/stripe/resources/bank_account.rb +42 -0
  41. data/lib/stripe/{bitcoin_receiver.rb → resources/bitcoin_receiver.rb} +6 -5
  42. data/lib/stripe/resources/bitcoin_transaction.rb +15 -0
  43. data/lib/stripe/resources/capability.rb +33 -0
  44. data/lib/stripe/resources/card.rb +37 -0
  45. data/lib/stripe/resources/charge.rb +22 -0
  46. data/lib/stripe/resources/checkout/session.rb +12 -0
  47. data/lib/stripe/{country_spec.rb → resources/country_spec.rb} +3 -5
  48. data/lib/stripe/{coupon.rb → resources/coupon.rb} +4 -2
  49. data/lib/stripe/resources/credit_note.rb +32 -0
  50. data/lib/stripe/resources/credit_note_line_item.rb +7 -0
  51. data/lib/stripe/resources/customer.rb +35 -0
  52. data/lib/stripe/resources/customer_balance_transaction.rb +30 -0
  53. data/lib/stripe/resources/discount.rb +7 -0
  54. data/lib/stripe/resources/dispute.rb +21 -0
  55. data/lib/stripe/resources/ephemeral_key.rb +19 -0
  56. data/lib/stripe/{event.rb → resources/event.rb} +3 -1
  57. data/lib/stripe/resources/exchange_rate.rb +9 -0
  58. data/lib/stripe/resources/file.rb +34 -0
  59. data/lib/stripe/resources/file_link.rb +11 -0
  60. data/lib/stripe/resources/invoice.rb +73 -0
  61. data/lib/stripe/{invoice_item.rb → resources/invoice_item.rb} +4 -2
  62. data/lib/stripe/{invoice_line_item.rb → resources/invoice_line_item.rb} +3 -1
  63. data/lib/stripe/resources/issuing/authorization.rb +33 -0
  64. data/lib/stripe/resources/issuing/card.rb +24 -0
  65. data/lib/stripe/resources/issuing/card_details.rb +9 -0
  66. data/lib/stripe/resources/issuing/cardholder.rb +13 -0
  67. data/lib/stripe/resources/issuing/dispute.rb +13 -0
  68. data/lib/stripe/resources/issuing/transaction.rb +12 -0
  69. data/lib/stripe/resources/login_link.rb +14 -0
  70. data/lib/stripe/resources/mandate.rb +7 -0
  71. data/lib/stripe/resources/order.rb +32 -0
  72. data/lib/stripe/{order_return.rb → resources/order_return.rb} +3 -5
  73. data/lib/stripe/resources/payment_intent.rb +42 -0
  74. data/lib/stripe/resources/payment_method.rb +32 -0
  75. data/lib/stripe/resources/payout.rb +22 -0
  76. data/lib/stripe/resources/person.rb +31 -0
  77. data/lib/stripe/{plan.rb → resources/plan.rb} +3 -1
  78. data/lib/stripe/{product.rb → resources/product.rb} +5 -3
  79. data/lib/stripe/resources/radar/early_fraud_warning.rb +11 -0
  80. data/lib/stripe/resources/radar/value_list.rb +14 -0
  81. data/lib/stripe/resources/radar/value_list_item.rb +13 -0
  82. data/lib/stripe/{recipient.rb → resources/recipient.rb} +5 -6
  83. data/lib/stripe/resources/recipient_transfer.rb +7 -0
  84. data/lib/stripe/{refund.rb → resources/refund.rb} +3 -1
  85. data/lib/stripe/resources/reporting/report_run.rb +12 -0
  86. data/lib/stripe/resources/reporting/report_type.rb +12 -0
  87. data/lib/stripe/resources/reversal.rb +29 -0
  88. data/lib/stripe/resources/review.rb +20 -0
  89. data/lib/stripe/resources/setup_intent.rb +32 -0
  90. data/lib/stripe/resources/sigma/scheduled_query_run.rb +15 -0
  91. data/lib/stripe/{sku.rb → resources/sku.rb} +5 -3
  92. data/lib/stripe/resources/source.rb +46 -0
  93. data/lib/stripe/resources/source_transaction.rb +7 -0
  94. data/lib/stripe/resources/subscription.rb +25 -0
  95. data/lib/stripe/resources/subscription_item.rb +25 -0
  96. data/lib/stripe/resources/subscription_schedule.rb +32 -0
  97. data/lib/stripe/resources/tax_id.rb +26 -0
  98. data/lib/stripe/resources/tax_rate.rb +11 -0
  99. data/lib/stripe/resources/terminal/connection_token.rb +11 -0
  100. data/lib/stripe/resources/terminal/location.rb +14 -0
  101. data/lib/stripe/resources/terminal/reader.rb +14 -0
  102. data/lib/stripe/{three_d_secure.rb → resources/three_d_secure.rb} +3 -1
  103. data/lib/stripe/{token.rb → resources/token.rb} +3 -1
  104. data/lib/stripe/resources/topup.rb +22 -0
  105. data/lib/stripe/resources/transfer.rb +26 -0
  106. data/lib/stripe/resources/usage_record.rb +7 -0
  107. data/lib/stripe/resources/usage_record_summary.rb +7 -0
  108. data/lib/stripe/resources/webhook_endpoint.rb +12 -0
  109. data/lib/stripe/resources.rb +79 -0
  110. data/lib/stripe/singleton_api_resource.rb +10 -4
  111. data/lib/stripe/stripe_client.rb +658 -337
  112. data/lib/stripe/stripe_object.rb +248 -126
  113. data/lib/stripe/stripe_response.rb +55 -21
  114. data/lib/stripe/util.rb +145 -187
  115. data/lib/stripe/version.rb +3 -1
  116. data/lib/stripe/webhook.rb +27 -16
  117. data/lib/stripe.rb +139 -90
  118. data/stripe.gemspec +26 -14
  119. data/test/openapi/README.md +9 -0
  120. data/test/stripe/account_link_test.rb +18 -0
  121. data/test/stripe/account_test.rb +311 -101
  122. data/test/stripe/alipay_account_test.rb +21 -1
  123. data/test/stripe/api_operations_test.rb +57 -8
  124. data/test/stripe/api_resource_test.rb +359 -271
  125. data/test/stripe/apple_pay_domain_test.rb +26 -11
  126. data/test/stripe/application_fee_refund_test.rb +10 -8
  127. data/test/stripe/application_fee_test.rb +49 -3
  128. data/test/stripe/balance_test.rb +4 -2
  129. data/test/stripe/balance_transaction_test.rb +20 -0
  130. data/test/stripe/bank_account_test.rb +11 -11
  131. data/test/stripe/capability_test.rb +45 -0
  132. data/test/stripe/charge_test.rb +25 -18
  133. data/test/stripe/checkout/session_test.rb +41 -0
  134. data/test/stripe/connection_manager_test.rb +163 -0
  135. data/test/stripe/country_spec_test.rb +6 -4
  136. data/test/stripe/coupon_test.rb +29 -10
  137. data/test/stripe/credit_note_test.rb +90 -0
  138. data/test/stripe/customer_balance_transaction_test.rb +37 -0
  139. data/test/stripe/customer_card_test.rb +13 -17
  140. data/test/stripe/customer_test.rb +161 -49
  141. data/test/stripe/dispute_test.rb +19 -8
  142. data/test/stripe/ephemeral_key_test.rb +23 -14
  143. data/test/stripe/errors_test.rb +32 -9
  144. data/test/stripe/exchange_rate_test.rb +20 -0
  145. data/test/stripe/file_link_test.rb +41 -0
  146. data/test/stripe/file_test.rb +87 -0
  147. data/test/stripe/instrumentation_test.rb +74 -0
  148. data/test/stripe/invoice_item_test.rb +31 -18
  149. data/test/stripe/invoice_line_item_test.rb +3 -1
  150. data/test/stripe/invoice_test.rb +158 -39
  151. data/test/stripe/issuing/authorization_test.rb +72 -0
  152. data/test/stripe/issuing/card_test.rb +62 -0
  153. data/test/stripe/issuing/cardholder_test.rb +53 -0
  154. data/test/stripe/issuing/dispute_test.rb +45 -0
  155. data/test/stripe/issuing/transaction_test.rb +48 -0
  156. data/test/stripe/list_object_test.rb +120 -88
  157. data/test/stripe/login_link_test.rb +16 -14
  158. data/test/stripe/mandate_test.rb +14 -0
  159. data/test/stripe/multipart_encoder_test.rb +130 -0
  160. data/test/stripe/oauth_test.rb +69 -50
  161. data/test/stripe/order_return_test.rb +7 -5
  162. data/test/stripe/order_test.rb +39 -14
  163. data/test/stripe/payment_intent_test.rb +107 -0
  164. data/test/stripe/payment_method_test.rb +84 -0
  165. data/test/stripe/payout_test.rb +18 -9
  166. data/test/stripe/person_test.rb +46 -0
  167. data/test/stripe/plan_test.rb +67 -19
  168. data/test/stripe/product_test.rb +28 -14
  169. data/test/stripe/radar/early_fraud_warning_test.rb +22 -0
  170. data/test/stripe/radar/value_list_item_test.rb +48 -0
  171. data/test/stripe/radar/value_list_test.rb +61 -0
  172. data/test/stripe/recipient_test.rb +27 -13
  173. data/test/stripe/refund_test.rb +11 -9
  174. data/test/stripe/reporting/report_run_test.rb +33 -0
  175. data/test/stripe/reporting/report_type_test.rb +22 -0
  176. data/test/stripe/reversal_test.rb +12 -10
  177. data/test/stripe/review_test.rb +27 -0
  178. data/test/stripe/setup_intent_test.rb +84 -0
  179. data/test/stripe/sigma/scheduled_query_run_test.rb +22 -0
  180. data/test/stripe/sku_test.rb +24 -12
  181. data/test/stripe/source_test.rb +70 -19
  182. data/test/stripe/stripe_client_test.rb +867 -326
  183. data/test/stripe/stripe_object_test.rb +284 -182
  184. data/test/stripe/stripe_response_test.rb +73 -24
  185. data/test/stripe/subscription_item_test.rb +47 -15
  186. data/test/stripe/subscription_schedule_test.rb +82 -0
  187. data/test/stripe/subscription_test.rb +41 -19
  188. data/test/stripe/tax_id_test.rb +31 -0
  189. data/test/stripe/tax_rate_test.rb +43 -0
  190. data/test/stripe/terminal/connection_token_test.rb +16 -0
  191. data/test/stripe/terminal/location_test.rb +68 -0
  192. data/test/stripe/terminal/reader_test.rb +62 -0
  193. data/test/stripe/three_d_secure_test.rb +4 -2
  194. data/test/stripe/topup_test.rb +62 -0
  195. data/test/stripe/transfer_test.rb +55 -8
  196. data/test/stripe/usage_record_summary_test.rb +29 -0
  197. data/test/stripe/util_test.rb +173 -84
  198. data/test/stripe/webhook_endpoint_test.rb +59 -0
  199. data/test/stripe/webhook_test.rb +21 -17
  200. data/test/stripe_mock.rb +78 -0
  201. data/test/stripe_test.rb +6 -15
  202. data/test/test_data.rb +28 -26
  203. data/test/test_helper.rb +48 -29
  204. metadata +183 -70
  205. data/lib/stripe/alipay_account.rb +0 -22
  206. data/lib/stripe/application_fee.rb +0 -22
  207. data/lib/stripe/application_fee_refund.rb +0 -20
  208. data/lib/stripe/bank_account.rb +0 -30
  209. data/lib/stripe/bitcoin_transaction.rb +0 -11
  210. data/lib/stripe/card.rb +0 -27
  211. data/lib/stripe/charge.rb +0 -82
  212. data/lib/stripe/customer.rb +0 -79
  213. data/lib/stripe/dispute.rb +0 -17
  214. data/lib/stripe/ephemeral_key.rb +0 -18
  215. data/lib/stripe/file_upload.rb +0 -33
  216. data/lib/stripe/invoice.rb +0 -29
  217. data/lib/stripe/login_link.rb +0 -9
  218. data/lib/stripe/order.rb +0 -29
  219. data/lib/stripe/payout.rb +0 -18
  220. data/lib/stripe/recipient_transfer.rb +0 -6
  221. data/lib/stripe/reversal.rb +0 -20
  222. data/lib/stripe/source.rb +0 -23
  223. data/lib/stripe/subscription.rb +0 -33
  224. data/lib/stripe/subscription_item.rb +0 -14
  225. data/lib/stripe/transfer.rb +0 -18
  226. data/test/api_stub_helpers.rb +0 -0
  227. data/test/stripe/bitcoin_receiver_test.rb +0 -67
  228. data/test/stripe/bitcoin_transaction_test.rb +0 -19
  229. data/test/stripe/file_upload_test.rb +0 -66
  230. data/test/stripe/recipient_card_test.rb +0 -44
@@ -1,173 +1,177 @@
1
- require File.expand_path('../../test_helper', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ require ::File.expand_path("../test_helper", __dir__)
2
4
 
3
5
  module Stripe
4
6
  class AccountTest < Test::Unit::TestCase
5
7
  should "be listable" do
6
8
  accounts = Stripe::Account.list
7
9
  assert_requested :get, "#{Stripe.api_base}/v1/accounts"
8
- assert accounts.data.kind_of?(Array)
9
- assert accounts.data[0].kind_of?(Stripe::Account)
10
+ assert accounts.data.is_a?(Array)
11
+ assert accounts.data[0].is_a?(Stripe::Account)
10
12
  end
11
13
 
12
14
  should "be retrievable using singular endpoint" do
13
15
  account = Stripe::Account.retrieve
14
16
  assert_requested :get, "#{Stripe.api_base}/v1/account"
15
- assert account.kind_of?(Stripe::Account)
17
+ assert account.is_a?(Stripe::Account)
16
18
  end
17
19
 
18
20
  should "be retrievable using plural endpoint" do
19
21
  account = Stripe::Account.retrieve("acct_123")
20
22
  assert_requested :get, "#{Stripe.api_base}/v1/accounts/acct_123"
21
- assert account.kind_of?(Stripe::Account)
23
+ assert account.is_a?(Stripe::Account)
22
24
  end
23
25
 
24
26
  should "be rejectable" do
25
- account_data = {:id => 'acct_foo'}
26
- stub_request(:get, "#{Stripe.api_base}/v1/accounts/acct_foo").
27
- to_return(body: JSON.generate(account_data))
28
-
29
- stub_request(:post, "#{Stripe.api_base}/v1/accounts/acct_foo/reject").
30
- to_return(body: JSON.generate(account_data))
27
+ account = Stripe::Account.retrieve("acct_foo")
28
+ account = account.reject(reason: "fraud")
29
+ assert_requested :post, "#{Stripe.api_base}/v1/accounts/#{account.id}/reject"
30
+ assert account.is_a?(Stripe::Account)
31
+ end
31
32
 
32
- account = Stripe::Account.retrieve('acct_foo')
33
- account.reject(:reason => 'fraud')
33
+ context ".reject" do
34
+ should "reject the account" do
35
+ account = Stripe::Account.reject("acct_foo", reason: "fraud")
36
+ assert_requested :post, "#{Stripe.api_base}/v1/accounts/#{account.id}/reject"
37
+ assert account.is_a?(Stripe::Account)
38
+ end
34
39
  end
35
40
 
36
41
  should "be creatable" do
37
- account = Stripe::Account.create(:metadata => {}, :type => 'standard')
42
+ account = Stripe::Account.create(metadata: {}, type: "standard")
38
43
  assert_requested :post, "#{Stripe.api_base}/v1/accounts"
39
- assert account.kind_of?(Stripe::Account)
44
+ assert account.is_a?(Stripe::Account)
40
45
  end
41
46
 
42
47
  should "be saveable" do
43
48
  account = Stripe::Account.retrieve("acct_123")
44
- account.metadata['key'] = 'value'
49
+ account.metadata["key"] = "value"
45
50
  account.save
46
51
  assert_requested :post, "#{Stripe.api_base}/v1/accounts/#{account.id}"
47
52
  end
48
53
 
49
54
  should "be updateable" do
50
- account = Stripe::Account.update("acct_123", metadata: {foo: 'bar'})
55
+ account = Stripe::Account.update("acct_123", metadata: { foo: "bar" })
51
56
  assert_requested :post, "#{Stripe.api_base}/v1/accounts/acct_123"
52
- assert account.kind_of?(Stripe::Account)
57
+ assert account.is_a?(Stripe::Account)
53
58
  end
54
59
 
55
- should "be deletable" do
56
- account = Stripe::Account.retrieve("acct_123")
57
- account = account.delete
58
- assert_requested :delete, "#{Stripe.api_base}/v1/accounts/#{account.id}"
59
- assert account.kind_of?(Stripe::Account)
60
- end
61
-
62
- context "#bank_account=" do
63
- should "warn that #bank_account= is deprecated" do
64
- old_stderr = $stderr
65
- $stderr = StringIO.new
66
- begin
67
- account = Stripe::Account.retrieve("acct_123")
68
- account.bank_account = "tok_123"
69
- message = "NOTE: Stripe::Account#bank_account= is " +
70
- "deprecated; use #external_account= instead"
71
- assert_match Regexp.new(message), $stderr.string
72
- ensure
73
- $stderr = old_stderr
74
- end
60
+ context "#delete" do
61
+ should "be deletable" do
62
+ account = Stripe::Account.retrieve("acct_123")
63
+ account = account.delete
64
+ assert_requested :delete, "#{Stripe.api_base}/v1/accounts/#{account.id}"
65
+ assert account.is_a?(Stripe::Account)
75
66
  end
76
67
  end
77
68
 
69
+ context ".delete" do
70
+ should "be deletable" do
71
+ account = Stripe::Account.delete("acct_123")
72
+ assert_requested :delete, "#{Stripe.api_base}/v1/accounts/acct_123"
73
+ assert account.is_a?(Stripe::Account)
74
+ end
75
+ end
76
+
77
+ should "be able to list Persons" do
78
+ account = Stripe::Account.retrieve("acct_123")
79
+ persons = account.persons
80
+ assert_requested :get, "#{Stripe.api_base}/v1/accounts/acct_123/persons"
81
+ assert persons.data.is_a?(Array)
82
+ assert persons.data[0].is_a?(Stripe::Person)
83
+ end
84
+
78
85
  context "#deauthorize" do
79
86
  should "deauthorize an account" do
80
87
  account = Stripe::Account.retrieve("acct_123")
81
88
 
82
89
  # Unfortunately, the OpenAPI spec doesn't yet cover anything under the
83
90
  # Connect endpoints, so for just stub this out with Webmock.
84
- stub_request(:post, "#{Stripe.connect_base}/oauth/deauthorize").
85
- with(body: { 'client_id' => 'ca_1234', 'stripe_user_id' => account.id}).
86
- to_return(body: JSON.generate({ 'stripe_user_id' => account.id }))
87
- account.deauthorize('ca_1234', 'sk_test_1234')
91
+ stub_request(:post, "#{Stripe.connect_base}/oauth/deauthorize")
92
+ .with(body: { "client_id" => "ca_1234", "stripe_user_id" => account.id })
93
+ .to_return(body: JSON.generate("stripe_user_id" => account.id))
94
+ account.deauthorize("ca_1234", "sk_test_1234")
88
95
  end
89
96
  end
90
97
 
91
98
  context "#legal_entity=" do
92
- should 'disallow direct overrides' do
93
- account = Stripe::Account.retrieve("acct_123")
99
+ should "disallow direct overrides" do
100
+ account = Stripe::Account.construct_from(
101
+ id: "acct_123",
102
+ legal_entity: {
103
+ first_name: "name",
104
+ }
105
+ )
94
106
 
95
107
  assert_raise NoMethodError do
96
- account.legal_entity = {:first_name => 'Blah'}
108
+ account.legal_entity = { first_name: "Blah" }
97
109
  end
98
110
 
99
- account.legal_entity.first_name = 'Blah'
111
+ account.legal_entity.first_name = "Blah"
100
112
  end
101
113
  end
102
114
 
103
115
  context "#serialize_params" do
104
- should "serialize an a new additional_owners" do
116
+ should "serialize a new additional_owners" do
105
117
  obj = Stripe::Util.convert_to_stripe_object({
106
- :object => "account",
107
- :legal_entity => Stripe::StripeObject.construct_from({
118
+ object: "account",
119
+ legal_entity: Stripe::StripeObject.construct_from({
108
120
  }),
109
121
  }, {})
110
122
  obj.legal_entity.additional_owners = [
111
- { :first_name => "Joe" },
112
- { :first_name => "Jane" },
123
+ { first_name: "Joe" },
124
+ { first_name: "Jane" },
113
125
  ]
114
126
 
115
127
  expected = {
116
- :legal_entity => {
117
- :additional_owners => {
118
- "0" => { :first_name => "Joe" },
119
- "1" => { :first_name => "Jane" },
120
- }
121
- }
128
+ legal_entity: {
129
+ additional_owners: {
130
+ "0" => { first_name: "Joe" },
131
+ "1" => { first_name: "Jane" },
132
+ },
133
+ },
122
134
  }
123
135
  assert_equal(expected, obj.serialize_params)
124
136
  end
125
137
 
126
138
  should "serialize on an partially changed additional_owners" do
127
139
  obj = Stripe::Util.convert_to_stripe_object({
128
- :object => "account",
129
- :legal_entity => {
130
- :additional_owners => [
131
- Stripe::StripeObject.construct_from({
132
- :first_name => "Joe"
133
- }),
134
- Stripe::StripeObject.construct_from({
135
- :first_name => "Jane"
136
- }),
137
- ]
138
- }
140
+ object: "account",
141
+ legal_entity: {
142
+ additional_owners: [
143
+ Stripe::StripeObject.construct_from(first_name: "Joe"),
144
+ Stripe::StripeObject.construct_from(first_name: "Jane"),
145
+ ],
146
+ },
139
147
  }, {})
140
148
  obj.legal_entity.additional_owners[1].first_name = "Stripe"
141
149
 
142
150
  expected = {
143
- :legal_entity => {
144
- :additional_owners => {
145
- "1" => { :first_name => "Stripe" }
146
- }
147
- }
151
+ legal_entity: {
152
+ additional_owners: {
153
+ "1" => { first_name: "Stripe" },
154
+ },
155
+ },
148
156
  }
149
157
  assert_equal(expected, obj.serialize_params)
150
158
  end
151
159
 
152
160
  should "serialize on an unchanged additional_owners" do
153
161
  obj = Stripe::Util.convert_to_stripe_object({
154
- :object => "account",
155
- :legal_entity => {
156
- :additional_owners => [
157
- Stripe::StripeObject.construct_from({
158
- :first_name => "Joe"
159
- }),
160
- Stripe::StripeObject.construct_from({
161
- :first_name => "Jane"
162
- }),
163
- ]
164
- }
162
+ object: "account",
163
+ legal_entity: {
164
+ additional_owners: [
165
+ Stripe::StripeObject.construct_from(first_name: "Joe"),
166
+ Stripe::StripeObject.construct_from(first_name: "Jane"),
167
+ ],
168
+ },
165
169
  }, {})
166
170
 
167
171
  expected = {
168
- :legal_entity => {
169
- :additional_owners => {}
170
- }
172
+ legal_entity: {
173
+ additional_owners: {},
174
+ },
171
175
  }
172
176
  assert_equal(expected, obj.serialize_params)
173
177
  end
@@ -176,27 +180,233 @@ module Stripe
176
180
  # meaning for the server, which interprets it as an array unset.
177
181
  should "serialize on an unset additional_owners" do
178
182
  obj = Stripe::Util.convert_to_stripe_object({
179
- :object => "account",
180
- :legal_entity => {
181
- :additional_owners => [
182
- Stripe::StripeObject.construct_from({
183
- :first_name => "Joe"
184
- }),
185
- Stripe::StripeObject.construct_from({
186
- :first_name => "Jane"
187
- }),
188
- ]
189
- }
183
+ object: "account",
184
+ legal_entity: {
185
+ additional_owners: [
186
+ Stripe::StripeObject.construct_from(first_name: "Joe"),
187
+ Stripe::StripeObject.construct_from(first_name: "Jane"),
188
+ ],
189
+ },
190
190
  }, {})
191
191
  obj.legal_entity.additional_owners = nil
192
192
 
193
193
  expected = {
194
- :legal_entity => {
195
- :additional_owners => ""
196
- }
194
+ legal_entity: {
195
+ additional_owners: "",
196
+ },
197
197
  }
198
198
  assert_equal(expected, obj.serialize_params)
199
199
  end
200
+
201
+ should "serialize on a new individual" do
202
+ obj = Stripe::Util.convert_to_stripe_object({
203
+ object: "account",
204
+ }, {})
205
+ obj.individual = { first_name: "Jane" }
206
+
207
+ expected = { individual: { first_name: "Jane" } }
208
+ assert_equal(expected, obj.serialize_params)
209
+ end
210
+
211
+ should "serialize on a partially changed individual" do
212
+ obj = Stripe::Util.convert_to_stripe_object({
213
+ object: "account",
214
+ individual: Stripe::Util.convert_to_stripe_object({
215
+ object: "person",
216
+ first_name: "Jenny",
217
+ }, {}),
218
+ }, {})
219
+ obj.individual = { first_name: "Jane" }
220
+
221
+ expected = { individual: { first_name: "Jane" } }
222
+ assert_equal(expected, obj.serialize_params)
223
+ end
224
+
225
+ should "serialize on an unchanged individual" do
226
+ obj = Stripe::Util.convert_to_stripe_object({
227
+ object: "account",
228
+ individual: Stripe::Util.convert_to_stripe_object({
229
+ object: "person",
230
+ first_name: "Jenny",
231
+ }, {}),
232
+ }, {})
233
+
234
+ expected = { individual: {} }
235
+ assert_equal(expected, obj.serialize_params)
236
+ end
237
+
238
+ should "serialize on an unset individual" do
239
+ obj = Stripe::Util.convert_to_stripe_object({
240
+ object: "account",
241
+ individual: Stripe::Util.convert_to_stripe_object({
242
+ object: "person",
243
+ first_name: "Jenny",
244
+ }, {}),
245
+ }, {})
246
+ obj.individual = nil
247
+
248
+ expected = { individual: "" }
249
+ assert_equal(expected, obj.serialize_params)
250
+ end
251
+ end
252
+
253
+ context "#retrieve_capability" do
254
+ should "retrieve a capability" do
255
+ capability = Stripe::Account.retrieve_capability(
256
+ "acct_123",
257
+ "acap_123"
258
+ )
259
+ assert_requested :get, "#{Stripe.api_base}/v1/accounts/acct_123/capabilities/acap_123"
260
+ assert capability.is_a?(Stripe::Capability)
261
+ end
262
+ end
263
+
264
+ context "#update_capability" do
265
+ should "update a capability" do
266
+ capability = Stripe::Account.update_capability(
267
+ "acct_123",
268
+ "acap_123",
269
+ requested: true
270
+ )
271
+ assert_requested :post, "#{Stripe.api_base}/v1/accounts/acct_123/capabilities/acap_123"
272
+ assert capability.is_a?(Stripe::Capability)
273
+ end
274
+ end
275
+
276
+ context "#list_capabilities" do
277
+ should "list the account's external accounts" do
278
+ capabilities = Stripe::Account.list_capabilities(
279
+ "acct_123"
280
+ )
281
+ assert_requested :get, "#{Stripe.api_base}/v1/accounts/acct_123/capabilities"
282
+ assert capabilities.is_a?(Stripe::ListObject)
283
+ assert capabilities.data.is_a?(Array)
284
+ end
285
+ end
286
+
287
+ context "#create_external_account" do
288
+ should "create an external account" do
289
+ external_account = Stripe::Account.create_external_account(
290
+ "acct_123",
291
+ external_account: "btok_123"
292
+ )
293
+ assert_requested :post, "#{Stripe.api_base}/v1/accounts/acct_123/external_accounts"
294
+ assert external_account.is_a?(Stripe::BankAccount)
295
+ end
296
+ end
297
+
298
+ context "#retrieve_external_account" do
299
+ should "retrieve an external account" do
300
+ external_account = Stripe::Account.retrieve_external_account(
301
+ "acct_123",
302
+ "ba_123"
303
+ )
304
+ assert_requested :get, "#{Stripe.api_base}/v1/accounts/acct_123/external_accounts/ba_123"
305
+ assert external_account.is_a?(Stripe::BankAccount)
306
+ end
307
+ end
308
+
309
+ context "#update_external_account" do
310
+ should "update an external account" do
311
+ external_account = Stripe::Account.update_external_account(
312
+ "acct_123",
313
+ "ba_123",
314
+ metadata: { foo: "bar" }
315
+ )
316
+ assert_requested :post, "#{Stripe.api_base}/v1/accounts/acct_123/external_accounts/ba_123"
317
+ assert external_account.is_a?(Stripe::BankAccount)
318
+ end
319
+ end
320
+
321
+ context "#delete_external_account" do
322
+ should "delete an external_account" do
323
+ external_account = Stripe::Account.delete_external_account(
324
+ "acct_123",
325
+ "ba_123"
326
+ )
327
+ assert_requested :delete, "#{Stripe.api_base}/v1/accounts/acct_123/external_accounts/ba_123"
328
+ assert external_account.deleted
329
+ assert_equal "ba_123", external_account.id
330
+ end
331
+ end
332
+
333
+ context "#list_external_accounts" do
334
+ should "list the account's external accounts" do
335
+ external_accounts = Stripe::Account.list_external_accounts(
336
+ "acct_123"
337
+ )
338
+ assert_requested :get, "#{Stripe.api_base}/v1/accounts/acct_123/external_accounts"
339
+ assert external_accounts.is_a?(Stripe::ListObject)
340
+ assert external_accounts.data.is_a?(Array)
341
+ end
342
+ end
343
+
344
+ context "#create_login_link" do
345
+ should "create a login link" do
346
+ login_link = Stripe::Account.create_login_link(
347
+ "acct_123"
348
+ )
349
+ assert_requested :post, "#{Stripe.api_base}/v1/accounts/acct_123/login_links"
350
+ assert login_link.is_a?(Stripe::LoginLink)
351
+ end
352
+ end
353
+
354
+ context "#create_person" do
355
+ should "create a person" do
356
+ person = Stripe::Account.create_person(
357
+ "acct_123",
358
+ first_name: "John",
359
+ last_name: "Doe"
360
+ )
361
+ assert_requested :post, "#{Stripe.api_base}/v1/accounts/acct_123/persons"
362
+ assert person.is_a?(Stripe::Person)
363
+ end
364
+ end
365
+
366
+ context "#retrieve_person" do
367
+ should "retrieve a person" do
368
+ person = Stripe::Account.retrieve_person(
369
+ "acct_123",
370
+ "person_123"
371
+ )
372
+ assert_requested :get, "#{Stripe.api_base}/v1/accounts/acct_123/persons/person_123"
373
+ assert person.is_a?(Stripe::Person)
374
+ end
375
+ end
376
+
377
+ context "#update_person" do
378
+ should "update a person" do
379
+ person = Stripe::Account.update_person(
380
+ "acct_123",
381
+ "person_123",
382
+ first_name: "John"
383
+ )
384
+ assert_requested :post, "#{Stripe.api_base}/v1/accounts/acct_123/persons/person_123"
385
+ assert person.is_a?(Stripe::Person)
386
+ end
387
+ end
388
+
389
+ context "#delete_person" do
390
+ should "delete an person" do
391
+ person = Stripe::Account.delete_person(
392
+ "acct_123",
393
+ "person_123"
394
+ )
395
+ assert_requested :delete, "#{Stripe.api_base}/v1/accounts/acct_123/persons/person_123"
396
+ assert person.deleted
397
+ assert_equal "person_123", person.id
398
+ end
399
+ end
400
+
401
+ context "#list_persons" do
402
+ should "list the account's external accounts" do
403
+ persons = Stripe::Account.list_persons(
404
+ "acct_123"
405
+ )
406
+ assert_requested :get, "#{Stripe.api_base}/v1/accounts/acct_123/persons"
407
+ assert persons.is_a?(Stripe::ListObject)
408
+ assert persons.data.is_a?(Array)
409
+ end
200
410
  end
201
411
  end
202
412
  end
@@ -1,7 +1,27 @@
1
- require File.expand_path('../../test_helper', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ require ::File.expand_path("../test_helper", __dir__)
2
4
 
3
5
  module Stripe
4
6
  class AlipayAccountTest < Test::Unit::TestCase
7
+ context "#resource_url" do
8
+ should "return a resource URL" do
9
+ alipay_account = Stripe::AlipayAccount.construct_from(
10
+ id: "aliacc_123",
11
+ customer: "cus_123"
12
+ )
13
+ assert_equal "/v1/customers/cus_123/sources/aliacc_123",
14
+ alipay_account.resource_url
15
+ end
16
+
17
+ should "raise without a customer" do
18
+ alipay_account = Stripe::AlipayAccount.construct_from(id: "aliacc_123")
19
+ assert_raises NotImplementedError do
20
+ alipay_account.resource_url
21
+ end
22
+ end
23
+ end
24
+
5
25
  should "raise on #retrieve" do
6
26
  assert_raises NotImplementedError do
7
27
  Stripe::AlipayAccount.retrieve("aliacc_123")
@@ -1,11 +1,14 @@
1
- # -*- coding: utf-8 -*-
2
- require File.expand_path('../../test_helper', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ require ::File.expand_path("../test_helper", __dir__)
3
4
 
4
5
  module Stripe
5
6
  class ApiOperationsTest < Test::Unit::TestCase
6
7
  class UpdateableResource < APIResource
7
8
  include Stripe::APIOperations::Save
8
9
 
10
+ OBJECT_NAME = "updateableresource"
11
+
9
12
  def self.protected_fields
10
13
  [:protected]
11
14
  end
@@ -13,19 +16,65 @@ module Stripe
13
16
 
14
17
  context ".update" do
15
18
  should "post the correct parameters to the resource URL" do
16
- stub_request(:post, "#{Stripe.api_base}/v1/updateableresources/id").
17
- with(body: { foo: "bar" }).
18
- to_return(body: JSON.generate({ foo: "bar" }))
19
- resource = UpdateableResource::update("id", { foo: "bar" })
20
- assert_equal('bar', resource.foo)
19
+ stub_request(:post, "#{Stripe.api_base}/v1/updateableresources/id")
20
+ .with(body: { foo: "bar" })
21
+ .to_return(body: JSON.generate(foo: "bar"))
22
+ resource = UpdateableResource.update("id", foo: "bar")
23
+ assert_equal("bar", resource.foo)
21
24
  end
22
25
 
23
26
  should "error on protected fields" do
24
27
  e = assert_raises do
25
- UpdateableResource::update("id", { protected: "bar" })
28
+ UpdateableResource.update("id", protected: "bar")
26
29
  end
27
30
  assert_equal "Cannot update protected field: protected", e.message
28
31
  end
29
32
  end
33
+
34
+ context ".nested_resource_class_methods" do
35
+ class MainResource < APIResource
36
+ extend Stripe::APIOperations::NestedResource
37
+ OBJECT_NAME = "mainresource"
38
+ nested_resource_class_methods :nested,
39
+ operations: %i[create retrieve update delete list]
40
+ end
41
+
42
+ should "define a create method" do
43
+ stub_request(:post, "#{Stripe.api_base}/v1/mainresources/id/nesteds")
44
+ .with(body: { foo: "bar" })
45
+ .to_return(body: JSON.generate(id: "nested_id", object: "nested", foo: "bar"))
46
+ nested_resource = MainResource.create_nested("id", foo: "bar")
47
+ assert_equal "bar", nested_resource.foo
48
+ end
49
+
50
+ should "define a retrieve method" do
51
+ stub_request(:get, "#{Stripe.api_base}/v1/mainresources/id/nesteds/nested_id")
52
+ .to_return(body: JSON.generate(id: "nested_id", object: "nested", foo: "bar"))
53
+ nested_resource = MainResource.retrieve_nested("id", "nested_id")
54
+ assert_equal "bar", nested_resource.foo
55
+ end
56
+
57
+ should "define an update method" do
58
+ stub_request(:post, "#{Stripe.api_base}/v1/mainresources/id/nesteds/nested_id")
59
+ .with(body: { foo: "baz" })
60
+ .to_return(body: JSON.generate(id: "nested_id", object: "nested", foo: "baz"))
61
+ nested_resource = MainResource.update_nested("id", "nested_id", foo: "baz")
62
+ assert_equal "baz", nested_resource.foo
63
+ end
64
+
65
+ should "define a delete method" do
66
+ stub_request(:delete, "#{Stripe.api_base}/v1/mainresources/id/nesteds/nested_id")
67
+ .to_return(body: JSON.generate(id: "nested_id", object: "nested", deleted: true))
68
+ nested_resource = MainResource.delete_nested("id", "nested_id")
69
+ assert_equal true, nested_resource.deleted
70
+ end
71
+
72
+ should "define a list method" do
73
+ stub_request(:get, "#{Stripe.api_base}/v1/mainresources/id/nesteds")
74
+ .to_return(body: JSON.generate(object: "list", data: []))
75
+ nested_resources = MainResource.list_nesteds("id")
76
+ assert nested_resources.data.is_a?(Array)
77
+ end
78
+ end
30
79
  end
31
80
  end