stripe-ruby-mock 2.5.6 → 3.1.0.rc2
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 +5 -5
- data/.gitignore +1 -1
- data/.travis.yml +6 -9
- data/CHANGELOG.md +35 -0
- data/Gemfile +1 -0
- data/README.md +17 -11
- data/lib/stripe_mock.rb +11 -0
- data/lib/stripe_mock/api/client.rb +1 -1
- data/lib/stripe_mock/api/errors.rb +34 -28
- data/lib/stripe_mock/api/instance.rb +1 -1
- data/lib/stripe_mock/api/webhooks.rb +7 -0
- data/lib/stripe_mock/client.rb +2 -1
- data/lib/stripe_mock/data.rb +323 -13
- data/lib/stripe_mock/data/list.rb +42 -9
- data/lib/stripe_mock/instance.rb +52 -5
- data/lib/stripe_mock/request_handlers/account_links.rb +15 -0
- data/lib/stripe_mock/request_handlers/balance_transactions.rb +2 -2
- data/lib/stripe_mock/request_handlers/charges.rb +13 -12
- data/lib/stripe_mock/request_handlers/checkout.rb +15 -0
- data/lib/stripe_mock/request_handlers/checkout_session.rb +16 -0
- data/lib/stripe_mock/request_handlers/customers.rb +35 -18
- data/lib/stripe_mock/request_handlers/ephemeral_key.rb +1 -1
- data/lib/stripe_mock/request_handlers/express_login_links.rb +15 -0
- data/lib/stripe_mock/request_handlers/helpers/coupon_helpers.rb +14 -10
- data/lib/stripe_mock/request_handlers/helpers/subscription_helpers.rb +22 -7
- data/lib/stripe_mock/request_handlers/helpers/token_helpers.rb +1 -1
- data/lib/stripe_mock/request_handlers/invoices.rb +11 -5
- data/lib/stripe_mock/request_handlers/payment_intents.rb +182 -0
- data/lib/stripe_mock/request_handlers/payment_methods.rb +120 -0
- data/lib/stripe_mock/request_handlers/plans.rb +1 -1
- data/lib/stripe_mock/request_handlers/prices.rb +44 -0
- data/lib/stripe_mock/request_handlers/products.rb +44 -0
- data/lib/stripe_mock/request_handlers/refunds.rb +6 -3
- data/lib/stripe_mock/request_handlers/setup_intents.rb +93 -0
- data/lib/stripe_mock/request_handlers/sources.rb +12 -6
- data/lib/stripe_mock/request_handlers/subscription_items.rb +36 -0
- data/lib/stripe_mock/request_handlers/subscriptions.rb +82 -41
- data/lib/stripe_mock/request_handlers/tax_rates.rb +36 -0
- data/lib/stripe_mock/request_handlers/tokens.rb +8 -6
- data/lib/stripe_mock/request_handlers/validators/param_validators.rb +130 -9
- data/lib/stripe_mock/test_strategies/base.rb +68 -8
- data/lib/stripe_mock/test_strategies/live.rb +23 -12
- data/lib/stripe_mock/test_strategies/mock.rb +6 -2
- data/lib/stripe_mock/version.rb +1 -1
- data/lib/stripe_mock/webhook_fixtures/balance.available.json +6 -0
- data/lib/stripe_mock/webhook_fixtures/charge.dispute.funds_reinstated.json +88 -0
- data/lib/stripe_mock/webhook_fixtures/charge.dispute.funds_withdrawn.json +88 -0
- data/lib/stripe_mock/webhook_fixtures/charge.failed.json +166 -38
- data/lib/stripe_mock/webhook_fixtures/customer.created.json +1 -0
- data/lib/stripe_mock/webhook_fixtures/customer.updated.json +1 -0
- data/lib/stripe_mock/webhook_fixtures/invoice.created.json +2 -1
- data/lib/stripe_mock/webhook_fixtures/invoice.payment_succeeded.json +1 -1
- data/lib/stripe_mock/webhook_fixtures/invoice.updated.json +2 -1
- data/lib/stripe_mock/webhook_fixtures/payment_intent.payment_failed.json +186 -0
- data/lib/stripe_mock/webhook_fixtures/payment_intent.succeeded.json +164 -0
- data/lib/stripe_mock/webhook_fixtures/product.created.json +34 -0
- data/lib/stripe_mock/webhook_fixtures/product.deleted.json +34 -0
- data/lib/stripe_mock/webhook_fixtures/product.updated.json +38 -0
- data/spec/instance_spec.rb +10 -12
- data/spec/list_spec.rb +38 -0
- data/spec/server_spec.rb +6 -3
- data/spec/shared_stripe_examples/account_examples.rb +1 -1
- data/spec/shared_stripe_examples/account_link_examples.rb +16 -0
- data/spec/shared_stripe_examples/balance_examples.rb +6 -0
- data/spec/shared_stripe_examples/balance_transaction_examples.rb +3 -3
- data/spec/shared_stripe_examples/bank_examples.rb +3 -3
- data/spec/shared_stripe_examples/card_examples.rb +4 -4
- data/spec/shared_stripe_examples/card_token_examples.rb +17 -21
- data/spec/shared_stripe_examples/charge_examples.rb +32 -36
- data/spec/shared_stripe_examples/checkout_examples.rb +38 -0
- data/spec/shared_stripe_examples/coupon_examples.rb +1 -1
- data/spec/shared_stripe_examples/customer_examples.rb +103 -53
- data/spec/shared_stripe_examples/dispute_examples.rb +2 -2
- data/spec/shared_stripe_examples/error_mock_examples.rb +8 -7
- data/spec/shared_stripe_examples/express_login_link_examples.rb +12 -0
- data/spec/shared_stripe_examples/external_account_examples.rb +3 -3
- data/spec/shared_stripe_examples/invoice_examples.rb +43 -41
- data/spec/shared_stripe_examples/invoice_item_examples.rb +1 -1
- data/spec/shared_stripe_examples/payment_intent_examples.rb +147 -0
- data/spec/shared_stripe_examples/payment_method_examples.rb +449 -0
- data/spec/shared_stripe_examples/payout_examples.rb +2 -2
- data/spec/shared_stripe_examples/plan_examples.rb +135 -77
- data/spec/shared_stripe_examples/price_examples.rb +183 -0
- data/spec/shared_stripe_examples/product_examples.rb +155 -0
- data/spec/shared_stripe_examples/refund_examples.rb +41 -31
- data/spec/shared_stripe_examples/setup_intent_examples.rb +68 -0
- data/spec/shared_stripe_examples/subscription_examples.rb +546 -295
- data/spec/shared_stripe_examples/subscription_items_examples.rb +76 -0
- data/spec/shared_stripe_examples/tax_rate_examples.rb +42 -0
- data/spec/shared_stripe_examples/transfer_examples.rb +9 -9
- data/spec/shared_stripe_examples/webhook_event_examples.rb +11 -11
- data/spec/spec_helper.rb +7 -4
- data/spec/stripe_mock_spec.rb +4 -4
- data/spec/support/shared_contexts/stripe_validator_spec.rb +8 -0
- data/spec/support/stripe_examples.rb +12 -2
- data/stripe-ruby-mock.gemspec +8 -3
- metadata +81 -32
@@ -0,0 +1,155 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
shared_examples "Product API" do
|
4
|
+
let(:product_attributes) { {id: "prod_123", name: "My Mock Product", type: "service"} }
|
5
|
+
let(:product) { Stripe::Product.create(product_attributes) }
|
6
|
+
|
7
|
+
it "creates a stripe product" do
|
8
|
+
expect(product.id).to eq("prod_123")
|
9
|
+
expect(product.name).to eq("My Mock Product")
|
10
|
+
expect(product.type).to eq("service")
|
11
|
+
end
|
12
|
+
|
13
|
+
it "stores a created stripe product in memory" do
|
14
|
+
product = Stripe::Product.create(product_attributes)
|
15
|
+
product2 = Stripe::Product.create(product_attributes.merge({id: "prod_456", name: "My Other Product"}))
|
16
|
+
|
17
|
+
data = test_data_source(:products)
|
18
|
+
expect(data[product.id]).to_not be_nil
|
19
|
+
expect(data[product.id][:id]).to eq("prod_123")
|
20
|
+
expect(data[product.id][:name]).to eq("My Mock Product")
|
21
|
+
expect(data[product2.id]).to_not be_nil
|
22
|
+
expect(data[product2.id][:id]).to eq("prod_456")
|
23
|
+
expect(data[product2.id][:name]).to eq("My Other Product")
|
24
|
+
end
|
25
|
+
|
26
|
+
it "retrieves a stripe product" do
|
27
|
+
original = stripe_helper.create_product(product_attributes)
|
28
|
+
product = Stripe::Product.retrieve(original.id)
|
29
|
+
|
30
|
+
expect(product.id).to eq(original.id)
|
31
|
+
expect(product.name).to eq(original.name)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "updates a stripe product" do
|
35
|
+
stripe_helper.create_product(id: "prod_XYZ", name: "Future Product")
|
36
|
+
|
37
|
+
product = Stripe::Product.retrieve("prod_XYZ")
|
38
|
+
expect(product.name).to eq("Future Product")
|
39
|
+
|
40
|
+
product.name = "Updated Product"
|
41
|
+
product.save
|
42
|
+
product = Stripe::Product.retrieve("prod_XYZ")
|
43
|
+
expect(product.name).to eq("Updated Product")
|
44
|
+
end
|
45
|
+
|
46
|
+
it "cannot retrieve a stripe product that doesn't exist" do
|
47
|
+
expect { Stripe::Product.retrieve('nope') }.to raise_error {|e|
|
48
|
+
expect(e).to be_a Stripe::InvalidRequestError
|
49
|
+
expect(e.param).to eq("product")
|
50
|
+
expect(e.http_status).to eq(404)
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
it "deletes a stripe product" do
|
55
|
+
stripe_helper.create_product(id: "prod_DEL", name: "Aging Product")
|
56
|
+
|
57
|
+
product = Stripe::Product.retrieve("prod_DEL")
|
58
|
+
expect(product).to_not be_nil
|
59
|
+
|
60
|
+
product.delete
|
61
|
+
|
62
|
+
expect { Stripe::Product.retrieve("prod_DEL") }.to raise_error {|e|
|
63
|
+
expect(e).to be_a Stripe::InvalidRequestError
|
64
|
+
expect(e.param).to eq("product")
|
65
|
+
expect(e.http_status).to eq(404)
|
66
|
+
}
|
67
|
+
end
|
68
|
+
|
69
|
+
it "retrieves all products" do
|
70
|
+
stripe_helper.create_product(id: "prod_123", name: "First Product")
|
71
|
+
stripe_helper.create_product(id: "prod_456", name: "Second Product")
|
72
|
+
|
73
|
+
all = Stripe::Product.list
|
74
|
+
expect(all.count).to eq(2)
|
75
|
+
expect(all.map &:id).to include("prod_123", "prod_456")
|
76
|
+
expect(all.map &:name).to include("First Product", "Second Product")
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'retrieves products with limit' do
|
80
|
+
101.times do |i|
|
81
|
+
stripe_helper.create_product(id: "Product #{i}", name: "My Product ##{i}")
|
82
|
+
end
|
83
|
+
all = Stripe::Product.list(limit: 100)
|
84
|
+
|
85
|
+
expect(all.count).to eq(100)
|
86
|
+
end
|
87
|
+
|
88
|
+
describe "Validation", :live => true do
|
89
|
+
include_context "stripe validator"
|
90
|
+
let(:params) { stripe_helper.create_product_params }
|
91
|
+
let(:subject) { Stripe::Product.create(params) }
|
92
|
+
before { stripe_helper.delete_product(params[:id]) }
|
93
|
+
|
94
|
+
describe "Required Parameters" do
|
95
|
+
after do
|
96
|
+
params.delete(@attribute_name)
|
97
|
+
message = stripe_validator.missing_param_message(@attribute_name)
|
98
|
+
expect { subject }.to raise_error(Stripe::InvalidRequestError, message)
|
99
|
+
end
|
100
|
+
|
101
|
+
it("requires a name") { @attribute_name = :name }
|
102
|
+
end
|
103
|
+
|
104
|
+
describe "Inclusion" do
|
105
|
+
it "validates inclusion of type in 'good' or 'service'" do
|
106
|
+
expect {
|
107
|
+
Stripe::Product.create(params.merge({type: "OOPS"}))
|
108
|
+
}.to raise_error(Stripe::InvalidRequestError, "Invalid type: must be one of good or service")
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
describe "Uniqueness" do
|
113
|
+
let(:already_exists_message){ stripe_validator.already_exists_message(Stripe::Product) }
|
114
|
+
|
115
|
+
it "validates uniqueness of identifier" do
|
116
|
+
stripe_helper.delete_product(params[:id])
|
117
|
+
|
118
|
+
Stripe::Product.create(params)
|
119
|
+
expect {
|
120
|
+
Stripe::Product.create(params)
|
121
|
+
}.to raise_error(Stripe::InvalidRequestError, already_exists_message)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
describe "Mock Data" do
|
127
|
+
let(:mock_object) { StripeMock::Data.mock_product }
|
128
|
+
let(:known_attributes) { [
|
129
|
+
:id,
|
130
|
+
:object,
|
131
|
+
:active,
|
132
|
+
:attributes,
|
133
|
+
:caption,
|
134
|
+
:created,
|
135
|
+
:deactivate_on,
|
136
|
+
:description,
|
137
|
+
:images,
|
138
|
+
:livemode,
|
139
|
+
:metadata,
|
140
|
+
:name,
|
141
|
+
:package_dimensions,
|
142
|
+
:shippable,
|
143
|
+
:statement_descriptor,
|
144
|
+
:type,
|
145
|
+
:unit_label,
|
146
|
+
:updated,
|
147
|
+
:url
|
148
|
+
] }
|
149
|
+
|
150
|
+
it "includes all retreived attributes" do
|
151
|
+
expect(mock_object.keys).to eql(known_attributes)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
@@ -30,9 +30,7 @@ shared_examples 'Refund API' do
|
|
30
30
|
description: 'card charge'
|
31
31
|
)
|
32
32
|
|
33
|
-
Stripe::Refund.create(
|
34
|
-
charge: charge.id
|
35
|
-
)
|
33
|
+
Stripe::Refund.create(charge: charge.id)
|
36
34
|
|
37
35
|
charge = Stripe::Charge.retrieve(charge.id)
|
38
36
|
|
@@ -262,7 +260,7 @@ shared_examples 'Refund API' do
|
|
262
260
|
end
|
263
261
|
|
264
262
|
it "stores all charges in memory" do
|
265
|
-
expect(Stripe::Refund.
|
263
|
+
expect(Stripe::Refund.list.data.map(&:id)).to eq([@refund2.id, @refund.id])
|
266
264
|
end
|
267
265
|
|
268
266
|
it "defaults count to 10 charges" do
|
@@ -275,7 +273,7 @@ shared_examples 'Refund API' do
|
|
275
273
|
Stripe::Refund.create(charge: charge.id)
|
276
274
|
end
|
277
275
|
|
278
|
-
expect(Stripe::Refund.
|
276
|
+
expect(Stripe::Refund.list.data.count).to eq(10)
|
279
277
|
end
|
280
278
|
|
281
279
|
it "is marked as having more when more objects exist" do
|
@@ -288,12 +286,12 @@ shared_examples 'Refund API' do
|
|
288
286
|
Stripe::Refund.create(charge: charge.id)
|
289
287
|
end
|
290
288
|
|
291
|
-
expect(Stripe::Refund.
|
289
|
+
expect(Stripe::Refund.list.has_more).to eq(true)
|
292
290
|
end
|
293
291
|
|
294
292
|
context "when passing limit" do
|
295
293
|
it "gets that many charges" do
|
296
|
-
expect(Stripe::Refund.
|
294
|
+
expect(Stripe::Refund.list(limit: 1).count).to eq(1)
|
297
295
|
end
|
298
296
|
end
|
299
297
|
end
|
@@ -318,13 +316,13 @@ shared_examples 'Refund API' do
|
|
318
316
|
Stripe::Refund.create(charge: charge.id)
|
319
317
|
end
|
320
318
|
|
321
|
-
|
319
|
+
all_refunds = Stripe::Refund.list
|
322
320
|
default_limit = 10
|
323
|
-
half = Stripe::Refund.
|
321
|
+
half = Stripe::Refund.list(starting_after: all_refunds.data.at(1).id)
|
324
322
|
|
325
323
|
expect(half).to be_a(Stripe::ListObject)
|
326
324
|
expect(half.data.count).to eq(default_limit)
|
327
|
-
expect(half.data.first.id).to eq(
|
325
|
+
expect(half.data.first.id).to eq(all_refunds.data.at(2).id)
|
328
326
|
end
|
329
327
|
|
330
328
|
describe "idempotency" do
|
@@ -337,26 +335,32 @@ shared_examples 'Refund API' do
|
|
337
335
|
capture: true
|
338
336
|
)
|
339
337
|
end
|
340
|
-
let(:
|
341
|
-
charge: charge.id
|
338
|
+
let(:refund_params) {{
|
339
|
+
charge: charge.id
|
340
|
+
}}
|
341
|
+
|
342
|
+
let(:refund_headers) {{
|
342
343
|
idempotency_key: 'onceisenough'
|
343
344
|
}}
|
344
345
|
|
345
346
|
it "returns the original refund if the same idempotency_key is passed in" do
|
346
|
-
refund1 = Stripe::Refund.create(
|
347
|
-
refund2 = Stripe::Refund.create(
|
347
|
+
refund1 = Stripe::Refund.create(refund_params, refund_headers)
|
348
|
+
refund2 = Stripe::Refund.create(refund_params, refund_headers)
|
348
349
|
|
349
350
|
expect(refund1).to eq(refund2)
|
350
351
|
end
|
351
352
|
|
352
|
-
|
353
|
-
|
354
|
-
|
353
|
+
context 'different key' do
|
354
|
+
let(:different_refund_headers) {{
|
355
|
+
idempotency_key: 'thisoneisdifferent'
|
356
|
+
}}
|
355
357
|
|
356
|
-
|
357
|
-
|
358
|
+
it "returns different charges if different idempotency_keys are used for each charge" do
|
359
|
+
refund1 = Stripe::Refund.create(refund_params, refund_headers)
|
360
|
+
refund2 = Stripe::Refund.create(refund_params, different_refund_headers)
|
358
361
|
|
359
|
-
|
362
|
+
expect(refund1).not_to eq(refund2)
|
363
|
+
end
|
360
364
|
end
|
361
365
|
end
|
362
366
|
end
|
@@ -372,7 +376,8 @@ shared_examples 'Refund API' do
|
|
372
376
|
description: 'card charge'
|
373
377
|
)
|
374
378
|
|
375
|
-
charge
|
379
|
+
Stripe::Refund.create(charge: charge.id, amount: 999)
|
380
|
+
charge.refresh
|
376
381
|
|
377
382
|
expect(charge.refunded).to eq(true)
|
378
383
|
expect(charge.refunds.data.first.amount).to eq(999)
|
@@ -386,10 +391,10 @@ shared_examples 'Refund API' do
|
|
386
391
|
source: stripe_helper.generate_card_token,
|
387
392
|
description: 'card charge'
|
388
393
|
)
|
389
|
-
refund = charge.
|
394
|
+
refund = Stripe::Refund.create(charge: charge.id)
|
390
395
|
|
391
396
|
expect(charge.id).to match(/^(test_)?ch/)
|
392
|
-
expect(refund.
|
397
|
+
expect(refund.charge).to eq(charge.id)
|
393
398
|
end
|
394
399
|
|
395
400
|
it "creates a stripe refund with a refund ID" do
|
@@ -399,10 +404,12 @@ shared_examples 'Refund API' do
|
|
399
404
|
source: stripe_helper.generate_card_token,
|
400
405
|
description: 'card charge'
|
401
406
|
)
|
402
|
-
refund = charge.refund
|
403
407
|
|
404
|
-
|
405
|
-
|
408
|
+
Stripe::Refund.create(charge: charge.id)
|
409
|
+
refunds = Stripe::Refund.list(charge: charge.id)
|
410
|
+
|
411
|
+
expect(refunds.data.count).to eq 1
|
412
|
+
expect(refunds.data.first.id).to match(/^test_re/)
|
406
413
|
end
|
407
414
|
|
408
415
|
it "creates a stripe refund with a status" do
|
@@ -412,10 +419,12 @@ shared_examples 'Refund API' do
|
|
412
419
|
source: stripe_helper.generate_card_token,
|
413
420
|
description: 'card charge'
|
414
421
|
)
|
415
|
-
refund = charge.refund
|
416
422
|
|
417
|
-
|
418
|
-
|
423
|
+
Stripe::Refund.create(charge: charge.id)
|
424
|
+
refunds = Stripe::Refund.list(charge: charge.id)
|
425
|
+
|
426
|
+
expect(refunds.data.count).to eq 1
|
427
|
+
expect(refunds.data.first.status).to eq("succeeded")
|
419
428
|
end
|
420
429
|
|
421
430
|
it "creates a stripe refund with a different balance transaction than the charge" do
|
@@ -425,9 +434,10 @@ shared_examples 'Refund API' do
|
|
425
434
|
source: stripe_helper.generate_card_token,
|
426
435
|
description: 'card charge'
|
427
436
|
)
|
428
|
-
|
437
|
+
Stripe::Refund.create(charge: charge.id)
|
438
|
+
refunds = Stripe::Refund.list(charge: charge.id)
|
429
439
|
|
430
|
-
expect(charge.balance_transaction).not_to eq(
|
440
|
+
expect(charge.balance_transaction).not_to eq(refunds.data.first.balance_transaction)
|
431
441
|
end
|
432
442
|
|
433
443
|
it "creates a refund off a charge", :live => true do
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
shared_examples 'SetupIntent API' do
|
4
|
+
|
5
|
+
it "creates a stripe setup_intent" do
|
6
|
+
setup_intent = Stripe::SetupIntent.create()
|
7
|
+
|
8
|
+
expect(setup_intent.id).to match(/^test_si/)
|
9
|
+
expect(setup_intent.metadata.to_hash).to eq({})
|
10
|
+
expect(setup_intent.status).to eq('requires_payment_method')
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "listing setup_intent" do
|
14
|
+
before do
|
15
|
+
3.times do
|
16
|
+
Stripe::SetupIntent.create()
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
it "without params retrieves all stripe setup_intent" do
|
21
|
+
expect(Stripe::SetupIntent.list.count).to eq(3)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "accepts a limit param" do
|
25
|
+
expect(Stripe::SetupIntent.list(limit: 2).count).to eq(2)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
it "retrieves a stripe setup_intent" do
|
30
|
+
original = Stripe::SetupIntent.create()
|
31
|
+
setup_intent = Stripe::SetupIntent.retrieve(original.id)
|
32
|
+
|
33
|
+
expect(setup_intent.id).to eq(original.id)
|
34
|
+
expect(setup_intent.metadata.to_hash).to eq(original.metadata.to_hash)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "cannot retrieve a setup_intent that doesn't exist" do
|
38
|
+
expect { Stripe::SetupIntent.retrieve('nope') }.to raise_error {|e|
|
39
|
+
expect(e).to be_a Stripe::InvalidRequestError
|
40
|
+
expect(e.param).to eq('setup_intent')
|
41
|
+
expect(e.http_status).to eq(404)
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
it "confirms a stripe setup_intent" do
|
46
|
+
setup_intent = Stripe::SetupIntent.create()
|
47
|
+
confirmed_setup_intent = setup_intent.confirm()
|
48
|
+
expect(confirmed_setup_intent.status).to eq("succeeded")
|
49
|
+
end
|
50
|
+
|
51
|
+
it "cancels a stripe setup_intent" do
|
52
|
+
setup_intent = Stripe::SetupIntent.create()
|
53
|
+
confirmed_setup_intent = setup_intent.cancel()
|
54
|
+
expect(confirmed_setup_intent.status).to eq("canceled")
|
55
|
+
end
|
56
|
+
|
57
|
+
it "updates a stripe setup_intent" do
|
58
|
+
original = Stripe::SetupIntent.create()
|
59
|
+
setup_intent = Stripe::SetupIntent.retrieve(original.id)
|
60
|
+
|
61
|
+
setup_intent.metadata[:foo] = :bar
|
62
|
+
setup_intent.save
|
63
|
+
|
64
|
+
updated = Stripe::SetupIntent.retrieve(original.id)
|
65
|
+
|
66
|
+
expect(updated.metadata[:foo]).to eq(:bar)
|
67
|
+
end
|
68
|
+
end
|
@@ -1,49 +1,61 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'securerandom'
|
2
3
|
|
3
|
-
shared_examples 'Customer Subscriptions' do
|
4
|
+
shared_examples 'Customer Subscriptions with plans' do
|
5
|
+
let(:gen_card_tk) { stripe_helper.generate_card_token }
|
4
6
|
|
5
|
-
|
6
|
-
|
7
|
-
|
7
|
+
let(:product) { stripe_helper.create_product }
|
8
|
+
let(:plan_attrs) { {id: 'silver', product: product.id, amount: 4999, currency: 'usd'} }
|
9
|
+
let(:plan) { stripe_helper.create_plan(plan_attrs) }
|
10
|
+
|
11
|
+
let(:plan_with_trial_attrs) { {id: 'trial', product: product.id, amount: 999, trial_period_days: 14 } }
|
12
|
+
let(:plan_with_trial) { stripe_helper.create_plan(plan_with_trial_attrs) }
|
13
|
+
|
14
|
+
let(:free_plan) { stripe_helper.create_plan(id: 'free', product: product.id, amount: 0) }
|
8
15
|
|
9
16
|
context "creating a new subscription" do
|
10
|
-
it "adds a new subscription to customer with none using items", :
|
11
|
-
plan
|
12
|
-
amount: 4999, currency: 'usd')
|
17
|
+
it "adds a new subscription to customer with none using items", live: true do
|
18
|
+
plan
|
13
19
|
customer = Stripe::Customer.create(source: gen_card_tk)
|
14
20
|
|
15
21
|
expect(customer.subscriptions.data).to be_empty
|
16
22
|
expect(customer.subscriptions.count).to eq(0)
|
17
23
|
|
18
|
-
|
19
|
-
|
24
|
+
subscription = Stripe::Subscription.create({
|
25
|
+
customer: customer.id,
|
26
|
+
items: [{ plan: 'silver' }],
|
27
|
+
metadata: { foo: "bar", example: "yes" }
|
28
|
+
})
|
20
29
|
|
21
|
-
expect(
|
22
|
-
expect(
|
23
|
-
expect(
|
24
|
-
expect(
|
30
|
+
expect(subscription.object).to eq('subscription')
|
31
|
+
expect(subscription.plan.to_hash).to eq(plan.to_hash)
|
32
|
+
expect(subscription.metadata.foo).to eq("bar")
|
33
|
+
expect(subscription.metadata.example).to eq("yes")
|
25
34
|
|
26
35
|
customer = Stripe::Customer.retrieve(customer.id)
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
expect(
|
31
|
-
expect(
|
32
|
-
|
33
|
-
expect(
|
34
|
-
expect(customer.
|
35
|
-
|
36
|
-
expect(
|
37
|
-
expect(
|
36
|
+
subscriptions = Stripe::Subscription.list(customer: customer.id)
|
37
|
+
charges = Stripe::Charge.list(customer: customer.id)
|
38
|
+
|
39
|
+
expect(subscriptions.data).to_not be_empty
|
40
|
+
expect(subscriptions.count).to eq(1)
|
41
|
+
expect(subscriptions.data.length).to eq(1)
|
42
|
+
expect(charges.data.length).to eq(1)
|
43
|
+
expect(customer.currency).to eq("usd")
|
44
|
+
|
45
|
+
expect(subscriptions.data.first.id).to eq(subscription.id)
|
46
|
+
expect(subscriptions.data.first.plan.to_hash).to eq(plan.to_hash)
|
47
|
+
expect(subscriptions.data.first.customer).to eq(customer.id)
|
48
|
+
expect(subscriptions.data.first.metadata.foo).to eq( "bar" )
|
49
|
+
expect(subscriptions.data.first.metadata.example).to eq( "yes" )
|
38
50
|
end
|
39
51
|
|
40
|
-
it "adds a new subscription to customer with none", :
|
41
|
-
plan
|
42
|
-
amount: 4999, currency: 'usd')
|
52
|
+
it "adds a new subscription to customer with none", live: true do
|
53
|
+
plan
|
43
54
|
customer = Stripe::Customer.create(source: gen_card_tk)
|
55
|
+
subscriptions = Stripe::Subscription.list(customer: customer.id)
|
44
56
|
|
45
|
-
expect(
|
46
|
-
expect(
|
57
|
+
expect(subscriptions.data).to be_empty
|
58
|
+
expect(subscriptions.count).to eq(0)
|
47
59
|
|
48
60
|
sub = Stripe::Subscription.create({ plan: 'silver', customer: customer.id, metadata: { foo: "bar", example: "yes" } })
|
49
61
|
|
@@ -53,26 +65,30 @@ shared_examples 'Customer Subscriptions' do
|
|
53
65
|
expect(sub.metadata.example).to eq( "yes" )
|
54
66
|
|
55
67
|
customer = Stripe::Customer.retrieve(customer.id)
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
expect(
|
68
|
+
subscriptions = Stripe::Subscription.list(customer: customer.id)
|
69
|
+
charges = Stripe::Charge.list(customer: customer.id)
|
70
|
+
|
71
|
+
expect(subscriptions.data).to_not be_empty
|
72
|
+
expect(subscriptions.count).to eq(1)
|
73
|
+
expect(subscriptions.data.length).to eq(1)
|
74
|
+
expect(charges.data.length).to eq(1)
|
60
75
|
expect(customer.currency).to eq( "usd" )
|
61
76
|
|
62
|
-
expect(
|
63
|
-
expect(
|
64
|
-
expect(
|
65
|
-
expect(
|
66
|
-
expect(
|
67
|
-
expect(
|
77
|
+
expect(subscriptions.data.first.id).to eq(sub.id)
|
78
|
+
expect(subscriptions.data.first.plan.to_hash).to eq(plan.to_hash)
|
79
|
+
expect(subscriptions.data.first.customer).to eq(customer.id)
|
80
|
+
expect(subscriptions.data.first.billing).to eq('charge_automatically')
|
81
|
+
expect(subscriptions.data.first.metadata.foo).to eq( "bar" )
|
82
|
+
expect(subscriptions.data.first.metadata.example).to eq( "yes" )
|
68
83
|
end
|
69
84
|
|
70
85
|
it 'when customer object provided' do
|
71
|
-
plan
|
86
|
+
plan
|
72
87
|
customer = Stripe::Customer.create(source: gen_card_tk)
|
88
|
+
subscriptions = Stripe::Subscription.list(customer: customer.id)
|
73
89
|
|
74
|
-
expect(
|
75
|
-
expect(
|
90
|
+
expect(subscriptions.data).to be_empty
|
91
|
+
expect(subscriptions.count).to eq(0)
|
76
92
|
|
77
93
|
sub = Stripe::Subscription.create({ plan: 'silver', customer: customer, metadata: { foo: "bar", example: "yes" } })
|
78
94
|
|
@@ -83,121 +99,149 @@ shared_examples 'Customer Subscriptions' do
|
|
83
99
|
expect(sub.metadata.example).to eq( "yes" )
|
84
100
|
|
85
101
|
customer = Stripe::Customer.retrieve(customer.id)
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
expect(
|
102
|
+
subscriptions = Stripe::Subscription.list(customer: customer.id)
|
103
|
+
charges = Stripe::Charge.list(customer: customer.id)
|
104
|
+
|
105
|
+
expect(subscriptions.data).to_not be_empty
|
106
|
+
expect(subscriptions.count).to eq(1)
|
107
|
+
expect(subscriptions.data.length).to eq(1)
|
108
|
+
expect(charges.data.length).to eq(1)
|
90
109
|
expect(customer.currency).to eq( "usd" )
|
91
110
|
|
92
|
-
expect(
|
93
|
-
expect(
|
111
|
+
expect(subscriptions.data.first.id).to eq(sub.id)
|
112
|
+
expect(subscriptions.data.first.plan.to_hash).to eq(plan.to_hash)
|
94
113
|
|
95
|
-
expect(
|
96
|
-
expect(
|
97
|
-
expect(
|
98
|
-
expect(
|
114
|
+
expect(subscriptions.data.first.customer).to eq(customer.id)
|
115
|
+
expect(subscriptions.data.first.billing).to eq('charge_automatically')
|
116
|
+
expect(subscriptions.data.first.metadata.foo).to eq( "bar" )
|
117
|
+
expect(subscriptions.data.first.metadata.example).to eq( "yes" )
|
118
|
+
end
|
119
|
+
|
120
|
+
it "adds a new subscription with payment method provided as default" do
|
121
|
+
plan
|
122
|
+
customer = Stripe::Customer.create(source: gen_card_tk)
|
123
|
+
payment_method = Stripe::PaymentMethod.create(
|
124
|
+
type: 'card',
|
125
|
+
card: {
|
126
|
+
number: 4242_4242_4242_4242,
|
127
|
+
exp_month: 9,
|
128
|
+
exp_year: (Time.now.year + 5),
|
129
|
+
cvc: 999
|
130
|
+
}
|
131
|
+
)
|
132
|
+
sub = Stripe::Subscription.create(
|
133
|
+
plan: 'silver',
|
134
|
+
customer: customer,
|
135
|
+
metadata: { foo: "bar", example: "yes" },
|
136
|
+
collection_method: 'send_invoice',
|
137
|
+
default_payment_method: payment_method.id,
|
138
|
+
)
|
139
|
+
|
140
|
+
subscriptions = Stripe::Subscription.list(customer: customer.id)
|
141
|
+
expect(subscriptions.count).to eq(1)
|
142
|
+
expect(subscriptions.data.first.id).to eq(sub.id)
|
143
|
+
expect(subscriptions.data.first.collection_method).to eq('send_invoice')
|
144
|
+
expect(subscriptions.data.first.default_payment_method).to eq(payment_method.id)
|
99
145
|
end
|
100
146
|
|
101
147
|
it "adds a new subscription to customer (string/symbol agnostic)" do
|
102
148
|
customer = Stripe::Customer.create(source: gen_card_tk)
|
103
|
-
|
149
|
+
subscriptions = Stripe::Subscription.list(customer: customer.id)
|
150
|
+
expect(subscriptions.count).to eq(0)
|
104
151
|
|
105
|
-
plan
|
106
|
-
|
107
|
-
sub = Stripe::Subscription.create({ plan: 'silver', customer: customer.id })
|
108
|
-
customer = Stripe::Customer.retrieve(customer.id)
|
109
|
-
expect(sub.plan.to_hash).to eq(plan.to_hash)
|
110
|
-
expect(customer.subscriptions.count).to eq(1)
|
152
|
+
plan
|
153
|
+
sub = Stripe::Subscription.create({plan: plan.id, customer: customer.id })
|
111
154
|
|
112
|
-
plan = stripe_helper.create_plan(id: 'gold', product: { name: 'Gold Plan' },
|
113
|
-
amount: 14999, currency: 'usd')
|
114
|
-
sub = Stripe::Subscription.create({ plan: 'gold', customer: customer.id })
|
115
155
|
customer = Stripe::Customer.retrieve(customer.id)
|
156
|
+
subscriptions = Stripe::Subscription.list(customer: customer.id)
|
116
157
|
expect(sub.plan.to_hash).to eq(plan.to_hash)
|
117
|
-
expect(
|
158
|
+
expect(subscriptions.count).to eq(1)
|
118
159
|
end
|
119
160
|
|
120
161
|
it 'creates a charge for the customer', live: true do
|
121
|
-
stripe_helper.create_plan(id: 'silver', product: { name: 'Silver Plan' },
|
122
|
-
amount: 4999)
|
123
|
-
|
124
162
|
customer = Stripe::Customer.create(source: gen_card_tk)
|
125
|
-
Stripe::Subscription.create({ plan:
|
163
|
+
Stripe::Subscription.create({ plan: plan.id, customer: customer.id, metadata: { foo: "bar", example: "yes" } })
|
126
164
|
customer = Stripe::Customer.retrieve(customer.id)
|
165
|
+
charges = Stripe::Charge.list(customer: customer.id)
|
127
166
|
|
128
|
-
expect(
|
129
|
-
expect(
|
167
|
+
expect(charges.data.length).to eq(1)
|
168
|
+
expect(charges.data.first.amount).to eq(4999)
|
130
169
|
end
|
131
170
|
|
132
171
|
it 'contains coupon object', live: true do
|
133
|
-
plan = stripe_helper.create_plan(id: 'plan_with_coupon', product: { name: 'One More Test Plan' },
|
134
|
-
amount: 777)
|
135
172
|
coupon = stripe_helper.create_coupon(id: 'free_coupon', duration: 'repeating', duration_in_months: 3)
|
136
173
|
customer = Stripe::Customer.create(source: gen_card_tk)
|
137
174
|
Stripe::Subscription.create(plan: plan.id, customer: customer.id, coupon: coupon.id)
|
138
175
|
customer = Stripe::Customer.retrieve(customer.id)
|
139
176
|
|
140
|
-
|
141
|
-
|
142
|
-
expect(
|
143
|
-
expect(
|
144
|
-
expect(
|
177
|
+
subscriptions = Stripe::Subscription.list(customer: customer.id)
|
178
|
+
|
179
|
+
expect(subscriptions.data).to be_a(Array)
|
180
|
+
expect(subscriptions.data.count).to eq(1)
|
181
|
+
expect(subscriptions.data.first.discount).not_to be_nil
|
182
|
+
expect(subscriptions.data.first.discount).to be_a(Stripe::Discount)
|
183
|
+
expect(subscriptions.data.first.discount.coupon.id).to eq(coupon.id)
|
145
184
|
end
|
146
185
|
|
147
186
|
it 'when coupon is not exist', live: true do
|
148
|
-
plan = stripe_helper.create_plan(id: 'plan_with_coupon', product: { name: 'One More Test Plan' },
|
149
|
-
amount: 777)
|
150
187
|
customer = Stripe::Customer.create(source: gen_card_tk)
|
151
188
|
|
152
|
-
expect {
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
189
|
+
expect {
|
190
|
+
Stripe::Subscription.create(plan: plan.id, customer: customer.id, coupon: 'none')
|
191
|
+
}.to raise_error {|e|
|
192
|
+
expect(e).to be_a Stripe::InvalidRequestError
|
193
|
+
expect(e.http_status).to eq(400)
|
194
|
+
expect(e.message).to eq('No such coupon: none')
|
195
|
+
}
|
157
196
|
end
|
158
197
|
|
159
198
|
it "correctly sets quantity, application_fee_percent and tax_percent" do
|
160
|
-
Stripe::Plan.create(
|
161
|
-
:amount => 2500,
|
162
|
-
:interval => 'month',
|
163
|
-
:product => {
|
164
|
-
:name => 'Test plan'
|
165
|
-
},
|
166
|
-
:currency => 'usd',
|
167
|
-
:id => 'silver',
|
168
|
-
:statement_description => "testPlan"
|
169
|
-
)
|
170
199
|
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk)
|
171
200
|
|
172
201
|
subscription = Stripe::Subscription.create({
|
173
|
-
plan:
|
202
|
+
plan: plan.id,
|
203
|
+
customer: customer.id,
|
204
|
+
quantity: 2,
|
205
|
+
application_fee_percent: 10,
|
206
|
+
tax_percent: 20
|
207
|
+
})
|
174
208
|
expect(subscription.quantity).to eq(2)
|
175
209
|
expect(subscription.application_fee_percent).to eq(10)
|
176
210
|
expect(subscription.tax_percent).to eq(20)
|
177
211
|
end
|
178
212
|
|
213
|
+
it "correctly sets pending invoice item interval" do
|
214
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk)
|
215
|
+
|
216
|
+
subscription = Stripe::Subscription.create({
|
217
|
+
plan: plan.id,
|
218
|
+
customer: customer.id,
|
219
|
+
quantity: 2,
|
220
|
+
pending_invoice_item_interval: { interval: 'month', interval_count: 1 }
|
221
|
+
})
|
222
|
+
|
223
|
+
expect(subscription.pending_invoice_item_interval.interval).to eq 'month'
|
224
|
+
expect(subscription.pending_invoice_item_interval.interval_count).to eq 1
|
225
|
+
end
|
226
|
+
|
179
227
|
it "correctly sets created when it's not provided as a parameter", live: true do
|
180
228
|
customer = Stripe::Customer.create(source: gen_card_tk)
|
181
|
-
|
182
|
-
amount: 4999, currency: 'usd')
|
183
|
-
subscription = Stripe::Subscription.create({ plan: 'silver', customer: customer.id })
|
229
|
+
subscription = Stripe::Subscription.create({ plan: plan.id, customer: customer.id })
|
184
230
|
|
185
231
|
expect(subscription.created).to eq(subscription.current_period_start)
|
186
232
|
end
|
187
233
|
|
188
234
|
it "correctly sets created when it's provided as a parameter" do
|
189
235
|
customer = Stripe::Customer.create(source: gen_card_tk)
|
190
|
-
|
191
|
-
amount: 4999, currency: 'usd')
|
192
|
-
subscription = Stripe::Subscription.create({ plan: 'silver', customer: customer.id, created: 1473576318 })
|
236
|
+
subscription = Stripe::Subscription.create({ plan: plan.id, customer: customer.id, created: 1473576318 })
|
193
237
|
|
194
238
|
expect(subscription.created).to eq(1473576318)
|
195
239
|
end
|
196
240
|
|
197
241
|
it "adds additional subscription to customer with existing subscription" do
|
198
|
-
silver = stripe_helper.create_plan(id: 'silver')
|
199
|
-
gold = stripe_helper.create_plan(id: 'gold')
|
200
|
-
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: 'gold')
|
242
|
+
silver = stripe_helper.create_plan(id: 'silver', product: product.id)
|
243
|
+
gold = stripe_helper.create_plan(id: 'gold', product: product.id)
|
244
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', product: product.id, source: gen_card_tk, plan: 'gold')
|
201
245
|
|
202
246
|
sub = Stripe::Subscription.create({ plan: 'silver', customer: customer.id })
|
203
247
|
|
@@ -218,7 +262,7 @@ shared_examples 'Customer Subscriptions' do
|
|
218
262
|
end
|
219
263
|
|
220
264
|
it "subscribes a cardless customer when specifing a card token" do
|
221
|
-
plan = stripe_helper.create_plan(id: 'enterprise', amount: 499)
|
265
|
+
plan = stripe_helper.create_plan(id: 'enterprise', product: product.id, amount: 499)
|
222
266
|
customer = Stripe::Customer.create(id: 'cardless')
|
223
267
|
|
224
268
|
sub = Stripe::Subscription.create(plan: 'enterprise', customer: customer.id, source: gen_card_tk)
|
@@ -247,10 +291,10 @@ shared_examples 'Customer Subscriptions' do
|
|
247
291
|
end
|
248
292
|
|
249
293
|
it "throws an error when subscribing a customer with no card" do
|
250
|
-
plan = stripe_helper.create_plan(id: 'enterprise', amount: 499)
|
294
|
+
plan = stripe_helper.create_plan(id: 'enterprise', product: product.id, amount: 499)
|
251
295
|
customer = Stripe::Customer.create(id: 'cardless')
|
252
296
|
|
253
|
-
expect { Stripe::Subscription.create({ plan:
|
297
|
+
expect { Stripe::Subscription.create({ plan: plan.id, customer: customer.id }) }.to raise_error {|e|
|
254
298
|
expect(e).to be_a Stripe::InvalidRequestError
|
255
299
|
expect(e.http_status).to eq(400)
|
256
300
|
expect(e.message).to_not be_nil
|
@@ -261,12 +305,14 @@ shared_examples 'Customer Subscriptions' do
|
|
261
305
|
end
|
262
306
|
|
263
307
|
it "throws an error when subscribing the customer to a second plan in a different currency" do
|
264
|
-
usd_plan = stripe_helper.create_plan(id: 'enterprise_usd', amount: 499, currency: 'usd')
|
265
308
|
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk)
|
266
|
-
usd_subscription = Stripe::Subscription.create({ plan: 'enterprise_usd', customer: customer.id })
|
267
309
|
|
268
|
-
|
269
|
-
|
310
|
+
expect(plan.currency).to eql("usd")
|
311
|
+
usd_subscription = Stripe::Subscription.create({ plan: plan.id, customer: customer.id })
|
312
|
+
|
313
|
+
eur_plan = stripe_helper.create_plan(plan_attrs.merge(id: "plan_EURO", currency: 'eur'))
|
314
|
+
expect(eur_plan.currency).to eql("eur")
|
315
|
+
expect { Stripe::Subscription.create({ plan: eur_plan.id, customer: customer.id }) }.to raise_error {|e|
|
270
316
|
expect(e).to be_a Stripe::InvalidRequestError
|
271
317
|
expect(e.http_status).to eq(400)
|
272
318
|
expect(e.message).to_not be_nil
|
@@ -274,7 +320,7 @@ shared_examples 'Customer Subscriptions' do
|
|
274
320
|
end
|
275
321
|
|
276
322
|
it 'when attempting to create a new subscription with the params trial', live: true do
|
277
|
-
plan = stripe_helper.create_plan(id: 'trial', amount: 999)
|
323
|
+
plan = stripe_helper.create_plan(id: 'trial', product: product.id, amount: 999)
|
278
324
|
customer = Stripe::Customer.create(source: gen_card_tk)
|
279
325
|
|
280
326
|
expect{ Stripe::Subscription.create(plan: plan.id, customer: customer.id, trial: 10) }.to raise_error {|e|
|
@@ -286,35 +332,34 @@ shared_examples 'Customer Subscriptions' do
|
|
286
332
|
end
|
287
333
|
|
288
334
|
it "subscribes a customer with no card to a plan with a free trial" do
|
289
|
-
plan = stripe_helper.create_plan(id: 'trial', amount: 999, trial_period_days: 14)
|
290
335
|
customer = Stripe::Customer.create(id: 'cardless')
|
291
|
-
|
292
|
-
sub = Stripe::Subscription.create({ plan: 'trial', customer: customer.id })
|
336
|
+
sub = Stripe::Subscription.create({ plan: plan_with_trial.id, customer: customer.id })
|
293
337
|
|
294
338
|
expect(sub.object).to eq('subscription')
|
295
|
-
expect(sub.plan.to_hash).to eq(
|
339
|
+
expect(sub.plan.to_hash).to eq(plan_with_trial.to_hash)
|
296
340
|
expect(sub.trial_end - sub.trial_start).to eq(14 * 86400)
|
297
341
|
expect(sub.billing_cycle_anchor).to be_nil
|
298
342
|
|
299
|
-
customer = Stripe::Customer.retrieve(
|
300
|
-
|
301
|
-
|
302
|
-
expect(customer.subscriptions.data.length).to eq(1)
|
343
|
+
customer = Stripe::Customer.retrieve(customer.id)
|
344
|
+
subscriptions = Stripe::Subscription.list(customer: customer.id)
|
345
|
+
charges = Stripe::Charge.list(customer: customer.id)
|
303
346
|
|
304
|
-
expect(
|
305
|
-
expect(
|
306
|
-
expect(
|
307
|
-
|
347
|
+
expect(subscriptions.data).to_not be_empty
|
348
|
+
expect(subscriptions.count).to eq(1)
|
349
|
+
expect(subscriptions.data.length).to eq(1)
|
350
|
+
|
351
|
+
expect(subscriptions.data.first.id).to eq(sub.id)
|
352
|
+
expect(subscriptions.data.first.plan.to_hash).to eq(plan_with_trial.to_hash)
|
353
|
+
expect(subscriptions.data.first.customer).to eq(customer.id)
|
354
|
+
expect(charges.count).to eq(0)
|
308
355
|
end
|
309
356
|
|
310
357
|
it "subscribes a customer with no card to a plan with a free trial with plan as item" do
|
311
|
-
plan = stripe_helper.create_plan(id: 'trial', amount: 999, trial_period_days: 14)
|
312
358
|
customer = Stripe::Customer.create(id: 'cardless')
|
313
|
-
|
314
|
-
sub = Stripe::Subscription.create({ items: [ { plan: 'trial' } ], customer: customer.id })
|
359
|
+
sub = Stripe::Subscription.create({ items: [ { plan: plan_with_trial.id } ], customer: customer.id })
|
315
360
|
|
316
361
|
expect(sub.object).to eq('subscription')
|
317
|
-
expect(sub.items.data[0].plan.to_hash).to eq(
|
362
|
+
expect(sub.items.data[0].plan.to_hash).to eq(plan_with_trial.to_hash)
|
318
363
|
# no idea how to fix this one
|
319
364
|
# expect(sub.trial_end - sub.trial_start).to eq(14 * 86400)
|
320
365
|
|
@@ -324,17 +369,17 @@ shared_examples 'Customer Subscriptions' do
|
|
324
369
|
expect(customer.subscriptions.data.length).to eq(1)
|
325
370
|
|
326
371
|
expect(customer.subscriptions.data.first.id).to eq(sub.id)
|
327
|
-
expect(customer.subscriptions.data.first.items.data.first.plan.to_hash).to eq(
|
372
|
+
expect(customer.subscriptions.data.first.items.data.first.plan.to_hash).to eq(plan_with_trial.to_hash)
|
328
373
|
expect(customer.subscriptions.data.first.customer).to eq(customer.id)
|
329
374
|
# No idea on this one
|
330
375
|
# expect(customer.charges.count).to eq(0)
|
331
376
|
end
|
332
377
|
|
333
378
|
it "subscribes a customer with no card to a free plan" do
|
334
|
-
plan = stripe_helper.create_plan(id: 'free_tier', amount: 0)
|
379
|
+
plan = stripe_helper.create_plan(id: 'free_tier', product: product.id, amount: 0)
|
335
380
|
customer = Stripe::Customer.create(id: 'cardless')
|
336
381
|
|
337
|
-
sub = Stripe::Subscription.create({ plan:
|
382
|
+
sub = Stripe::Subscription.create({ plan: plan.id, customer: customer.id })
|
338
383
|
|
339
384
|
expect(sub.object).to eq('subscription')
|
340
385
|
expect(sub.plan.to_hash).to eq(plan.to_hash)
|
@@ -350,36 +395,59 @@ shared_examples 'Customer Subscriptions' do
|
|
350
395
|
end
|
351
396
|
|
352
397
|
it "overrides trial length when trial end is set" do
|
353
|
-
plan = stripe_helper.create_plan(id: 'trial', amount: 999, trial_period_days: 14)
|
354
398
|
customer = Stripe::Customer.create(id: 'short_trial')
|
355
399
|
trial_end = Time.now.utc.to_i + 3600
|
356
400
|
|
357
|
-
sub = Stripe::Subscription.create({ plan:
|
401
|
+
sub = Stripe::Subscription.create({ plan: plan_with_trial.id, customer: customer.id, trial_end: trial_end })
|
402
|
+
|
403
|
+
expect(sub.object).to eq('subscription')
|
404
|
+
expect(sub.plan.to_hash).to eq(plan_with_trial.to_hash)
|
405
|
+
expect(sub.current_period_end).to eq(trial_end)
|
406
|
+
expect(sub.trial_end).to eq(trial_end)
|
407
|
+
end
|
408
|
+
|
409
|
+
it "does not override trial end when trial end is not set" do
|
410
|
+
product = stripe_helper.create_product(name: 'Trial')
|
411
|
+
plan = stripe_helper.create_plan(id: 'trial', amount: 999,
|
412
|
+
trial_period_days: 14, product: product.id)
|
413
|
+
customer = Stripe::Customer.create(id: 'short_trial')
|
414
|
+
trial_end = Time.now.utc.to_i + 3600
|
415
|
+
metadata = {description: 'original description'}
|
416
|
+
|
417
|
+
sub = Stripe::Subscription.create({ plan: 'trial', customer: customer.id, trial_end: trial_end, metadata: metadata })
|
358
418
|
|
359
419
|
expect(sub.object).to eq('subscription')
|
360
420
|
expect(sub.plan.to_hash).to eq(plan.to_hash)
|
361
421
|
expect(sub.current_period_end).to eq(trial_end)
|
362
422
|
expect(sub.trial_end).to eq(trial_end)
|
423
|
+
expect(sub.metadata.description).to eq(metadata[:description])
|
424
|
+
|
425
|
+
metadata = {description: 'updated description'}
|
426
|
+
sub = Stripe::Subscription.update(sub.id, { metadata: metadata })
|
427
|
+
|
428
|
+
expect(sub.object).to eq('subscription')
|
429
|
+
expect(sub.plan.to_hash).to eq(plan.to_hash)
|
430
|
+
expect(sub.current_period_end).to eq(trial_end)
|
431
|
+
expect(sub.trial_end).to eq(trial_end) # check that the trial_end has NOT changed
|
432
|
+
expect(sub.metadata.description).to eq(metadata[:description]) # check that the description has changed
|
363
433
|
end
|
364
434
|
|
365
435
|
it "returns without a trial when trial_end is set to 'now'" do
|
366
|
-
plan = stripe_helper.create_plan(id: 'trial', amount: 999, trial_period_days: 14)
|
367
436
|
customer = Stripe::Customer.create(id: 'no_trial', source: gen_card_tk)
|
368
437
|
|
369
|
-
sub = Stripe::Subscription.create({ plan:
|
438
|
+
sub = Stripe::Subscription.create({ plan: plan_with_trial.id, customer: customer.id, trial_end: "now" })
|
370
439
|
|
371
440
|
expect(sub.object).to eq('subscription')
|
372
|
-
expect(sub.plan.to_hash).to eq(
|
441
|
+
expect(sub.plan.to_hash).to eq(plan_with_trial.to_hash)
|
373
442
|
expect(sub.status).to eq('active')
|
374
443
|
expect(sub.trial_start).to be_nil
|
375
444
|
expect(sub.trial_end).to be_nil
|
376
445
|
end
|
377
446
|
|
378
447
|
it "raises error when trial_end is not an integer or 'now'" do
|
379
|
-
plan = stripe_helper.create_plan(id: 'trial', amount: 999, trial_period_days: 14)
|
380
448
|
customer = Stripe::Customer.create(id: 'cus_trial')
|
381
449
|
|
382
|
-
expect { Stripe::Subscription.create({ plan:
|
450
|
+
expect { Stripe::Subscription.create({ plan: plan_with_trial.id, customer: customer.id, trial_end: "gazebo" }) }.to raise_error {|e|
|
383
451
|
expect(e).to be_a Stripe::InvalidRequestError
|
384
452
|
expect(e.http_status).to eq(400)
|
385
453
|
expect(e.message).to eq("Invalid timestamp: must be an integer")
|
@@ -387,11 +455,10 @@ shared_examples 'Customer Subscriptions' do
|
|
387
455
|
end
|
388
456
|
|
389
457
|
it "raises error when trial_end is set to a time in the past" do
|
390
|
-
plan = stripe_helper.create_plan(id: 'trial', amount: 999, trial_period_days: 14)
|
391
458
|
customer = Stripe::Customer.create(id: 'past_trial')
|
392
459
|
trial_end = Time.now.utc.to_i - 3600
|
393
460
|
|
394
|
-
expect { Stripe::Subscription.create({ plan:
|
461
|
+
expect { Stripe::Subscription.create({ plan: plan_with_trial.id, customer: customer.id, trial_end: trial_end }) }.to raise_error {|e|
|
395
462
|
expect(e).to be_a Stripe::InvalidRequestError
|
396
463
|
expect(e.http_status).to eq(400)
|
397
464
|
expect(e.message).to eq("Invalid timestamp: must be an integer Unix timestamp in the future")
|
@@ -399,11 +466,10 @@ shared_examples 'Customer Subscriptions' do
|
|
399
466
|
end
|
400
467
|
|
401
468
|
it "raises error when trial_end is set to a time more than five years in the future" do
|
402
|
-
plan = stripe_helper.create_plan(id: 'trial', amount: 999, trial_period_days: 14)
|
403
469
|
customer = Stripe::Customer.create(id: 'long_trial')
|
404
470
|
trial_end = Time.now.utc.to_i + 31557600*5 + 3600 # 5 years + 1 hour
|
405
471
|
|
406
|
-
expect { Stripe::Subscription.create({ plan:
|
472
|
+
expect { Stripe::Subscription.create({ plan: plan_with_trial.id, customer: customer.id, trial_end: trial_end }) }.to raise_error {|e|
|
407
473
|
expect(e).to be_a Stripe::InvalidRequestError
|
408
474
|
expect(e.http_status).to eq(400)
|
409
475
|
expect(e.message).to eq("Invalid timestamp: can be no more than five years in the future")
|
@@ -411,11 +477,10 @@ shared_examples 'Customer Subscriptions' do
|
|
411
477
|
end
|
412
478
|
|
413
479
|
it 'overrides current period end when billing cycle anchor is set' do
|
414
|
-
plan = stripe_helper.create_plan(id: 'plan', amount: 999)
|
415
480
|
customer = Stripe::Customer.create(source: gen_card_tk)
|
416
481
|
billing_cycle_anchor = Time.now.utc.to_i + 3600
|
417
482
|
|
418
|
-
sub = Stripe::Subscription.create({ plan:
|
483
|
+
sub = Stripe::Subscription.create({ plan: plan.id, customer: customer.id, billing_cycle_anchor: billing_cycle_anchor })
|
419
484
|
|
420
485
|
expect(sub.status).to eq('active')
|
421
486
|
expect(sub.current_period_end).to eq(billing_cycle_anchor)
|
@@ -423,17 +488,11 @@ shared_examples 'Customer Subscriptions' do
|
|
423
488
|
end
|
424
489
|
|
425
490
|
it 'when plan defined inside items', live: true do
|
426
|
-
plan = stripe_helper.create_plan(id: 'BASE_PRICE_PLAN1')
|
491
|
+
plan = stripe_helper.create_plan(id: 'BASE_PRICE_PLAN1', product: product.id)
|
427
492
|
|
428
|
-
plan2 = stripe_helper.create_plan(id: 'PER_USER_PLAN1')
|
493
|
+
plan2 = stripe_helper.create_plan(id: 'PER_USER_PLAN1', product: product.id)
|
429
494
|
customer = Stripe::Customer.create(
|
430
|
-
source:
|
431
|
-
object: 'card',
|
432
|
-
exp_month: 11,
|
433
|
-
exp_year: 2019,
|
434
|
-
number: '4242424242424242',
|
435
|
-
cvc: '123'
|
436
|
-
}
|
495
|
+
source: stripe_helper.generate_card_token
|
437
496
|
)
|
438
497
|
subscription = Stripe::Subscription.create(
|
439
498
|
customer: customer.id,
|
@@ -452,9 +511,9 @@ shared_examples 'Customer Subscriptions' do
|
|
452
511
|
end
|
453
512
|
|
454
513
|
it 'when plan defined inside items for trials with no card', live: true do
|
455
|
-
plan = stripe_helper.create_plan(id: 'BASE_PRICE_PLAN1')
|
514
|
+
plan = stripe_helper.create_plan(id: 'BASE_PRICE_PLAN1', product: product.id)
|
456
515
|
|
457
|
-
plan2 = stripe_helper.create_plan(id: 'PER_USER_PLAN1')
|
516
|
+
plan2 = stripe_helper.create_plan(id: 'PER_USER_PLAN1', product: product.id)
|
458
517
|
customer = Stripe::Customer.create
|
459
518
|
trial_end = Time.now.utc.to_i + 3600
|
460
519
|
|
@@ -472,12 +531,113 @@ shared_examples 'Customer Subscriptions' do
|
|
472
531
|
expect(subscription.items.data[0].plan.id).to eq plan.id
|
473
532
|
expect(subscription.items.data[1].plan.id).to eq plan2.id
|
474
533
|
end
|
534
|
+
|
535
|
+
it 'add a new subscription to bill via an invoice' do
|
536
|
+
product = stripe_helper.create_product(id: 'invoice_billing')
|
537
|
+
plan = stripe_helper.create_plan(id: 'silver', product: product.id,
|
538
|
+
amount: 4999, currency: 'usd')
|
539
|
+
customer = Stripe::Customer.create(id: 'cardless')
|
540
|
+
|
541
|
+
expect(customer.subscriptions.data).to be_empty
|
542
|
+
expect(customer.subscriptions.count).to eq(0)
|
543
|
+
|
544
|
+
sub = Stripe::Subscription.create({
|
545
|
+
plan: 'silver',
|
546
|
+
customer: customer.id,
|
547
|
+
metadata: { foo: 'bar', example: 'yes' },
|
548
|
+
billing: 'send_invoice',
|
549
|
+
days_until_due: 30,
|
550
|
+
})
|
551
|
+
|
552
|
+
expect(sub.object).to eq('subscription')
|
553
|
+
expect(sub.plan.to_hash).to eq(plan.to_hash)
|
554
|
+
expect(sub.billing).to eq 'send_invoice'
|
555
|
+
expect(sub.days_until_due).to eq 30
|
556
|
+
end
|
557
|
+
|
558
|
+
let(:subscription_header) {{
|
559
|
+
:idempotency_key => SecureRandom.hex
|
560
|
+
}}
|
561
|
+
|
562
|
+
it "adds a new subscription to customer with identical idempotency key" do
|
563
|
+
product = stripe_helper.create_product(name: 'Silver Product')
|
564
|
+
plan = stripe_helper.create_plan(id: 'silver', product: product.id,
|
565
|
+
amount: 4999, currency: 'usd')
|
566
|
+
customer = Stripe::Customer.create(source: gen_card_tk)
|
567
|
+
|
568
|
+
expect(customer.subscriptions.data).to be_empty
|
569
|
+
expect(customer.subscriptions.count).to eq(0)
|
570
|
+
|
571
|
+
subscription_header = {
|
572
|
+
:idempotency_key => "uniq_idempotency_key_#{customer.id}"
|
573
|
+
}
|
574
|
+
|
575
|
+
sub1 = Stripe::Subscription.create({ items: [{ plan: 'silver' }], customer: customer.id }, subscription_header)
|
576
|
+
sub2 = Stripe::Subscription.create({ items: [{ plan: 'silver' }], customer: customer.id }, subscription_header)
|
577
|
+
expect(sub1).to eq(sub2)
|
578
|
+
end
|
579
|
+
|
580
|
+
it "adds a new subscription to customer with different idempotency key", live: true do
|
581
|
+
product = stripe_helper.create_product(name: 'Silver Product')
|
582
|
+
plan = stripe_helper.create_plan(id: 'silver', product: product.id,
|
583
|
+
amount: 4999, currency: 'usd')
|
584
|
+
customer = Stripe::Customer.create(source: gen_card_tk)
|
585
|
+
|
586
|
+
expect(customer.subscriptions.data).to be_empty
|
587
|
+
expect(customer.subscriptions.count).to eq(0)
|
588
|
+
|
589
|
+
sub_header_1 = {
|
590
|
+
:idempotency_key => SecureRandom.hex
|
591
|
+
}
|
592
|
+
sub_header_2 = {
|
593
|
+
:idempotency_key => SecureRandom.hex
|
594
|
+
}
|
595
|
+
|
596
|
+
sub1 = Stripe::Subscription.create({ items: [{ plan: 'silver' }], customer: customer.id }, sub_header_1)
|
597
|
+
sub2 = Stripe::Subscription.create({ items: [{ plan: 'silver' }], customer: customer.id }, sub_header_2)
|
598
|
+
expect(sub1).not_to eq(sub2)
|
599
|
+
end
|
600
|
+
|
601
|
+
it "accepts a hash of items" do
|
602
|
+
product = stripe_helper.create_product(name: 'Silver Product')
|
603
|
+
silver = stripe_helper.create_plan(id: 'silver', product: product.id)
|
604
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk)
|
605
|
+
|
606
|
+
sub = Stripe::Subscription.create({ items: { '0' => { plan: 'silver' } }, customer: customer.id })
|
607
|
+
sub.delete(at_period_end: true)
|
608
|
+
|
609
|
+
expect(sub.cancel_at_period_end).to be_truthy
|
610
|
+
expect(sub.save).to be_truthy
|
611
|
+
expect(sub.cancel_at_period_end).to be_truthy
|
612
|
+
end
|
613
|
+
|
614
|
+
it 'accepts default_tax_rates param' do
|
615
|
+
tax_rate = Stripe::TaxRate.create(
|
616
|
+
display_name: 'VAT',
|
617
|
+
description: 'VAT Germany',
|
618
|
+
jurisdiction: 'DE',
|
619
|
+
percentage: 19.0,
|
620
|
+
inclusive: false,
|
621
|
+
)
|
622
|
+
product = stripe_helper.create_product(name: 'Silver Product')
|
623
|
+
silver = stripe_helper.create_plan(id: 'silver', product: product.id)
|
624
|
+
customer = Stripe::Customer.create(source: gen_card_tk)
|
625
|
+
subscription = Stripe::Subscription.create(
|
626
|
+
customer: customer.id,
|
627
|
+
items: [{ plan: silver.id }],
|
628
|
+
default_tax_rates: [ tax_rate ]
|
629
|
+
)
|
630
|
+
|
631
|
+
aggregate_failures do
|
632
|
+
expect(subscription.default_tax_rates.length).to eq(1)
|
633
|
+
expect(subscription.default_tax_rates.first.id).to eq(tax_rate.id)
|
634
|
+
end
|
635
|
+
end
|
475
636
|
end
|
476
637
|
|
477
638
|
context "updating a subscription" do
|
478
639
|
it 'raises invalid request exception when subscription is cancelled' do
|
479
|
-
|
480
|
-
customer = Stripe::Customer.create(source: gen_card_tk, plan: 'the truth')
|
640
|
+
customer = Stripe::Customer.create(source: gen_card_tk, plan: plan.id)
|
481
641
|
|
482
642
|
subscription = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
483
643
|
subscription.delete
|
@@ -490,24 +650,22 @@ shared_examples 'Customer Subscriptions' do
|
|
490
650
|
end
|
491
651
|
|
492
652
|
it "updates a stripe customer's existing subscription with one plan inside items" do
|
493
|
-
silver = stripe_helper.create_plan(id: 'silver')
|
494
653
|
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk)
|
495
654
|
|
496
|
-
sub = Stripe::Subscription.create({ items: [ { plan:
|
655
|
+
sub = Stripe::Subscription.create({ items: [ { plan: plan.id } ], customer: customer.id })
|
497
656
|
sub.delete(at_period_end: true)
|
498
657
|
|
499
658
|
expect(sub.cancel_at_period_end).to be_truthy
|
500
659
|
expect(sub.save).to be_truthy
|
501
|
-
expect(sub.cancel_at_period_end).to
|
660
|
+
expect(sub.cancel_at_period_end).to be_truthy
|
502
661
|
end
|
503
662
|
|
504
663
|
it "updates a stripe customer's existing subscription when plan inside of items" do
|
505
|
-
|
506
|
-
gold = stripe_helper.create_plan(id: 'gold')
|
507
|
-
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: 'silver')
|
664
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: plan.id)
|
508
665
|
|
666
|
+
gold_plan = stripe_helper.create_plan(id: 'gold', product: product.id)
|
509
667
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
510
|
-
sub.plan =
|
668
|
+
sub.plan = gold_plan.id
|
511
669
|
sub.quantity = 5
|
512
670
|
sub.metadata.foo = "bar"
|
513
671
|
sub.metadata.example = "yes"
|
@@ -515,7 +673,7 @@ shared_examples 'Customer Subscriptions' do
|
|
515
673
|
expect(sub.save).to be_truthy
|
516
674
|
|
517
675
|
expect(sub.object).to eq('subscription')
|
518
|
-
expect(sub.plan.to_hash).to eq(
|
676
|
+
expect(sub.plan.to_hash).to eq(gold_plan.to_hash)
|
519
677
|
expect(sub.quantity).to eq(5)
|
520
678
|
expect(sub.metadata.foo).to eq( "bar" )
|
521
679
|
expect(sub.metadata.example).to eq( "yes" )
|
@@ -526,16 +684,15 @@ shared_examples 'Customer Subscriptions' do
|
|
526
684
|
expect(customer.subscriptions.data.length).to eq(1)
|
527
685
|
|
528
686
|
expect(customer.subscriptions.data.first.id).to eq(sub.id)
|
529
|
-
expect(customer.subscriptions.data.first.plan.to_hash).to eq(
|
687
|
+
expect(customer.subscriptions.data.first.plan.to_hash).to eq(gold_plan.to_hash)
|
530
688
|
expect(customer.subscriptions.data.first.customer).to eq(customer.id)
|
531
689
|
end
|
532
690
|
|
533
691
|
it "updates a stripe customer's existing subscription with single plan when multiple plans inside of items" do
|
534
|
-
|
535
|
-
gold_plan = stripe_helper.create_plan(id: 'gold')
|
536
|
-
addon_plan = stripe_helper.create_plan(id: 'addon_plan')
|
537
|
-
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: silver_plan.id)
|
692
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: plan.id)
|
538
693
|
|
694
|
+
gold_plan = stripe_helper.create_plan(id: 'gold', product: product.id)
|
695
|
+
addon_plan = stripe_helper.create_plan(id: 'addon_plan', product: product.id)
|
539
696
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
540
697
|
sub.items = [{ plan: gold_plan.id, quantity: 2 }, { plan: addon_plan.id, quantity: 2 }]
|
541
698
|
expect(sub.save).to be_truthy
|
@@ -556,12 +713,12 @@ shared_examples 'Customer Subscriptions' do
|
|
556
713
|
end
|
557
714
|
|
558
715
|
it "updates a stripe customer's existing subscription with multple plans when multiple plans inside of items" do
|
559
|
-
silver_plan = stripe_helper.create_plan(id: 'silver')
|
560
|
-
gold_plan = stripe_helper.create_plan(id: 'gold')
|
561
|
-
addon1_plan = stripe_helper.create_plan(id: 'addon1')
|
562
|
-
addon2_plan = stripe_helper.create_plan(id: 'addon2')
|
563
716
|
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk)
|
564
|
-
|
717
|
+
addon1_plan = stripe_helper.create_plan(id: 'addon1', product: product.id)
|
718
|
+
sub = Stripe::Subscription.create(customer: customer.id, items: [{ plan: plan.id }, { plan: addon1_plan.id }])
|
719
|
+
|
720
|
+
gold_plan = stripe_helper.create_plan(id: 'gold', product: product.id)
|
721
|
+
addon2_plan = stripe_helper.create_plan(id: 'addon2', product: product.id)
|
565
722
|
|
566
723
|
sub.items = [{ plan: gold_plan.id, quantity: 2 }, { plan: addon2_plan.id, quantity: 2 }]
|
567
724
|
expect(sub.save).to be_truthy
|
@@ -581,9 +738,87 @@ shared_examples 'Customer Subscriptions' do
|
|
581
738
|
expect(customer.subscriptions.data.first.items.data[1].plan.to_hash).to eq(addon2_plan.to_hash)
|
582
739
|
end
|
583
740
|
|
741
|
+
it "updates a subscription's cancel_at_period_end" do
|
742
|
+
silver = stripe_helper.create_plan(id: 'silver', product: product.id)
|
743
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk)
|
744
|
+
|
745
|
+
sub = Stripe::Subscription.create({ items: [ { plan: 'silver' } ], customer: customer.id })
|
746
|
+
|
747
|
+
expect(sub.cancel_at_period_end).to be_falsey
|
748
|
+
|
749
|
+
sub.cancel_at_period_end = true
|
750
|
+
sub.save
|
751
|
+
|
752
|
+
expect(sub.save).to be_truthy
|
753
|
+
expect(sub.cancel_at_period_end).to be_truthy
|
754
|
+
expect(sub.canceled_at).to be_truthy
|
755
|
+
|
756
|
+
sub.cancel_at_period_end = false
|
757
|
+
sub.save
|
758
|
+
|
759
|
+
expect(sub.save).to be_truthy
|
760
|
+
expect(sub.cancel_at_period_end).to be_falsey
|
761
|
+
expect(sub.canceled_at).to be_falsey
|
762
|
+
end
|
763
|
+
|
764
|
+
it "updates a subscription's pending invoice item interval" do
|
765
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk)
|
766
|
+
|
767
|
+
subscription = Stripe::Subscription.create({
|
768
|
+
plan: plan.id,
|
769
|
+
customer: customer.id,
|
770
|
+
quantity: 2,
|
771
|
+
pending_invoice_item_interval: { interval: 'month', interval_count: 1 }
|
772
|
+
})
|
773
|
+
|
774
|
+
expect(subscription.pending_invoice_item_interval.interval).to eq 'month'
|
775
|
+
expect(subscription.pending_invoice_item_interval.interval_count).to eq 1
|
776
|
+
|
777
|
+
subscription.pending_invoice_item_interval = { interval: 'week', interval_count: 3 }
|
778
|
+
subscription.save
|
779
|
+
|
780
|
+
expect(subscription.pending_invoice_item_interval.interval).to eq 'week'
|
781
|
+
expect(subscription.pending_invoice_item_interval.interval_count).to eq 3
|
782
|
+
end
|
783
|
+
|
784
|
+
it "updates a subscription's default payment method" do
|
785
|
+
plan
|
786
|
+
customer = Stripe::Customer.create(source: gen_card_tk)
|
787
|
+
payment_method_card = Stripe::PaymentMethod.create(
|
788
|
+
type: 'card',
|
789
|
+
card: {
|
790
|
+
number: 4242_4242_4242_4242,
|
791
|
+
exp_month: 9,
|
792
|
+
exp_year: (Time.now.year + 5),
|
793
|
+
cvc: 999
|
794
|
+
}
|
795
|
+
)
|
796
|
+
payment_method_sepa = Stripe::PaymentMethod.create(
|
797
|
+
type: 'sepa_debit',
|
798
|
+
sepa_debit: {iban: 'DE89370400440532013000'},
|
799
|
+
)
|
800
|
+
subscription = Stripe::Subscription.create(
|
801
|
+
plan: 'silver',
|
802
|
+
customer: customer,
|
803
|
+
metadata: { foo: "bar", example: "yes" },
|
804
|
+
default_payment_method: payment_method_card.id,
|
805
|
+
)
|
806
|
+
|
807
|
+
subscriptions = Stripe::Subscription.list(customer: customer)
|
808
|
+
expect(subscriptions.data.first.default_payment_method).to eq(payment_method_card.id)
|
809
|
+
|
810
|
+
Stripe::Subscription.update(
|
811
|
+
subscription.id,
|
812
|
+
default_payment_method: payment_method_sepa.id,
|
813
|
+
collection_method: 'send_invoice',
|
814
|
+
)
|
815
|
+
|
816
|
+
subscriptions = Stripe::Subscription.list(customer: customer)
|
817
|
+
expect(subscriptions.data.first.collection_method).to eq('send_invoice')
|
818
|
+
expect(subscriptions.data.first.default_payment_method).to eq(payment_method_sepa.id)
|
819
|
+
end
|
820
|
+
|
584
821
|
it 'when adds coupon', live: true do
|
585
|
-
plan = stripe_helper.create_plan(id: 'plan_with_coupon2', product: { name: 'One More Test Plan' },
|
586
|
-
amount: 777)
|
587
822
|
coupon = stripe_helper.create_coupon
|
588
823
|
customer = Stripe::Customer.create(source: gen_card_tk, plan: plan.id)
|
589
824
|
subscription = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
@@ -592,13 +827,11 @@ shared_examples 'Customer Subscriptions' do
|
|
592
827
|
subscription.save
|
593
828
|
|
594
829
|
expect(subscription.discount).not_to be_nil
|
595
|
-
expect(subscription.discount).to
|
830
|
+
expect(subscription.discount).to be_a(Stripe::Discount)
|
596
831
|
expect(subscription.discount.coupon.id).to eq(coupon.id)
|
597
832
|
end
|
598
833
|
|
599
834
|
it 'when add not exist coupon' do
|
600
|
-
plan = stripe_helper.create_plan(id: 'plan_with_coupon3', product: { name: 'One More Test Plan' },
|
601
|
-
amount: 777)
|
602
835
|
customer = Stripe::Customer.create(source: gen_card_tk, plan: plan.id)
|
603
836
|
subscription = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
604
837
|
|
@@ -613,8 +846,6 @@ shared_examples 'Customer Subscriptions' do
|
|
613
846
|
end
|
614
847
|
|
615
848
|
it 'when coupon is removed' do
|
616
|
-
plan = stripe_helper.create_plan(id: 'plan_with_coupon3', product: { name: 'One More Test Plan' },
|
617
|
-
amount: 777)
|
618
849
|
customer = Stripe::Customer.create(source: gen_card_tk, plan: plan.id)
|
619
850
|
coupon = stripe_helper.create_coupon
|
620
851
|
subscription = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
@@ -628,8 +859,7 @@ shared_examples 'Customer Subscriptions' do
|
|
628
859
|
end
|
629
860
|
|
630
861
|
it "throws an error when plan does not exist" do
|
631
|
-
|
632
|
-
customer = Stripe::Customer.create(id: 'cardless', plan: 'free')
|
862
|
+
customer = Stripe::Customer.create(id: 'cardless', plan: free_plan.id)
|
633
863
|
|
634
864
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
635
865
|
sub.plan = 'gazebo'
|
@@ -643,75 +873,59 @@ shared_examples 'Customer Subscriptions' do
|
|
643
873
|
customer = Stripe::Customer.retrieve('cardless')
|
644
874
|
expect(customer.subscriptions.count).to eq(1)
|
645
875
|
expect(customer.subscriptions.data.length).to eq(1)
|
646
|
-
expect(customer.subscriptions.data.first.plan.to_hash).to eq(
|
876
|
+
expect(customer.subscriptions.data.first.plan.to_hash).to eq(free_plan.to_hash)
|
647
877
|
end
|
648
878
|
|
649
879
|
it "throws an error when subscription does not exist" do
|
650
|
-
|
651
|
-
|
652
|
-
|
653
|
-
expect { Stripe::Subscription.retrieve("gazebo") }.to raise_error {|e|
|
880
|
+
expect(stripe_helper.list_subscriptions(50).keys).to_not include("sub_NONEXIST")
|
881
|
+
expect { Stripe::Subscription.retrieve("sub_NONEXIST") }.to raise_error {|e|
|
654
882
|
expect(e).to be_a Stripe::InvalidRequestError
|
655
883
|
expect(e.http_status).to eq(404)
|
656
884
|
expect(e.message).to_not be_nil
|
657
885
|
}
|
658
|
-
|
659
|
-
customer = Stripe::Customer.retrieve('cardless')
|
660
|
-
expect(customer.subscriptions.count).to eq(1)
|
661
|
-
expect(customer.subscriptions.data.length).to eq(1)
|
662
|
-
expect(customer.subscriptions.data.first.plan.to_hash).to eq(free.to_hash)
|
663
886
|
end
|
664
887
|
|
665
888
|
[nil, 0].each do |trial_period_days|
|
666
|
-
it "
|
889
|
+
it "raises an error when updating a customer with no card, and plan trial_period_days = #{trial_period_days}", live: true do
|
667
890
|
begin
|
668
|
-
|
669
|
-
|
670
|
-
customer = Stripe::Customer.create(description: 'cardless', plan:
|
891
|
+
free_plan
|
892
|
+
paid_plan = stripe_helper.create_plan(id: 'enterprise', product: product.id, amount: 499, trial_period_days: trial_period_days)
|
893
|
+
customer = Stripe::Customer.create(description: 'cardless', plan: free_plan.id)
|
671
894
|
|
672
895
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
673
|
-
sub.plan =
|
674
|
-
|
675
|
-
expect {
|
676
|
-
|
677
|
-
|
678
|
-
expect(e.message).to_not be_nil
|
679
|
-
}
|
680
|
-
|
681
|
-
customer = Stripe::Customer.retrieve(customer.id)
|
682
|
-
expect(customer.subscriptions.count).to eq(1)
|
683
|
-
expect(customer.subscriptions.data.length).to eq(1)
|
684
|
-
expect(customer.subscriptions.data.first.plan.to_hash).to eq(free.to_hash)
|
896
|
+
sub.plan = paid_plan.id
|
897
|
+
|
898
|
+
expect {
|
899
|
+
sub.save
|
900
|
+
}.to raise_error(Stripe::InvalidRequestError, "This customer has no attached payment source")
|
685
901
|
ensure
|
686
902
|
customer.delete if customer
|
687
|
-
|
688
|
-
|
903
|
+
paid_plan.delete if paid_plan
|
904
|
+
free_plan.delete if free_plan
|
689
905
|
end
|
690
906
|
end
|
691
907
|
end
|
692
908
|
|
693
909
|
it 'updates a subscription if the customer has a free trial', live: true do
|
694
|
-
stripe_helper.create_plan(id: 'enterprise', amount: 499)
|
695
910
|
trial_end = Time.now.utc.to_i + 3600
|
696
|
-
customer
|
697
|
-
|
698
|
-
subscription = customer.subscriptions.first
|
911
|
+
customer = Stripe::Customer.create(plan: plan.id, trial_end: trial_end)
|
912
|
+
subscription = customer.subscriptions.first
|
699
913
|
subscription.quantity = 2
|
700
914
|
subscription.save
|
701
915
|
expect(subscription.quantity).to eq(2)
|
702
916
|
end
|
703
917
|
|
704
918
|
it "updates a customer with no card to a plan with a free trial" do
|
705
|
-
|
706
|
-
|
707
|
-
customer = Stripe::Customer.create(id: 'cardless', plan:
|
919
|
+
free_plan
|
920
|
+
trial_plan = stripe_helper.create_plan(id: 'trial', product: product.id, amount: 999, trial_period_days: 14)
|
921
|
+
customer = Stripe::Customer.create(id: 'cardless', plan: free_plan.id)
|
708
922
|
|
709
923
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
710
|
-
sub.plan =
|
924
|
+
sub.plan = trial_plan.id
|
711
925
|
sub.save
|
712
926
|
|
713
927
|
expect(sub.object).to eq('subscription')
|
714
|
-
expect(sub.plan.to_hash).to eq(
|
928
|
+
expect(sub.plan.to_hash).to eq(trial_plan.to_hash)
|
715
929
|
|
716
930
|
customer = Stripe::Customer.retrieve('cardless')
|
717
931
|
expect(customer.subscriptions.data).to_not be_empty
|
@@ -719,21 +933,21 @@ shared_examples 'Customer Subscriptions' do
|
|
719
933
|
expect(customer.subscriptions.data.length).to eq(1)
|
720
934
|
|
721
935
|
expect(customer.subscriptions.data.first.id).to eq(sub.id)
|
722
|
-
expect(customer.subscriptions.data.first.plan.to_hash).to eq(
|
936
|
+
expect(customer.subscriptions.data.first.plan.to_hash).to eq(trial_plan.to_hash)
|
723
937
|
expect(customer.subscriptions.data.first.customer).to eq(customer.id)
|
724
938
|
end
|
725
939
|
|
726
940
|
it "updates a customer with no card to a free plan" do
|
727
|
-
|
728
|
-
|
729
|
-
customer = Stripe::Customer.create(id: 'cardless', plan: 'free')
|
941
|
+
free_plan
|
942
|
+
customer = Stripe::Customer.create(id: 'cardless', product: product.id, plan: free_plan.id)
|
730
943
|
|
731
944
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
732
|
-
|
945
|
+
gratis_plan = stripe_helper.create_plan(id: 'gratis', product: product.id, amount: 0)
|
946
|
+
sub.plan = gratis_plan.id
|
733
947
|
sub.save
|
734
948
|
|
735
949
|
expect(sub.object).to eq('subscription')
|
736
|
-
expect(sub.plan.to_hash).to eq(
|
950
|
+
expect(sub.plan.to_hash).to eq(gratis_plan.to_hash)
|
737
951
|
|
738
952
|
customer = Stripe::Customer.retrieve('cardless')
|
739
953
|
expect(customer.subscriptions.data).to_not be_empty
|
@@ -741,17 +955,15 @@ shared_examples 'Customer Subscriptions' do
|
|
741
955
|
expect(customer.subscriptions.data.length).to eq(1)
|
742
956
|
|
743
957
|
expect(customer.subscriptions.data.first.id).to eq(sub.id)
|
744
|
-
expect(customer.subscriptions.data.first.plan.to_hash).to eq(
|
958
|
+
expect(customer.subscriptions.data.first.plan.to_hash).to eq(gratis_plan.to_hash)
|
745
959
|
expect(customer.subscriptions.data.first.customer).to eq(customer.id)
|
746
960
|
end
|
747
961
|
|
748
962
|
it "sets a card when updating a customer's subscription" do
|
749
|
-
|
750
|
-
paid = stripe_helper.create_plan(id: 'paid', amount: 499)
|
751
|
-
customer = Stripe::Customer.create(id: 'test_customer_sub', plan: 'free')
|
963
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', plan: free_plan.id)
|
752
964
|
|
753
965
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
754
|
-
sub.plan =
|
966
|
+
sub.plan = plan.id
|
755
967
|
sub.source = gen_card_tk
|
756
968
|
sub.save
|
757
969
|
|
@@ -764,11 +976,8 @@ shared_examples 'Customer Subscriptions' do
|
|
764
976
|
end
|
765
977
|
|
766
978
|
it "overrides trial length when trial end is set" do
|
767
|
-
|
768
|
-
customer = Stripe::Customer.create(id: 'test_trial_end', plan: 'trial')
|
769
|
-
|
979
|
+
customer = Stripe::Customer.create(id: 'test_trial_end', plan: plan_with_trial.id)
|
770
980
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
771
|
-
|
772
981
|
trial_end = Time.now.utc.to_i + 3600
|
773
982
|
sub.trial_end = trial_end
|
774
983
|
sub.save
|
@@ -779,8 +988,7 @@ shared_examples 'Customer Subscriptions' do
|
|
779
988
|
end
|
780
989
|
|
781
990
|
it "returns without a trial when trial_end is set to 'now'" do
|
782
|
-
|
783
|
-
customer = Stripe::Customer.create(id: 'test_trial_end', plan: 'trial')
|
991
|
+
customer = Stripe::Customer.create(id: 'test_trial_end', plan: plan_with_trial.id, default_source: 'tok_visa')
|
784
992
|
|
785
993
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
786
994
|
|
@@ -788,18 +996,15 @@ shared_examples 'Customer Subscriptions' do
|
|
788
996
|
sub.save
|
789
997
|
|
790
998
|
expect(sub.object).to eq('subscription')
|
791
|
-
expect(sub.plan.to_hash).to eq(
|
999
|
+
expect(sub.plan.to_hash).to eq(plan_with_trial.to_hash)
|
792
1000
|
expect(sub.status).to eq('active')
|
793
1001
|
expect(sub.trial_start).to be_nil
|
794
1002
|
expect(sub.trial_end).to be_nil
|
795
1003
|
end
|
796
1004
|
|
797
1005
|
it "changes an active subscription to a trial when trial_end is set" do
|
798
|
-
|
799
|
-
customer = Stripe::Customer.create(id: 'test_trial_end', plan: 'no_trial', source: gen_card_tk)
|
800
|
-
|
1006
|
+
customer = Stripe::Customer.create(id: 'test_trial_end', plan: plan.id, source: gen_card_tk)
|
801
1007
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
802
|
-
|
803
1008
|
trial_end = Time.now.utc.to_i + 3600
|
804
1009
|
sub.trial_end = trial_end
|
805
1010
|
sub.save
|
@@ -813,8 +1018,8 @@ shared_examples 'Customer Subscriptions' do
|
|
813
1018
|
|
814
1019
|
|
815
1020
|
it "raises error when trial_end is not an integer or 'now'" do
|
816
|
-
plan
|
817
|
-
customer = Stripe::Customer.create(id: 'test_trial_end', plan:
|
1021
|
+
expect(plan.trial_period_days).to be_nil
|
1022
|
+
customer = Stripe::Customer.create(id: 'test_trial_end', plan: plan.id, source: gen_card_tk)
|
818
1023
|
|
819
1024
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
820
1025
|
sub.trial_end = "gazebo"
|
@@ -828,10 +1033,10 @@ shared_examples 'Customer Subscriptions' do
|
|
828
1033
|
end
|
829
1034
|
|
830
1035
|
context "cancelling a subscription" do
|
1036
|
+
let(:customer) { Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: plan.id) }
|
831
1037
|
|
832
|
-
it "cancels a stripe customer's subscription", :
|
833
|
-
|
834
|
-
customer = Stripe::Customer.create(source: gen_card_tk, plan: "the truth")
|
1038
|
+
it "cancels a stripe customer's subscription", live: true do
|
1039
|
+
customer = Stripe::Customer.create(source: gen_card_tk, plan: plan.id)
|
835
1040
|
|
836
1041
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
837
1042
|
result = sub.delete
|
@@ -846,53 +1051,58 @@ shared_examples 'Customer Subscriptions' do
|
|
846
1051
|
expect(customer.subscriptions.count).to eq(0)
|
847
1052
|
expect(customer.subscriptions.data.length).to eq(0)
|
848
1053
|
end
|
1054
|
+
end
|
849
1055
|
|
850
|
-
|
851
|
-
|
852
|
-
|
853
|
-
|
854
|
-
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
855
|
-
result = sub.delete(at_period_end: true)
|
1056
|
+
it "supports 'cancelling' by updating cancel_at_period_end" do
|
1057
|
+
product = stripe_helper.create_product(name: 'Truth Product')
|
1058
|
+
truth = stripe_helper.create_plan(id: 'the_truth', product: product.id)
|
1059
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: "the_truth")
|
856
1060
|
|
857
|
-
|
858
|
-
|
859
|
-
expect(result.id).to eq(sub.id)
|
1061
|
+
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
1062
|
+
result = Stripe::Subscription.update(sub.id, cancel_at_period_end: true)
|
860
1063
|
|
861
|
-
|
862
|
-
|
863
|
-
|
864
|
-
expect(customer.subscriptions.data.length).to eq(1)
|
1064
|
+
expect(result.status).to eq('active')
|
1065
|
+
expect(result.cancel_at_period_end).to eq(true)
|
1066
|
+
expect(result.id).to eq(sub.id)
|
865
1067
|
|
866
|
-
|
867
|
-
|
868
|
-
|
869
|
-
|
870
|
-
|
1068
|
+
customer = Stripe::Customer.retrieve('test_customer_sub')
|
1069
|
+
expect(customer.subscriptions.data).to_not be_empty
|
1070
|
+
expect(customer.subscriptions.count).to eq(1)
|
1071
|
+
expect(customer.subscriptions.data.length).to eq(1)
|
1072
|
+
|
1073
|
+
expect(customer.subscriptions.data.first.status).to eq('active')
|
1074
|
+
expect(customer.subscriptions.data.first.cancel_at_period_end).to eq(true)
|
1075
|
+
expect(customer.subscriptions.data.first.ended_at).to be_nil
|
1076
|
+
expect(customer.subscriptions.data.first.canceled_at).to_not be_nil
|
1077
|
+
end
|
871
1078
|
|
872
|
-
|
873
|
-
|
874
|
-
|
1079
|
+
it "resumes a subscription cancelled by updating cancel_at_period_end" do
|
1080
|
+
product = stripe_helper.create_product(name: 'Truth Product')
|
1081
|
+
truth = stripe_helper.create_plan(id: 'the_truth', product: product.id)
|
1082
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: "the_truth")
|
875
1083
|
|
876
|
-
|
877
|
-
|
1084
|
+
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
1085
|
+
Stripe::Subscription.update(sub.id, cancel_at_period_end: true)
|
878
1086
|
|
879
|
-
|
880
|
-
sub.save
|
1087
|
+
result = Stripe::Subscription.update(sub.id, cancel_at_period_end: false)
|
881
1088
|
|
882
|
-
|
883
|
-
|
884
|
-
|
885
|
-
expect(customer.subscriptions.data.length).to eq(1)
|
1089
|
+
expect(result.status).to eq('active')
|
1090
|
+
expect(result.cancel_at_period_end).to eq(false)
|
1091
|
+
expect(result.id).to eq(sub.id)
|
886
1092
|
|
887
|
-
|
888
|
-
|
889
|
-
|
890
|
-
|
891
|
-
|
1093
|
+
customer = Stripe::Customer.retrieve('test_customer_sub')
|
1094
|
+
expect(customer.subscriptions.data).to_not be_empty
|
1095
|
+
expect(customer.subscriptions.count).to eq(1)
|
1096
|
+
expect(customer.subscriptions.data.length).to eq(1)
|
1097
|
+
|
1098
|
+
expect(customer.subscriptions.data.first.status).to eq('active')
|
1099
|
+
expect(customer.subscriptions.data.first.cancel_at_period_end).to eq(false)
|
1100
|
+
expect(customer.subscriptions.data.first.ended_at).to be_nil
|
1101
|
+
expect(customer.subscriptions.data.first.canceled_at).to be_nil
|
892
1102
|
end
|
893
1103
|
|
894
1104
|
it "doesn't change status of subscription when cancelling at period end" do
|
895
|
-
trial = stripe_helper.create_plan(id: 'trial', trial_period_days: 14)
|
1105
|
+
trial = stripe_helper.create_plan(id: 'trial', product: product.id, trial_period_days: 14)
|
896
1106
|
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: "trial")
|
897
1107
|
|
898
1108
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
@@ -905,11 +1115,11 @@ shared_examples 'Customer Subscriptions' do
|
|
905
1115
|
expect(customer.subscriptions.data.first.status).to eq('trialing')
|
906
1116
|
end
|
907
1117
|
|
908
|
-
it "doesn't require a card when trial_end is present", :
|
1118
|
+
it "doesn't require a card when trial_end is present", live: true do
|
909
1119
|
plan = stripe_helper.create_plan(
|
910
1120
|
:amount => 2000,
|
1121
|
+
:product => product.id,
|
911
1122
|
:interval => 'month',
|
912
|
-
:name => 'Amazing Gold Plan',
|
913
1123
|
:currency => 'usd',
|
914
1124
|
:id => 'gold'
|
915
1125
|
)
|
@@ -924,7 +1134,7 @@ shared_examples 'Customer Subscriptions' do
|
|
924
1134
|
let(:subscription) { Stripe::Subscription.retrieve(customer.subscriptions.data.first.id) }
|
925
1135
|
|
926
1136
|
before do
|
927
|
-
|
1137
|
+
free_plan
|
928
1138
|
Stripe::Subscription.create({ plan: 'free', customer: customer.id })
|
929
1139
|
end
|
930
1140
|
|
@@ -937,7 +1147,7 @@ shared_examples 'Customer Subscriptions' do
|
|
937
1147
|
expect(subscription.items.object).to eq('list')
|
938
1148
|
expect(subscription.items.data.class).to eq(Array)
|
939
1149
|
expect(subscription.items.data.count).to eq(1)
|
940
|
-
expect(subscription.items.data.first.id).to
|
1150
|
+
expect(subscription.items.data.first.id).to include('test_si_')
|
941
1151
|
expect(subscription.items.data.first.created).to eq(1504716183)
|
942
1152
|
expect(subscription.items.data.first.object).to eq('subscription_item')
|
943
1153
|
expect(subscription.items.data.first.plan.amount).to eq(0)
|
@@ -950,12 +1160,12 @@ shared_examples 'Customer Subscriptions' do
|
|
950
1160
|
context "retrieve multiple subscriptions" do
|
951
1161
|
|
952
1162
|
it "retrieves a list of multiple subscriptions" do
|
953
|
-
|
954
|
-
paid = stripe_helper.create_plan(id: 'paid', amount: 499)
|
955
|
-
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan:
|
1163
|
+
free_plan
|
1164
|
+
paid = stripe_helper.create_plan(id: 'paid', product: product.id, amount: 499)
|
1165
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: free_plan.id)
|
956
1166
|
Stripe::Subscription.create({ plan: 'paid', customer: customer.id })
|
957
1167
|
|
958
|
-
subs = Stripe::Subscription.
|
1168
|
+
subs = Stripe::Subscription.list({ customer: customer.id })
|
959
1169
|
|
960
1170
|
expect(subs.object).to eq("list")
|
961
1171
|
expect(subs.count).to eq(2)
|
@@ -966,7 +1176,7 @@ shared_examples 'Customer Subscriptions' do
|
|
966
1176
|
Stripe::Customer.create(id: 'no_subs')
|
967
1177
|
customer = Stripe::Customer.retrieve('no_subs')
|
968
1178
|
|
969
|
-
list = Stripe::Subscription.
|
1179
|
+
list = Stripe::Subscription.list({ customer: customer.id })
|
970
1180
|
|
971
1181
|
expect(list.object).to eq("list")
|
972
1182
|
expect(list.count).to eq(0)
|
@@ -976,15 +1186,13 @@ shared_examples 'Customer Subscriptions' do
|
|
976
1186
|
|
977
1187
|
describe "metadata" do
|
978
1188
|
|
979
|
-
it "creates a stripe customer and subscribes them to a plan with meta data", :
|
1189
|
+
it "creates a stripe customer and subscribes them to a plan with meta data", live: true do
|
980
1190
|
|
981
1191
|
stripe_helper.
|
982
1192
|
create_plan(
|
983
1193
|
:amount => 500,
|
984
1194
|
:interval => 'month',
|
985
|
-
:product =>
|
986
|
-
:name => 'Sample Plan'
|
987
|
-
},
|
1195
|
+
:product => product.id,
|
988
1196
|
:currency => 'usd',
|
989
1197
|
:id => 'Sample5'
|
990
1198
|
)
|
@@ -1007,3 +1215,46 @@ shared_examples 'Customer Subscriptions' do
|
|
1007
1215
|
end
|
1008
1216
|
|
1009
1217
|
end
|
1218
|
+
|
1219
|
+
shared_examples 'Customer Subscriptions with prices' do
|
1220
|
+
let(:gen_card_tk) { stripe_helper.generate_card_token }
|
1221
|
+
|
1222
|
+
let(:product) { stripe_helper.create_product }
|
1223
|
+
let(:price) { stripe_helper.create_price(product: product.id, amount: 4999, currency: 'usd') }
|
1224
|
+
|
1225
|
+
context "creating a new subscription" do
|
1226
|
+
it "adds a new subscription to customer with none using items", live: true do
|
1227
|
+
customer = Stripe::Customer.create(source: gen_card_tk)
|
1228
|
+
|
1229
|
+
expect(customer.subscriptions.data).to be_empty
|
1230
|
+
expect(customer.subscriptions.count).to eq(0)
|
1231
|
+
|
1232
|
+
subscription = Stripe::Subscription.create({
|
1233
|
+
customer: customer.id,
|
1234
|
+
items: [{ price: price.id }],
|
1235
|
+
metadata: { foo: "bar", example: "yes" }
|
1236
|
+
})
|
1237
|
+
|
1238
|
+
expect(subscription.object).to eq('subscription')
|
1239
|
+
expect(subscription.plan.to_hash).to eq(price.to_hash)
|
1240
|
+
expect(subscription.metadata.foo).to eq("bar")
|
1241
|
+
expect(subscription.metadata.example).to eq("yes")
|
1242
|
+
|
1243
|
+
customer = Stripe::Customer.retrieve(customer.id)
|
1244
|
+
subscriptions = Stripe::Subscription.list(customer: customer.id)
|
1245
|
+
charges = Stripe::Charge.list(customer: customer.id)
|
1246
|
+
|
1247
|
+
expect(subscriptions.data).to_not be_empty
|
1248
|
+
expect(subscriptions.count).to eq(1)
|
1249
|
+
expect(subscriptions.data.length).to eq(1)
|
1250
|
+
expect(charges.data.length).to eq(1)
|
1251
|
+
expect(customer.currency).to eq("usd")
|
1252
|
+
|
1253
|
+
expect(subscriptions.data.first.id).to eq(subscription.id)
|
1254
|
+
expect(subscriptions.data.first.plan.to_hash).to eq(price.to_hash)
|
1255
|
+
expect(subscriptions.data.first.customer).to eq(customer.id)
|
1256
|
+
expect(subscriptions.data.first.metadata.foo).to eq( "bar" )
|
1257
|
+
expect(subscriptions.data.first.metadata.example).to eq( "yes" )
|
1258
|
+
end
|
1259
|
+
end
|
1260
|
+
end
|