stripe 1.55.0 → 1.55.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: acc0d005430ccecaa1ee91d83f1fa12878953539
4
- data.tar.gz: 8e0a9f98e8931de91bda3da3f3bb6e506772c7e6
3
+ metadata.gz: 1a4bdfe3a97b5c7b3d7a1c5c5ace530dd4ef4b0c
4
+ data.tar.gz: aa5aacbe6bc4dc1dd5982e8c4ef4346a5cf890e6
5
5
  SHA512:
6
- metadata.gz: 9ebb54c179ef98c86a461fcd98d354faf8ffaae89e94e910fc372f12f7657ba1213dca4d035e7448a8a5231ca5836ce8d94d59a220c7aeb71b9aa2199b6b4833
7
- data.tar.gz: 8076a031bf92dd1daba197cd4f8a8557ae1c2a1d326f4d2b7541a24ce09e323091527c0b5fb60b45757e066c022a70ca38882c7dfc3203d41658fc5813863265
6
+ metadata.gz: bf05983e41c5ae0b5a4390c7f3557da1df08ead492fca1d13f08a6e9fc171715c723767587da01023285ffb55052502944c795c9e07a05167e595bffb9009986
7
+ data.tar.gz: b5e01f1265f2ebc91b221011ca5f435167704ce7781de700b879593fdf29ed3ad5f0df55f75376de0e9efb49e88dc95a29d6a85829fa6290329ce673b2e7db74
@@ -1,3 +1,7 @@
1
+ === 1.55.1 2016-10-24
2
+
3
+ * Add accessors for new fields added in `#update_attributes`
4
+
1
5
  === 1.55.0 2016-09-15
2
6
 
3
7
  * Add support for Apple Pay domains
data/README.md CHANGED
@@ -121,8 +121,8 @@ certificates.
121
121
  ### max_network_retries
122
122
 
123
123
  When `max_network_retries` is set to a positive integer, stripe will retry
124
- requests that fail on a network error. Idempotency keys will be added to post
125
- and get requests to ensure the safety of retrying. There will be a short delay
124
+ requests that fail on a network error. Idempotency keys will be added to `POST`
125
+ and `DELETE` requests to ensure the safety of retrying. There will be a short delay
126
126
  between each retry, with an exponential backoff algorithm used to determine the
127
127
  length of the delay. Default value is 0.
128
128
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.55.0
1
+ 1.55.1
@@ -43,6 +43,7 @@ require 'stripe/recipient'
43
43
  require 'stripe/bank_account'
44
44
  require 'stripe/card'
45
45
  require 'stripe/subscription'
46
+ require 'stripe/subscription_item'
46
47
  require 'stripe/application_fee'
47
48
  require 'stripe/refund'
48
49
  require 'stripe/reversal'
@@ -66,6 +67,7 @@ require 'stripe/errors/api_connection_error'
66
67
  require 'stripe/errors/card_error'
67
68
  require 'stripe/errors/invalid_request_error'
68
69
  require 'stripe/errors/authentication_error'
70
+ require 'stripe/errors/permission_error'
69
71
  require 'stripe/errors/rate_limit_error'
70
72
 
71
73
  module Stripe
@@ -377,6 +379,8 @@ module Stripe
377
379
  raise authentication_error(error, resp, error_obj)
378
380
  when 402
379
381
  raise card_error(error, resp, error_obj)
382
+ when 403
383
+ raise permission_error(error, resp, error_obj)
380
384
  when 429
381
385
  raise rate_limit_error(error, resp, error_obj)
382
386
  else
@@ -405,6 +409,10 @@ module Stripe
405
409
  resp.code, resp.body, error_obj, resp.headers)
406
410
  end
407
411
 
412
+ def self.permission_error(error, resp, error_obj)
413
+ PermissionError.new(error[:message], resp.code, resp.body, error_obj, resp.headers)
414
+ end
415
+
408
416
  def self.api_error(error, resp, error_obj)
409
417
  APIError.new(error[:message], resp.code, resp.body, error_obj, resp.headers)
410
418
  end
