stripe 1.30.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitattributes +4 -0
- data/.github/ISSUE_TEMPLATE.md +5 -0
- data/.travis.yml +3 -14
- data/Gemfile +28 -4
- data/History.txt +180 -0
- data/README.md +147 -0
- data/Rakefile +10 -0
- data/VERSION +1 -1
- data/bin/stripe-console +12 -5
- data/lib/data/ca-certificates.crt +3868 -5114
- data/lib/stripe/account.rb +43 -23
- data/lib/stripe/alipay_account.rb +20 -0
- data/lib/stripe/api_operations/create.rb +2 -2
- data/lib/stripe/api_operations/delete.rb +2 -2
- data/lib/stripe/api_operations/list.rb +2 -3
- data/lib/stripe/api_operations/request.rb +9 -3
- data/lib/stripe/api_operations/save.rb +85 -0
- data/lib/stripe/api_resource.rb +38 -5
- data/lib/stripe/apple_pay_domain.rb +12 -0
- data/lib/stripe/application_fee.rb +8 -8
- data/lib/stripe/application_fee_refund.rb +7 -3
- data/lib/stripe/balance_transaction.rb +1 -1
- data/lib/stripe/bank_account.rb +13 -4
- data/lib/stripe/bitcoin_receiver.rb +6 -6
- data/lib/stripe/bitcoin_transaction.rb +1 -1
- data/lib/stripe/card.rb +9 -5
- data/lib/stripe/charge.rb +38 -20
- data/lib/stripe/country_spec.rb +9 -0
- data/lib/stripe/coupon.rb +1 -1
- data/lib/stripe/customer.rb +12 -10
- data/lib/stripe/dispute.rb +4 -5
- data/lib/stripe/errors.rb +92 -0
- data/lib/stripe/file_upload.rb +1 -1
- data/lib/stripe/invoice.rb +7 -7
- data/lib/stripe/invoice_item.rb +1 -1
- data/lib/stripe/list_object.rb +8 -7
- data/lib/stripe/order.rb +12 -4
- data/lib/stripe/order_return.rb +9 -0
- data/lib/stripe/plan.rb +1 -1
- data/lib/stripe/product.rb +2 -10
- data/lib/stripe/recipient.rb +1 -1
- data/lib/stripe/refund.rb +1 -1
- data/lib/stripe/reversal.rb +7 -3
- data/lib/stripe/singleton_api_resource.rb +3 -3
- data/lib/stripe/sku.rb +2 -2
- data/lib/stripe/source.rb +11 -0
- data/lib/stripe/stripe_client.rb +396 -0
- data/lib/stripe/stripe_object.rb +167 -91
- data/lib/stripe/stripe_response.rb +48 -0
- data/lib/stripe/subscription.rb +15 -9
- data/lib/stripe/subscription_item.rb +12 -0
- data/lib/stripe/three_d_secure.rb +9 -0
- data/lib/stripe/transfer.rb +4 -5
- data/lib/stripe/util.rb +105 -33
- data/lib/stripe/version.rb +1 -1
- data/lib/stripe.rb +69 -266
- data/spec/fixtures.json +1409 -0
- data/spec/fixtures.yaml +1153 -0
- data/spec/spec.json +19949 -0
- data/spec/spec.yaml +15504 -0
- data/stripe.gemspec +5 -18
- data/test/api_fixtures.rb +29 -0
- data/test/api_stub_helpers.rb +125 -0
- data/test/stripe/account_test.rb +163 -211
- data/test/stripe/alipay_account_test.rb +19 -0
- data/test/stripe/api_operations_test.rb +31 -0
- data/test/stripe/api_resource_test.rb +174 -340
- data/test/stripe/apple_pay_domain_test.rb +33 -0
- data/test/stripe/application_fee_refund_test.rb +22 -31
- data/test/stripe/application_fee_test.rb +6 -14
- data/test/stripe/balance_test.rb +3 -3
- data/test/stripe/bank_account_test.rb +41 -0
- data/test/stripe/bitcoin_receiver_test.rb +51 -42
- data/test/stripe/bitcoin_transaction_test.rb +11 -19
- data/test/stripe/charge_test.rb +39 -98
- data/test/stripe/country_spec_test.rb +20 -0
- data/test/stripe/coupon_test.rb +35 -11
- data/test/stripe/customer_card_test.rb +25 -46
- data/test/stripe/customer_test.rb +89 -61
- data/test/stripe/dispute_test.rb +28 -31
- data/test/stripe/errors_test.rb +18 -0
- data/test/stripe/file_upload_test.rb +32 -24
- data/test/stripe/invoice_item_test.rb +55 -0
- data/test/stripe/invoice_test.rb +50 -24
- data/test/stripe/list_object_test.rb +57 -45
- data/test/stripe/order_return_test.rb +21 -0
- data/test/stripe/order_test.rb +41 -34
- data/test/stripe/plan_test.rb +52 -0
- data/test/stripe/product_test.rb +31 -25
- data/test/stripe/recipient_card_test.rb +23 -40
- data/test/stripe/recipient_test.rb +50 -0
- data/test/stripe/refund_test.rb +20 -36
- data/test/stripe/reversal_test.rb +27 -31
- data/test/stripe/sku_test.rb +39 -13
- data/test/stripe/source_test.rb +43 -0
- data/test/stripe/stripe_client_test.rb +428 -0
- data/test/stripe/stripe_object_test.rb +186 -13
- data/test/stripe/stripe_response_test.rb +46 -0
- data/test/stripe/subscription_item_test.rb +54 -0
- data/test/stripe/subscription_test.rb +40 -52
- data/test/stripe/three_d_secure_test.rb +23 -0
- data/test/stripe/transfer_test.rb +38 -13
- data/test/stripe/util_test.rb +48 -16
- data/test/stripe_test.rb +25 -0
- data/test/test_data.rb +5 -621
- data/test/test_helper.rb +24 -24
- metadata +60 -139
- data/README.rdoc +0 -68
- data/gemfiles/default-with-activesupport.gemfile +0 -10
- data/gemfiles/json.gemfile +0 -12
- data/gemfiles/yajl.gemfile +0 -12
- data/lib/stripe/api_operations/update.rb +0 -58
- data/lib/stripe/errors/api_connection_error.rb +0 -4
- data/lib/stripe/errors/api_error.rb +0 -4
- data/lib/stripe/errors/authentication_error.rb +0 -4
- data/lib/stripe/errors/card_error.rb +0 -12
- data/lib/stripe/errors/invalid_request_error.rb +0 -11
- data/lib/stripe/errors/rate_limit_error.rb +0 -4
- data/lib/stripe/errors/stripe_error.rb +0 -26
- data/test/stripe/charge_refund_test.rb +0 -55
- data/test/stripe/metadata_test.rb +0 -129
@@ -45,10 +45,23 @@ module Stripe
|
|
45
45
|
end
|
46
46
|
|
47
47
|
should "recursively call to_hash on its values" do
|
48
|
+
# deep nested hash (when contained in an array) or StripeObject
|
48
49
|
nested_hash = { :id => 7, :foo => 'bar' }
|
49
50
|
nested = Stripe::StripeObject.construct_from(nested_hash)
|
50
|
-
|
51
|
-
|
51
|
+
|
52
|
+
obj = Stripe::StripeObject.construct_from({
|
53
|
+
:id => 1,
|
54
|
+
# simple hash that contains a StripeObject to help us test deep
|
55
|
+
# recursion
|
56
|
+
:nested => { :object => 'list', :data => [nested] },
|
57
|
+
:list => [nested]
|
58
|
+
})
|
59
|
+
|
60
|
+
expected_hash = {
|
61
|
+
:id => 1,
|
62
|
+
:nested => { :object => 'list', :data => [nested_hash] },
|
63
|
+
:list => [nested_hash]
|
64
|
+
}
|
52
65
|
assert_equal expected_hash, obj.to_hash
|
53
66
|
end
|
54
67
|
|
@@ -71,6 +84,19 @@ module Stripe
|
|
71
84
|
assert_equal "foo", obj.unknown
|
72
85
|
end
|
73
86
|
|
87
|
+
should "#update_attributes with a hash" do
|
88
|
+
obj = Stripe::StripeObject.construct_from({})
|
89
|
+
obj.update_attributes(:metadata => { :foo => 'bar' })
|
90
|
+
assert_equal Stripe::StripeObject, obj.metadata.class
|
91
|
+
end
|
92
|
+
|
93
|
+
should "create accessors when #update_attributes is called" do
|
94
|
+
obj = Stripe::StripeObject.construct_from({})
|
95
|
+
assert_equal false, obj.send(:metaclass).method_defined?(:foo)
|
96
|
+
obj.update_attributes(:foo => 'bar')
|
97
|
+
assert_equal true, obj.send(:metaclass).method_defined?(:foo)
|
98
|
+
end
|
99
|
+
|
74
100
|
should "warn that #refresh_from is deprecated" do
|
75
101
|
old_stderr = $stderr
|
76
102
|
$stderr = StringIO.new
|
@@ -90,9 +116,13 @@ module Stripe
|
|
90
116
|
|
91
117
|
# customer comes with a `sources` list that makes a convenient object to
|
92
118
|
# perform tests on
|
93
|
-
|
119
|
+
obj = Stripe::StripeObject.construct_from({
|
120
|
+
sources: [
|
121
|
+
{}
|
122
|
+
]
|
123
|
+
}, opts)
|
94
124
|
|
95
|
-
source =
|
125
|
+
source = obj.sources.first
|
96
126
|
# Pulling `@opts` as an instance variable here is not ideal, but it's
|
97
127
|
# important enough argument that the test here is worth it. we should
|
98
128
|
# consider exposing it publicly on a future pull (and possibly renaming
|
@@ -102,13 +132,20 @@ module Stripe
|
|
102
132
|
|
103
133
|
should "#serialize_params on an empty object" do
|
104
134
|
obj = Stripe::StripeObject.construct_from({})
|
105
|
-
assert_equal({},
|
135
|
+
assert_equal({}, obj.serialize_params)
|
136
|
+
end
|
137
|
+
|
138
|
+
should "#serialize_params on a new object with a subobject" do
|
139
|
+
obj = Stripe::StripeObject.new
|
140
|
+
obj.metadata = { :foo => "bar" }
|
141
|
+
assert_equal({ :metadata => { :foo => "bar" } },
|
142
|
+
obj.serialize_params)
|
106
143
|
end
|
107
144
|
|
108
145
|
should "#serialize_params on a basic object" do
|
109
146
|
obj = Stripe::StripeObject.construct_from({ :foo => nil })
|
110
147
|
obj.update_attributes(:foo => "bar")
|
111
|
-
assert_equal({ :foo => "bar" },
|
148
|
+
assert_equal({ :foo => "bar" }, obj.serialize_params)
|
112
149
|
end
|
113
150
|
|
114
151
|
should "#serialize_params on a more complex object" do
|
@@ -120,7 +157,7 @@ module Stripe
|
|
120
157
|
})
|
121
158
|
obj.foo.bar = "newbar"
|
122
159
|
assert_equal({ :foo => { :bar => "newbar" } },
|
123
|
-
|
160
|
+
obj.serialize_params)
|
124
161
|
end
|
125
162
|
|
126
163
|
should "#serialize_params on an array" do
|
@@ -129,7 +166,7 @@ module Stripe
|
|
129
166
|
})
|
130
167
|
obj.foo = ["new-value"]
|
131
168
|
assert_equal({ :foo => ["new-value"] },
|
132
|
-
|
169
|
+
obj.serialize_params)
|
133
170
|
end
|
134
171
|
|
135
172
|
should "#serialize_params on an array that shortens" do
|
@@ -138,7 +175,7 @@ module Stripe
|
|
138
175
|
})
|
139
176
|
obj.foo = ["new-value"]
|
140
177
|
assert_equal({ :foo => ["new-value"] },
|
141
|
-
|
178
|
+
obj.serialize_params)
|
142
179
|
end
|
143
180
|
|
144
181
|
should "#serialize_params on an array that lengthens" do
|
@@ -147,7 +184,7 @@ module Stripe
|
|
147
184
|
})
|
148
185
|
obj.foo = ["new-value"] * 4
|
149
186
|
assert_equal({ :foo => ["new-value"] * 4 },
|
150
|
-
|
187
|
+
obj.serialize_params)
|
151
188
|
end
|
152
189
|
|
153
190
|
should "#serialize_params on an array of hashes" do
|
@@ -161,12 +198,12 @@ module Stripe
|
|
161
198
|
]
|
162
199
|
obj.foo[0].bar = "baz"
|
163
200
|
assert_equal({ :foo => [{ :bar => "baz" }] },
|
164
|
-
|
201
|
+
obj.serialize_params)
|
165
202
|
end
|
166
203
|
|
167
204
|
should "#serialize_params doesn't include unchanged values" do
|
168
205
|
obj = Stripe::StripeObject.construct_from({ :foo => nil })
|
169
|
-
assert_equal({},
|
206
|
+
assert_equal({}, obj.serialize_params)
|
170
207
|
end
|
171
208
|
|
172
209
|
should "#serialize_params on an array that is unchanged" do
|
@@ -174,7 +211,143 @@ module Stripe
|
|
174
211
|
:foo => ["0-index", "1-index", "2-index"],
|
175
212
|
})
|
176
213
|
obj.foo = ["0-index", "1-index", "2-index"]
|
177
|
-
assert_equal({},
|
214
|
+
assert_equal({}, obj.serialize_params)
|
215
|
+
end
|
216
|
+
|
217
|
+
should "#serialize_params with a StripeObject" do
|
218
|
+
obj = Stripe::StripeObject.construct_from({})
|
219
|
+
|
220
|
+
# using an #update_attributes will end up converting a Hash into a
|
221
|
+
# StripeObject
|
222
|
+
obj.metadata =
|
223
|
+
Stripe::StripeObject.construct_from({ :foo => 'bar' })
|
224
|
+
|
225
|
+
serialized = obj.serialize_params
|
226
|
+
assert_equal({ :foo => "bar" }, serialized[:metadata])
|
227
|
+
end
|
228
|
+
|
229
|
+
should "#serialize_params with a StripeObject that's been replaced" do
|
230
|
+
obj = Stripe::StripeObject.construct_from({
|
231
|
+
:metadata => Stripe::StripeObject.construct_from({ :bar => 'foo' })
|
232
|
+
})
|
233
|
+
|
234
|
+
# Here we replace the object wholesale which means that the client must
|
235
|
+
# be able to blank out the values that were in the old object, but which
|
236
|
+
# are no longer present in the new one.
|
237
|
+
obj.metadata =
|
238
|
+
Stripe::StripeObject.construct_from({ :baz => 'foo' })
|
239
|
+
|
240
|
+
serialized = obj.serialize_params
|
241
|
+
assert_equal({ :bar => "", :baz => 'foo' }, serialized[:metadata])
|
242
|
+
end
|
243
|
+
|
244
|
+
should "#serialize_params with an array of StripeObjects" do
|
245
|
+
obj = Stripe::StripeObject.construct_from({})
|
246
|
+
obj.metadata = [
|
247
|
+
Stripe::StripeObject.construct_from({ :foo => 'bar' })
|
248
|
+
]
|
249
|
+
|
250
|
+
serialized = obj.serialize_params
|
251
|
+
assert_equal([{ :foo => "bar" }], serialized[:metadata])
|
252
|
+
end
|
253
|
+
|
254
|
+
should "#serialize_params and remove embedded APIResources" do
|
255
|
+
obj = Stripe::StripeObject.construct_from({
|
256
|
+
:customer => Customer.construct_from({})
|
257
|
+
})
|
258
|
+
|
259
|
+
serialized = obj.serialize_params
|
260
|
+
assert_equal({}, serialized)
|
261
|
+
end
|
262
|
+
|
263
|
+
should "#serialize_params and remove embedded APIResources unless flagged with save_with_parent" do
|
264
|
+
c = Customer.construct_from({})
|
265
|
+
c.save_with_parent = true
|
266
|
+
|
267
|
+
obj = Stripe::StripeObject.construct_from({
|
268
|
+
:customer => c,
|
269
|
+
})
|
270
|
+
|
271
|
+
serialized = obj.serialize_params
|
272
|
+
assert_equal({ :customer => {} }, serialized)
|
273
|
+
end
|
274
|
+
|
275
|
+
should "#serialize_params takes a force option" do
|
276
|
+
obj = Stripe::StripeObject.construct_from({
|
277
|
+
:id => 'id',
|
278
|
+
:metadata => Stripe::StripeObject.construct_from({ :foo => 'bar' })
|
279
|
+
})
|
280
|
+
|
281
|
+
serialized = obj.serialize_params(:force => true)
|
282
|
+
assert_equal({ :id => 'id', :metadata => { :foo => 'bar' } }, serialized)
|
283
|
+
end
|
284
|
+
|
285
|
+
should "#dirty! forces an object and its subobjects to be saved" do
|
286
|
+
obj = Stripe::StripeObject.construct_from({
|
287
|
+
:id => 'id',
|
288
|
+
:metadata => Stripe::StripeObject.construct_from({ :foo => 'bar' })
|
289
|
+
})
|
290
|
+
|
291
|
+
# note that `force` and `dirty!` are for different things, but are
|
292
|
+
# functionally equivalent
|
293
|
+
obj.dirty!
|
294
|
+
|
295
|
+
serialized = obj.serialize_params
|
296
|
+
assert_equal({ :id => 'id', :metadata => { :foo => 'bar' } }, serialized)
|
297
|
+
end
|
298
|
+
|
299
|
+
should "#to_s will call to_s for all embedded stripe objects" do
|
300
|
+
obj = Stripe::StripeObject.construct_from({
|
301
|
+
id: 'id',
|
302
|
+
#embeded list object
|
303
|
+
refunds: Stripe::ListObject.construct_from({ data: [
|
304
|
+
#embedded object in list
|
305
|
+
Stripe::StripeObject.construct_from({
|
306
|
+
id: 'id',
|
307
|
+
#embedded object in an object in a list object
|
308
|
+
metadata: Stripe::StripeObject.construct_from({
|
309
|
+
foo: 'bar',
|
310
|
+
})
|
311
|
+
})
|
312
|
+
]}),
|
313
|
+
# embeded stripe object
|
314
|
+
metadata: Stripe::StripeObject.construct_from({
|
315
|
+
foo: 'bar',
|
316
|
+
})
|
317
|
+
})
|
318
|
+
expected = JSON.pretty_generate({
|
319
|
+
id: 'id',
|
320
|
+
refunds: {
|
321
|
+
data: [
|
322
|
+
{id: 'id', metadata: {foo: 'bar'}}
|
323
|
+
]
|
324
|
+
},
|
325
|
+
metadata: { foo: 'bar' }
|
326
|
+
})
|
327
|
+
|
328
|
+
assert_equal(expected, obj.to_s)
|
329
|
+
end
|
330
|
+
|
331
|
+
should "warn that .serialize_params is deprecated" do
|
332
|
+
old_stderr = $stderr
|
333
|
+
$stderr = StringIO.new
|
334
|
+
begin
|
335
|
+
obj = Stripe::StripeObject.construct_from({})
|
336
|
+
Stripe::StripeObject.serialize_params(obj)
|
337
|
+
message = "NOTE: Stripe::StripeObject.serialize_params is " +
|
338
|
+
"deprecated; use #serialize_params instead"
|
339
|
+
assert_match Regexp.new(message), $stderr.string
|
340
|
+
ensure
|
341
|
+
$stderr = old_stderr
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
345
|
+
should "error on setting a property to an empty string" do
|
346
|
+
obj = Stripe::StripeObject.construct_from({ :foo => 'bar' })
|
347
|
+
e = assert_raises ArgumentError do
|
348
|
+
obj.foo = ""
|
349
|
+
end
|
350
|
+
assert_match %r{\(object\).foo = nil}, e.message
|
178
351
|
end
|
179
352
|
end
|
180
353
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require File.expand_path('../../test_helper', __FILE__)
|
2
|
+
|
3
|
+
module Stripe
|
4
|
+
class StripeResponseTest < Test::Unit::TestCase
|
5
|
+
context ".from_faraday_hash" do
|
6
|
+
should "converts to StripeResponse" do
|
7
|
+
body = '{"foo": "bar"}'
|
8
|
+
headers = { "Request-Id" => "request-id" }
|
9
|
+
|
10
|
+
http_resp = {
|
11
|
+
body: body,
|
12
|
+
headers: headers,
|
13
|
+
status: 200,
|
14
|
+
}
|
15
|
+
|
16
|
+
resp = StripeResponse.from_faraday_hash(http_resp)
|
17
|
+
|
18
|
+
assert_equal JSON.parse(body, symbolize_names: true), resp.data
|
19
|
+
assert_equal body, resp.http_body
|
20
|
+
assert_equal headers, resp.http_headers
|
21
|
+
assert_equal 200, resp.http_status
|
22
|
+
assert_equal "request-id", resp.request_id
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context ".from_faraday_response" do
|
27
|
+
should "converts to StripeResponse" do
|
28
|
+
body = '{"foo": "bar"}'
|
29
|
+
headers = { "Request-Id" => "request-id" }
|
30
|
+
|
31
|
+
env = Faraday::Env.from(
|
32
|
+
:status => 200, :body => body,
|
33
|
+
:response_headers => headers)
|
34
|
+
http_resp = Faraday::Response.new(env)
|
35
|
+
|
36
|
+
resp = StripeResponse.from_faraday_response(http_resp)
|
37
|
+
|
38
|
+
assert_equal JSON.parse(body, symbolize_names: true), resp.data
|
39
|
+
assert_equal body, resp.http_body
|
40
|
+
assert_equal headers, resp.http_headers
|
41
|
+
assert_equal 200, resp.http_status
|
42
|
+
assert_equal "request-id", resp.request_id
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require File.expand_path('../../test_helper', __FILE__)
|
2
|
+
|
3
|
+
module Stripe
|
4
|
+
class SubscriptionItemTest < Test::Unit::TestCase
|
5
|
+
FIXTURE = API_FIXTURES.fetch(:subscription_item)
|
6
|
+
|
7
|
+
should "be listable" do
|
8
|
+
items = Stripe::SubscriptionItem.list(
|
9
|
+
subscription: API_FIXTURES.fetch(:subscription)[:id]
|
10
|
+
)
|
11
|
+
assert_requested :get, "#{Stripe.api_base}/v1/subscription_items",
|
12
|
+
query: { subscription: API_FIXTURES.fetch(:subscription)[:id] }
|
13
|
+
assert items.data.kind_of?(Array)
|
14
|
+
assert items.data[0].kind_of?(Stripe::SubscriptionItem)
|
15
|
+
end
|
16
|
+
|
17
|
+
should "be retrievable" do
|
18
|
+
item = Stripe::SubscriptionItem.retrieve(FIXTURE[:id])
|
19
|
+
assert_requested :get, "#{Stripe.api_base}/v1/subscription_items/#{FIXTURE[:id]}"
|
20
|
+
assert item.kind_of?(Stripe::SubscriptionItem)
|
21
|
+
end
|
22
|
+
|
23
|
+
should "be creatable" do
|
24
|
+
item = Stripe::SubscriptionItem.create(
|
25
|
+
item: 'silver',
|
26
|
+
plan: API_FIXTURES.fetch(:plan)[:id],
|
27
|
+
quantity: 3,
|
28
|
+
subscription: API_FIXTURES.fetch(:subscription)[:id]
|
29
|
+
)
|
30
|
+
assert_requested :post, "#{Stripe.api_base}/v1/subscription_items"
|
31
|
+
assert item.kind_of?(Stripe::SubscriptionItem)
|
32
|
+
end
|
33
|
+
|
34
|
+
should "be saveable" do
|
35
|
+
item = Stripe::SubscriptionItem.retrieve(FIXTURE[:id])
|
36
|
+
item.quantity = 4
|
37
|
+
item.save
|
38
|
+
assert_requested :post, "#{Stripe.api_base}/v1/subscription_items/#{FIXTURE[:id]}"
|
39
|
+
end
|
40
|
+
|
41
|
+
should "be updateable" do
|
42
|
+
item = Stripe::SubscriptionItem.update(FIXTURE[:id], metadata: {foo: 'bar'})
|
43
|
+
assert_requested :post, "#{Stripe.api_base}/v1/subscription_items/#{FIXTURE[:id]}"
|
44
|
+
assert item.kind_of?(Stripe::SubscriptionItem)
|
45
|
+
end
|
46
|
+
|
47
|
+
should "be deletable" do
|
48
|
+
item = Stripe::SubscriptionItem.retrieve(FIXTURE[:id])
|
49
|
+
item = item.delete
|
50
|
+
assert_requested :delete, "#{Stripe.api_base}/v1/subscription_items/#{FIXTURE[:id]}"
|
51
|
+
assert item.kind_of?(Stripe::SubscriptionItem)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -2,71 +2,59 @@ require File.expand_path('../../test_helper', __FILE__)
|
|
2
2
|
|
3
3
|
module Stripe
|
4
4
|
class SubscriptionTest < Test::Unit::TestCase
|
5
|
-
|
6
|
-
@mock.expects(:get).once.returns(make_response(make_customer))
|
5
|
+
FIXTURE = API_FIXTURES.fetch(:subscription)
|
7
6
|
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
should "be listable" do
|
8
|
+
subscriptions = Stripe::Subscription.list
|
9
|
+
assert_requested :get, "#{Stripe.api_base}/v1/subscriptions"
|
10
|
+
assert subscriptions.data.kind_of?(Array)
|
11
|
+
assert subscriptions.data[0].kind_of?(Stripe::Subscription)
|
11
12
|
end
|
12
13
|
|
13
|
-
should "
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
subscription
|
18
|
-
subscription.refresh
|
19
|
-
|
20
|
-
assert_equal 'refreshed_subscription', subscription.id
|
14
|
+
should "be retrievable" do
|
15
|
+
subscription = Stripe::Subscription.retrieve(FIXTURE[:id])
|
16
|
+
assert_requested :get,
|
17
|
+
"#{Stripe.api_base}/v1/subscriptions/#{FIXTURE[:id]}"
|
18
|
+
assert subscription.kind_of?(Stripe::Subscription)
|
21
19
|
end
|
22
20
|
|
23
|
-
should "
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
subscription.delete :at_period_end => true
|
30
|
-
|
31
|
-
@mock.expects(:delete).once.with("#{Stripe.api_base}/v1/customers/c_test_customer/subscriptions/#{subscription.id}", nil, nil).returns(make_response(make_subscription))
|
32
|
-
subscription.delete
|
21
|
+
should "be creatable" do
|
22
|
+
subscription = Stripe::Subscription.create(
|
23
|
+
customer: API_FIXTURES.fetch(:customer)[:id]
|
24
|
+
)
|
25
|
+
assert_requested :post, "#{Stripe.api_base}/v1/subscriptions"
|
26
|
+
assert subscription.kind_of?(Stripe::Subscription)
|
33
27
|
end
|
34
28
|
|
35
|
-
should "
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
customer = Stripe::Customer.retrieve('test_customer')
|
40
|
-
subscription = customer.subscriptions.first
|
41
|
-
assert_equal 'trialing', subscription.status
|
42
|
-
|
43
|
-
subscription.status = 'active'
|
29
|
+
should "be saveable" do
|
30
|
+
subscription = Stripe::Subscription.retrieve(FIXTURE[:id])
|
31
|
+
subscription.metadata['key'] = 'value'
|
44
32
|
subscription.save
|
45
|
-
|
46
|
-
|
33
|
+
assert_requested :post,
|
34
|
+
"#{Stripe.api_base}/v1/subscriptions/#{FIXTURE[:id]}"
|
47
35
|
end
|
48
36
|
|
49
|
-
should "
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
subscription = customer.subscriptions.create(:plan => 'silver')
|
55
|
-
assert_equal 'test_new_subscription', subscription.id
|
37
|
+
should "be updateable" do
|
38
|
+
subscription = Stripe::Subscription.update(FIXTURE[:id], metadata: {foo: 'bar'})
|
39
|
+
assert_requested :post,
|
40
|
+
"#{Stripe.api_base}/v1/subscriptions/#{FIXTURE[:id]}"
|
41
|
+
assert subscription.kind_of?(Stripe::Subscription)
|
56
42
|
end
|
57
43
|
|
58
|
-
should "be
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
44
|
+
should "be deletable" do
|
45
|
+
subscription = Stripe::Subscription.retrieve(FIXTURE[:id])
|
46
|
+
subscription = subscription.delete
|
47
|
+
assert_requested :delete,
|
48
|
+
"#{Stripe.api_base}/v1/subscriptions/#{FIXTURE[:id]}"
|
49
|
+
assert subscription.kind_of?(Stripe::Subscription)
|
50
|
+
end
|
65
51
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
52
|
+
context "#delete_discount" do
|
53
|
+
should "be able to delete a subscriptions's discount" do
|
54
|
+
subscription = Stripe::Subscription.retrieve(FIXTURE[:id])
|
55
|
+
subscription = subscription.delete_discount
|
56
|
+
assert subscription.kind_of?(Stripe::Subscription)
|
57
|
+
end
|
70
58
|
end
|
71
59
|
end
|
72
60
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.expand_path('../../test_helper', __FILE__)
|
2
|
+
|
3
|
+
module Stripe
|
4
|
+
class ThreeDSecureTest < Test::Unit::TestCase
|
5
|
+
FIXTURE = API_FIXTURES.fetch(:three_d_secure)
|
6
|
+
|
7
|
+
should "be retrievable" do
|
8
|
+
secure = Stripe::ThreeDSecure.retrieve(FIXTURE[:id])
|
9
|
+
assert_requested :get, "#{Stripe.api_base}/v1/3d_secure/#{FIXTURE[:id]}"
|
10
|
+
assert secure.kind_of?(Stripe::ThreeDSecure)
|
11
|
+
end
|
12
|
+
|
13
|
+
should "be creatable" do
|
14
|
+
_ = Stripe::ThreeDSecure.create(
|
15
|
+
card: API_FIXTURES.fetch(:token)[:id],
|
16
|
+
amount: 1500,
|
17
|
+
currency: "usd",
|
18
|
+
return_url: "https://example.org/3d-secure-result"
|
19
|
+
)
|
20
|
+
assert_requested :post, "#{Stripe.api_base}/v1/3d_secure"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -2,24 +2,49 @@ require File.expand_path('../../test_helper', __FILE__)
|
|
2
2
|
|
3
3
|
module Stripe
|
4
4
|
class TransferTest < Test::Unit::TestCase
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
FIXTURE = API_FIXTURES.fetch(:transfer)
|
6
|
+
|
7
|
+
should "be listable" do
|
8
|
+
transfers = Stripe::Transfer.list
|
9
|
+
assert_requested :get, "#{Stripe.api_base}/v1/transfers"
|
10
|
+
assert transfers.data.kind_of?(Array)
|
11
|
+
assert transfers.data[0].kind_of?(Stripe::Transfer)
|
12
|
+
end
|
13
|
+
|
14
|
+
should "be retrievable" do
|
15
|
+
transfer = Stripe::Transfer.retrieve(FIXTURE[:id])
|
16
|
+
assert_requested :get, "#{Stripe.api_base}/v1/transfers/#{FIXTURE[:id]}"
|
17
|
+
assert transfer.kind_of?(Stripe::Transfer)
|
9
18
|
end
|
10
19
|
|
11
|
-
should "
|
12
|
-
|
13
|
-
|
14
|
-
|
20
|
+
should "be creatable" do
|
21
|
+
transfer = Stripe::Transfer.create(
|
22
|
+
amount: 100,
|
23
|
+
currency: "USD"
|
24
|
+
)
|
25
|
+
assert_requested :post, "#{Stripe.api_base}/v1/transfers"
|
26
|
+
assert transfer.kind_of?(Stripe::Transfer)
|
15
27
|
end
|
16
28
|
|
17
|
-
should "
|
18
|
-
|
19
|
-
transfer =
|
29
|
+
should "be saveable" do
|
30
|
+
transfer = Stripe::Transfer.retrieve(FIXTURE[:id])
|
31
|
+
transfer.metadata['key'] = 'value'
|
32
|
+
transfer.save
|
33
|
+
assert_requested :post, "#{Stripe.api_base}/v1/transfers/#{FIXTURE[:id]}"
|
34
|
+
end
|
35
|
+
|
36
|
+
should "be updateable" do
|
37
|
+
transfer = Stripe::Transfer.update(FIXTURE[:id], metadata: {foo: 'bar'})
|
38
|
+
assert_requested :post, "#{Stripe.api_base}/v1/transfers/#{FIXTURE[:id]}"
|
39
|
+
assert transfer.kind_of?(Stripe::Transfer)
|
40
|
+
end
|
20
41
|
|
21
|
-
|
22
|
-
transfer
|
42
|
+
context "#cancel" do
|
43
|
+
should "cancel a transfer" do
|
44
|
+
transfer = Stripe::Transfer.retrieve(FIXTURE[:id])
|
45
|
+
transfer = transfer.cancel
|
46
|
+
assert transfer.kind_of?(Stripe::Transfer)
|
47
|
+
end
|
23
48
|
end
|
24
49
|
end
|
25
50
|
end
|
data/test/stripe/util_test.rb
CHANGED
@@ -3,23 +3,51 @@ require File.expand_path('../../test_helper', __FILE__)
|
|
3
3
|
module Stripe
|
4
4
|
class UtilTest < Test::Unit::TestCase
|
5
5
|
should "#encode_parameters should prepare parameters for an HTTP request" do
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
6
|
+
params = {
|
7
|
+
:a => 3,
|
8
|
+
:b => "+foo?",
|
9
|
+
:c => "bar&baz",
|
10
|
+
:d => { :a => "a", :b => "b" },
|
11
|
+
:e => [0, 1],
|
12
|
+
:f => "",
|
13
13
|
|
14
14
|
# note the empty hash won't even show up in the request
|
15
|
-
|
16
|
-
|
15
|
+
:g => [],
|
16
|
+
}
|
17
17
|
assert_equal(
|
18
|
-
"a=3&b=%2Bfoo%3F&c=bar%26baz&d[a]=a&d[b]=b&e[]=0&e[]=1",
|
18
|
+
"a=3&b=%2Bfoo%3F&c=bar%26baz&d[a]=a&d[b]=b&e[]=0&e[]=1&f=",
|
19
19
|
Stripe::Util.encode_parameters(params)
|
20
20
|
)
|
21
21
|
end
|
22
22
|
|
23
|
+
should "#encode_params should throw an error on an array of maps that cannot be encoded" do
|
24
|
+
params = {
|
25
|
+
:a => [
|
26
|
+
{ :a => 1, :b => 2 },
|
27
|
+
{ :c => 3, :a => 4 },
|
28
|
+
]
|
29
|
+
}
|
30
|
+
e = assert_raises(ArgumentError) do
|
31
|
+
Stripe::Util.encode_parameters(params)
|
32
|
+
end
|
33
|
+
expected = "All maps nested in an array should start with the same key " +
|
34
|
+
"(expected starting key 'a', got 'c')"
|
35
|
+
assert_equal expected, e.message
|
36
|
+
|
37
|
+
# Make sure the check is recursive by taking our original params and
|
38
|
+
# nesting it into yet another map and array. Should throw exactly the
|
39
|
+
# same error because it's still the in inner array of maps that's wrong.
|
40
|
+
params = {
|
41
|
+
:x => [
|
42
|
+
params
|
43
|
+
]
|
44
|
+
}
|
45
|
+
e = assert_raises(ArgumentError) do
|
46
|
+
Stripe::Util.encode_parameters(params)
|
47
|
+
end
|
48
|
+
assert_equal expected, e.message
|
49
|
+
end
|
50
|
+
|
23
51
|
should "#url_encode should prepare strings for HTTP" do
|
24
52
|
assert_equal "foo", Stripe::Util.url_encode("foo")
|
25
53
|
assert_equal "foo", Stripe::Util.url_encode(:foo)
|
@@ -36,8 +64,8 @@ module Stripe
|
|
36
64
|
[:d, { :a => "a", :b => "b" }],
|
37
65
|
[:e, [0, 1]],
|
38
66
|
[:f, [
|
39
|
-
{ :
|
40
|
-
{ :
|
67
|
+
{ :foo => "1", :ghi => "2" },
|
68
|
+
{ :foo => "3", :bar => "4" },
|
41
69
|
]],
|
42
70
|
]
|
43
71
|
assert_equal([
|
@@ -52,10 +80,10 @@ module Stripe
|
|
52
80
|
# *The key here is the order*. In order to be properly interpreted as
|
53
81
|
# an array of hashes on the server, everything from a single hash must
|
54
82
|
# come in at once. A duplicate key in an array triggers a new element.
|
55
|
-
["f[][
|
56
|
-
["f[][
|
57
|
-
["f[][
|
58
|
-
["f[][
|
83
|
+
["f[][foo]", "1"],
|
84
|
+
["f[][ghi]", "2"],
|
85
|
+
["f[][foo]", "3"],
|
86
|
+
["f[][bar]", "4"],
|
59
87
|
], Stripe::Util.flatten_params(params))
|
60
88
|
end
|
61
89
|
|
@@ -113,5 +141,9 @@ module Stripe
|
|
113
141
|
obj = Util.convert_to_stripe_object([1, 2, 3], {})
|
114
142
|
assert_equal [1, 2, 3], obj
|
115
143
|
end
|
144
|
+
|
145
|
+
should "#array_to_hash should convert an array into a hash with integer keys" do
|
146
|
+
assert_equal({"0" => 1, "1" => 2, "2" => 3}, Util.array_to_hash([1, 2, 3]))
|
147
|
+
end
|
116
148
|
end
|
117
149
|
end
|