@@ -0,0 +1,4 @@
1
+ module Stripe
2
+ class PermissionError < StripeError
3
+ end
4
+ end
@@ -84,8 +84,8 @@ module Stripe
84
84
  # Default to true. TODO: Convert to optional arguments after we're off
85
85
  # 1.9 which will make this quite a bit more clear.
86
86
  dirty = method_options.fetch(:dirty, true)
87
-
88
87
  values.each do |k, v|
88
+ add_accessors([k], values) unless metaclass.method_defined?(k.to_sym)
89
89
  @values[k] = Util.convert_to_stripe_object(v, opts)
90
90
  dirty_value!(@values[k]) if dirty
91
91
  @unsaved_values.add(k)
@@ -12,6 +12,16 @@ module Stripe
12
12
  initialize_from({ :discount => nil }, opts, true)
13
13
  end
14
14
 
15
+ def self.update(id, params={}, opts={})
16
+ params[:items] = Util.array_to_hash(params[:items]) if params[:items]
17
+ super(id, params, opts)
18
+ end
19
+
20
+ def self.create(params={}, opts={})
21
+ params[:items] = Util.array_to_hash(params[:items]) if params[:items]
22
+ super(params, opts)
23
+ end
24
+
15
25
  private
16
26
 
17
27
  def discount_url
@@ -0,0 +1,12 @@
1
+ module Stripe
2
+ class SubscriptionItem < APIResource
3
+ extend Stripe::APIOperations::Create
4
+ include Stripe::APIOperations::Delete
5
+ extend Stripe::APIOperations::List
6
+ include Stripe::APIOperations::Save
7
+
8
+ def self.resource_url
9
+ '/v1/subscription_items'
10
+ end
11
+ end
12
+ end
@@ -23,38 +23,39 @@ module Stripe
23
23
  'list' => ListObject,
24
24
 
25
25
  # business objects
26
- 'account' => Account,
27
- 'alipay_account' => AlipayAccount,
28
- 'application_fee' => ApplicationFee,
29
- 'balance' => Balance,
30
- 'balance_transaction' => BalanceTransaction,
31
- 'bank_account' => BankAccount,
32
- 'card' => Card,
33
- 'charge' => Charge,
34
- 'country_spec' => CountrySpec,
35
- 'coupon' => Coupon,
36
- 'customer' => Customer,
37
- 'event' => Event,
38
- 'fee_refund' => ApplicationFeeRefund,
39
- 'invoiceitem' => InvoiceItem,
40
- 'invoice' => Invoice,
41
- 'plan' => Plan,
42
- 'recipient' => Recipient,
43
- 'refund' => Refund,
44
- 'subscription' => Subscription,
45
- 'file_upload' => FileUpload,
46
- 'token' => Token,
47
- 'transfer' => Transfer,
48
- 'transfer_reversal' => Reversal,
49
- 'bitcoin_receiver' => BitcoinReceiver,
50
- 'bitcoin_transaction' => BitcoinTransaction,
51
- 'dispute' => Dispute,
52
- 'product' => Product,
53
- 'sku' => SKU,
54
- 'order' => Order,
55
- 'order_return' => OrderReturn,
56
- 'three_d_secure' => ThreeDSecure,
57
- 'apple_pay_domain' => ApplePayDomain,
26
+ 'account' => Account,
27
+ 'alipay_account' => AlipayAccount,
28
+ 'apple_pay_domain' => ApplePayDomain,
29
+ 'application_fee' => ApplicationFee,
30
+ 'balance' => Balance,
31
+ 'balance_transaction' => BalanceTransaction,
32
+ 'bank_account' => BankAccount,
33
+ 'bitcoin_receiver' => BitcoinReceiver,
34
+ 'bitcoin_transaction' => BitcoinTransaction,
35
+ 'card' => Card,
36
+ 'charge' => Charge,
37
+ 'country_spec' => CountrySpec,
38
+ 'coupon' => Coupon,
39
+ 'customer' => Customer,
40
+ 'dispute' => Dispute,
41
+ 'event' => Event,
42
+ 'fee_refund' => ApplicationFeeRefund,
43
+ 'file_upload' => FileUpload,
44
+ 'invoice' => Invoice,
45
+ 'invoiceitem' => InvoiceItem,
46
+ 'order' => Order,
47
+ 'order_return' => OrderReturn,
48
+ 'plan' => Plan,
49
+ 'product' => Product,
50
+ 'recipient' => Recipient,
51
+ 'refund' => Refund,
52
+ 'sku' => SKU,
53
+ 'subscription' => Subscription,
54
+ 'subscription_item' => SubscriptionItem,
55
+ 'token' => Token,
56
+ 'transfer' => Transfer,
57
+ 'transfer_reversal' => Reversal,
58
+ 'three_d_secure' => ThreeDSecure,
58
59
  }
59
60
  end
60
61
 
@@ -120,6 +121,20 @@ module Stripe
120
121
  map { |k,v| "#{url_encode(k)}=#{url_encode(v)}" }.join('&')
121
122
  end
122
123
 
124
+ # Transforms an array into a hash with integer keys. Used for a small
125
+ # number of API endpoints. If the argument is not an Array, return it
126
+ # unchanged. Example: [{foo: 'bar'}] => {"0" => {foo: "bar"}}
127
+ def self.array_to_hash(array)
128
+ case array
129
+ when Array
130
+ hash = {}
131
+ array.each_with_index { |v,i| hash[i.to_s] = v }
132
+ hash
133
+ else
134
+ array
135
+ end
136
+ end
137
+
123
138
  # Encodes a string in a way that makes it suitable for use in a set of
124
139
  # query parameters in a URI or in a set of form parameters in a request
125
140
  # body.
@@ -1,3 +1,3 @@
1
1
  module Stripe
2
- VERSION = '1.55.0'
2
+ VERSION = '1.55.1'
3
3
  end
@@ -300,6 +300,18 @@ module Stripe
300
300
  end
301
301
  end
302
302
 
303
+ should "a 403 should give a PermissionError with http status, body, and JSON body" do
304
+ response = make_response(make_missing_id_error, 403)
305
+ @mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 403))
306
+ begin
307
+ Stripe::Customer.retrieve("foo")
308
+ rescue Stripe::PermissionError => e
309
+ assert_equal(403, e.http_status)
310
+ assert_equal(true, !!e.http_body)
311
+ assert_equal(true, e.json_body.kind_of?(Hash))
312
+ end
313
+ end
314
+
303
315
  should "a 404 should give an InvalidRequestError with http status, body, and JSON body" do
304
316
  response = make_response(make_missing_id_error, 404)
305
317
  @mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 404))
@@ -44,5 +44,23 @@ module Stripe
44
44
  i.pay
45
45
  assert_equal nil, i.next_payment_attempt
46
46
  end
47
+
48
+ should "be able to retrieve upcoming invoices" do
49
+ base = "#{Stripe.api_base}/v1/invoices/upcoming?"
50
+ cus_sub = "customer=c_test_customer&subscription=s_test_subscription&"
51
+ item0 = "subscription_items[][plan]=gold&subscription_items[][quantity]=1&"
52
+ item1 = "subscription_items[][plan]=silver&subscription_items[][quantity]=2"
53
+ @mock.expects(:get).once.with(base + cus_sub + item0 + item1, nil, nil).
54
+ returns(make_response(make_invoice(:customer => 'c_test_customer', :subscription => 's_test_subscription')))
55
+
56
+ i = Stripe::Invoice.upcoming(
57
+ :customer => 'c_test_customer',
58
+ :subscription => 's_test_subscription',
59
+ :subscription_items => [{:plan => 'gold', :quantity =>1}, {:plan => 'silver', :quantity =>2}]
60
+ )
61
+
62
+ assert_equal 'c_test_customer', i.customer
63
+ assert_equal 's_test_subscription', i.subscription
64
+ end
47
65
  end
48
66
  end
@@ -90,6 +90,13 @@ module Stripe
90
90
  assert_equal Stripe::StripeObject, obj.metadata.class
91
91
  end
92
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
+
93
100
  should "warn that #refresh_from is deprecated" do
94
101
  old_stderr = $stderr
95
102
  $stderr = StringIO.new
@@ -0,0 +1,76 @@
1
+ require File.expand_path('../../test_helper', __FILE__)
2
+
3
+ module Stripe
4
+ class SubscriptionItemTest < Test::Unit::TestCase
5
+ should "subscription items should be retrievable" do
6
+ @mock.expects(:get).once.with("#{Stripe.api_base}/v1/subscription_items/si_test_subscription_item", nil, nil).
7
+ returns(make_response(make_subscription_item))
8
+
9
+ sub_item = Stripe::SubscriptionItem.retrieve('si_test_subscription_item')
10
+
11
+ assert sub_item.kind_of?(Stripe::SubscriptionItem)
12
+ end
13
+
14
+ should "subscription items should be listable" do
15
+ @mock.expects(:get).once.with("#{Stripe.api_base}/v1/subscription_items?subscription=s_test_subscription&limit=3", nil, nil).
16
+ returns(make_response(make_subscription_item_array))
17
+ sub_items = Stripe::SubscriptionItem.list(:subscription => 's_test_subscription', :limit => 3).data
18
+
19
+ assert sub_items.kind_of? Array
20
+ assert sub_items[0].kind_of? Stripe::SubscriptionItem
21
+ end
22
+
23
+ should "subscription items should be deletable" do
24
+ @mock.expects(:get).once.returns(make_response(make_subscription_item))
25
+ sub_item = Stripe::SubscriptionItem.retrieve('si_test_subscription_item')
26
+
27
+ @mock.expects(:delete).once.with("#{Stripe.api_base}/v1/subscription_items/#{sub_item.id}", nil, nil).
28
+ returns(make_response(make_subscription_item))
29
+ sub_item.delete
30
+ end
31
+
32
+ should "subscription items should be updateable" do
33
+ sid = 'si_test_subscription_item'
34
+ @mock.expects(:post).once.with do |url, api_key, params|
35
+ url == "#{Stripe.api_base}/v1/subscription_items/#{sid}" &&
36
+ api_key.nil? &&
37
+ CGI.parse(params) == {'plan' => ['silver'], 'quantity' => ['3']}
38
+ end.returns(make_response(make_subscription_item(:plan => 'silver', :quantity => 3)))
39
+
40
+ sub_item = Stripe::SubscriptionItem.update(sid, {:plan => 'silver', :quantity => 3})
41
+
42
+ assert_equal 'silver', sub_item.plan.id
43
+ assert_equal 3, sub_item.quantity
44
+ end
45
+
46
+ should "subscription items should be saveable" do
47
+ @mock.expects(:get).once.returns(make_response(make_subscription_item))
48
+ sub_item = Stripe::SubscriptionItem.retrieve('si_test_subscription_item')
49
+
50
+ @mock.expects(:post).once.with do |url, api_key, params|
51
+ url == "#{Stripe.api_base}/v1/subscription_items/#{sub_item.id}" &&
52
+ api_key.nil? &&
53
+ CGI.parse(params) == {'plan' => ['silver'], 'quantity' => ['3']}
54
+ end.returns(make_response(make_subscription_item(:plan => 'silver', :quantity => 3)))
55
+
56
+ sub_item.plan = 'silver'
57
+ sub_item.quantity = 3
58
+ sub_item.save
59
+
60
+ assert_equal 'silver', sub_item.plan.id
61
+ assert_equal 3, sub_item.quantity
62
+ end
63
+
64
+ should "create should return a new subscription item" do
65
+ @mock.expects(:post).once.with do |url, api_key, params|
66
+ url == "#{Stripe.api_base}/v1/subscription_items" && api_key.nil? &&
67
+ CGI.parse(params) == {'plan' => ['silver'], 'quantity' => ['3']}
68
+ end.returns(make_response(make_subscription_item(:plan => 'silver', :quantity => 3)))
69
+
70
+ sub_item = Stripe::SubscriptionItem.create(:plan => 'silver', :quantity => 3)
71
+
72
+ assert_equal 'silver', sub_item.plan.id
73
+ assert_equal 3, sub_item.quantity
74
+ end
75
+ end
76
+ end
@@ -87,6 +87,52 @@ module Stripe
87
87
  assert_equal 'active', sub.status
88
88
  end
89
89
 
90
+ should "subscription items should be updateable" do
91
+ sid = 's_test_subscription'
92
+ items = {:data => [{:plan => {:id =>'gold'}, :quantity => 1}, {:plan => {:id =>'silver'}, :quantity => 2}]}
93
+
94
+ @mock.expects(:post).once.with do |url, api_key, params|
95
+ url == "#{Stripe.api_base}/v1/subscriptions/#{sid}" &&
96
+ api_key.nil? &&
97
+ CGI.parse(params) == {
98
+ 'items[0][plan]' => ['gold'],
99
+ 'items[0][quantity]' => ['1'],
100
+ 'items[1][plan]' => ['silver'],
101
+ 'items[1][quantity]' => ['2'],
102
+ }
103
+ end.returns(make_response(make_subscription(:items => items)))
104
+
105
+ sub = Stripe::Subscription.update(sid, :items => [{:plan => 'gold', :quantity =>1}, {:plan => 'silver', :quantity =>2}])
106
+
107
+ assert_equal 'gold', sub.items.data[0].plan.id
108
+ assert_equal 1, sub.items.data[0].quantity
109
+ assert_equal 'silver', sub.items.data[1].plan.id
110
+ assert_equal 2, sub.items.data[1].quantity
111
+ end
112
+
113
+ should "subscription items should be updateable with hash" do
114
+ sid = 's_test_subscription'
115
+ items = {:data => [{:plan => {:id =>'gold'}, :quantity => 1}, {:plan => {:id =>'silver'}, :quantity => 2}]}
116
+
117
+ @mock.expects(:post).once.with do |url, api_key, params|
118
+ url == "#{Stripe.api_base}/v1/subscriptions/#{sid}" &&
119
+ api_key.nil? &&
120
+ CGI.parse(params) == {
121
+ 'items[0][plan]' => ['gold'],
122
+ 'items[0][quantity]' => ['1'],
123
+ 'items[1][plan]' => ['silver'],
124
+ 'items[1][quantity]' => ['2'],
125
+ }
126
+ end.returns(make_response(make_subscription(:items => items)))
127
+
128
+ sub = Stripe::Subscription.update(sid, :items => {'0' => {:plan => 'gold', :quantity =>1}, '1' => {:plan => 'silver', :quantity =>2}})
129
+
130
+ assert_equal 'gold', sub.items.data[0].plan.id
131
+ assert_equal 1, sub.items.data[0].quantity
132
+ assert_equal 'silver', sub.items.data[1].plan.id
133
+ assert_equal 2, sub.items.data[1].quantity
134
+ end
135
+
90
136
  should "subscriptions should be saveable" do
91
137
  @mock.expects(:get).once.returns(make_response(make_subscription))
92
138
  sub = Stripe::Subscription.retrieve('s_test_subscription')
@@ -113,6 +159,30 @@ module Stripe
113
159
  assert_equal 'gold', sub.plan.identifier
114
160
  end
115
161
 
162
+ should "create with items should return a new subscription" do
163
+ items = {:data => [{:plan => {:id =>'gold'}, :quantity => 1}, {:plan => {:id =>'silver'}, :quantity => 2}]}
164
+
165
+ @mock.expects(:post).once.with do |url, api_key, params|
166
+ url == "#{Stripe.api_base}/v1/subscriptions" &&
167
+ api_key.nil? &&
168
+ CGI.parse(params) == {
169
+ 'customer' => ['c_test_customer'],
170
+ 'items[0][plan]' => ['gold'],
171
+ 'items[0][quantity]' => ['1'],
172
+ 'items[1][plan]' => ['silver'],
173
+ 'items[1][quantity]' => ['2'],
174
+ }
175
+ end.returns(make_response(make_subscription(:items => items, :id => 'test_new_subscription')))
176
+
177
+ sub = Stripe::Subscription.create(:customer => 'c_test_customer', :items => [{:plan => 'gold', :quantity =>1}, {:plan => 'silver', :quantity =>2}])
178
+
179
+ assert_equal 'test_new_subscription', sub.id
180
+ assert_equal 'gold', sub.items.data[0].plan.id
181
+ assert_equal 1, sub.items.data[0].quantity
182
+ assert_equal 'silver', sub.items.data[1].plan.id
183
+ assert_equal 2, sub.items.data[1].quantity
184
+ end
185
+
116
186
  should "be able to delete a subscriptions's discount" do
117
187
  @mock.expects(:post).once.returns(make_response(make_subscription))
118
188
  sub = Stripe::Subscription.create(:plan => 'gold', :customer => 'c_test_customer', coupon: 'forever')
@@ -141,5 +141,9 @@ module Stripe
141
141
  obj = Util.convert_to_stripe_object([1, 2, 3], {})
142
142
  assert_equal [1, 2, 3], obj
143
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
144
148
  end
145
149
  end
@@ -277,6 +277,24 @@ module Stripe
277
277
  }.merge(params)
278
278
  end
279
279
 
280
+ def make_subscription_item(params = {})
281
+ plan = params.delete(:plan) || 'gold'
282
+ {
283
+ :id => "si_test_subscription_item",
284
+ :object => "subscription_item",
285
+ :created => 1473875521,
286
+ :plan => {
287
+ :id => plan,
288
+ :object => "plan",
289
+ :amount => 1000,
290
+ :created => 1468349629,
291
+ :currency => "usd",
292
+ :interval => "month",
293
+ },
294
+ :quantity => 1
295
+ }.merge(params)
296
+ end
297
+
280
298
  def make_refund(params = {})
281
299
  {
282
300
  :object => 'refund',
@@ -297,6 +315,14 @@ module Stripe
297
315
  }
298
316
  end
299
317
 
318
+ def make_subscription_item_array
319
+ {
320
+ :data => [make_subscription_item, make_subscription_item, make_subscription_item],
321
+ :object => 'list',
322
+ :resource_url => '/v1/subscription_items'
323
+ }
324
+ end
325
+
300
326
  def make_customer_subscription_array(customer_id)
301
327
  {
302
328
  :data => [make_subscription, make_subscription, make_subscription],
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stripe
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.55.0
4
+ version: 1.55.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stripe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-15 00:00:00.000000000 Z
11
+ date: 2016-10-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
@@ -77,6 +77,7 @@ files:
77
77
  - lib/stripe/errors/authentication_error.rb
78
78
  - lib/stripe/errors/card_error.rb
79
79
  - lib/stripe/errors/invalid_request_error.rb
80
+ - lib/stripe/errors/permission_error.rb
80
81
  - lib/stripe/errors/rate_limit_error.rb
81
82
  - lib/stripe/errors/stripe_error.rb
82
83
  - lib/stripe/event.rb
@@ -96,6 +97,7 @@ files:
96
97
  - lib/stripe/source.rb
97
98
  - lib/stripe/stripe_object.rb
98
99
  - lib/stripe/subscription.rb
100
+ - lib/stripe/subscription_item.rb
99
101
  - lib/stripe/three_d_secure.rb
100
102
  - lib/stripe/token.rb
101
103
  - lib/stripe/transfer.rb
@@ -136,6 +138,7 @@ files:
136
138
  - test/stripe/sku_test.rb
137
139
  - test/stripe/source_test.rb
138
140
  - test/stripe/stripe_object_test.rb
141
+ - test/stripe/subscription_item_test.rb
139
142
  - test/stripe/subscription_test.rb
140
143
  - test/stripe/three_d_secure_test.rb
141
144
  - test/stripe/transfer_test.rb
@@ -202,6 +205,7 @@ test_files:
202
205
  - test/stripe/sku_test.rb
203
206
  - test/stripe/source_test.rb
204
207
  - test/stripe/stripe_object_test.rb
208
+ - test/stripe/subscription_item_test.rb
205
209
  - test/stripe/subscription_test.rb
206
210
  - test/stripe/three_d_secure_test.rb
207
211
  - test/stripe/transfer_test.rb