stripe-ruby-mock 2.5.8 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/.travis.yml +6 -6
- data/README.md +8 -8
- data/lib/stripe_mock.rb +3 -0
- data/lib/stripe_mock/api/errors.rb +31 -28
- data/lib/stripe_mock/api/webhooks.rb +3 -0
- data/lib/stripe_mock/data.rb +140 -13
- data/lib/stripe_mock/instance.rb +10 -3
- data/lib/stripe_mock/request_handlers/balance_transactions.rb +2 -2
- data/lib/stripe_mock/request_handlers/helpers/subscription_helpers.rb +1 -1
- data/lib/stripe_mock/request_handlers/helpers/token_helpers.rb +1 -1
- data/lib/stripe_mock/request_handlers/invoices.rb +6 -1
- data/lib/stripe_mock/request_handlers/payment_intents.rb +175 -0
- data/lib/stripe_mock/request_handlers/payment_methods.rb +138 -0
- data/lib/stripe_mock/request_handlers/products.rb +1 -0
- data/lib/stripe_mock/request_handlers/setup_intents.rb +93 -0
- data/lib/stripe_mock/request_handlers/subscriptions.rb +17 -4
- data/lib/stripe_mock/request_handlers/validators/param_validators.rb +95 -9
- data/lib/stripe_mock/test_strategies/base.rb +42 -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/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/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 +6 -6
- data/spec/server_spec.rb +2 -1
- data/spec/shared_stripe_examples/account_examples.rb +1 -1
- 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/charge_examples.rb +9 -22
- data/spec/shared_stripe_examples/coupon_examples.rb +1 -1
- data/spec/shared_stripe_examples/customer_examples.rb +44 -30
- 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/external_account_examples.rb +3 -3
- data/spec/shared_stripe_examples/invoice_examples.rb +41 -39
- data/spec/shared_stripe_examples/invoice_item_examples.rb +1 -1
- data/spec/shared_stripe_examples/payment_intent_examples.rb +137 -0
- data/spec/shared_stripe_examples/payment_method_examples.rb +185 -0
- data/spec/shared_stripe_examples/payout_examples.rb +2 -2
- data/spec/shared_stripe_examples/plan_examples.rb +135 -92
- data/spec/shared_stripe_examples/product_examples.rb +155 -0
- data/spec/shared_stripe_examples/refund_examples.rb +25 -21
- data/spec/shared_stripe_examples/setup_intent_examples.rb +68 -0
- data/spec/shared_stripe_examples/subscription_examples.rb +281 -310
- data/spec/shared_stripe_examples/subscription_items_examples.rb +3 -2
- data/spec/shared_stripe_examples/transfer_examples.rb +6 -6
- data/spec/shared_stripe_examples/webhook_event_examples.rb +11 -11
- data/spec/spec_helper.rb +3 -4
- data/spec/stripe_mock_spec.rb +2 -2
- data/spec/support/shared_contexts/stripe_validator_spec.rb +8 -0
- data/spec/support/stripe_examples.rb +3 -0
- data/stripe-ruby-mock.gemspec +2 -2
- metadata +47 -27
- data/spec/shared_stripe_examples/product_example.rb +0 -65
@@ -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
|
@@ -378,7 +376,8 @@ shared_examples 'Refund API' do
|
|
378
376
|
description: 'card charge'
|
379
377
|
)
|
380
378
|
|
381
|
-
charge
|
379
|
+
Stripe::Refund.create(charge: charge.id, amount: 999)
|
380
|
+
charge.refresh
|
382
381
|
|
383
382
|
expect(charge.refunded).to eq(true)
|
384
383
|
expect(charge.refunds.data.first.amount).to eq(999)
|
@@ -392,10 +391,10 @@ shared_examples 'Refund API' do
|
|
392
391
|
source: stripe_helper.generate_card_token,
|
393
392
|
description: 'card charge'
|
394
393
|
)
|
395
|
-
refund = charge.
|
394
|
+
refund = Stripe::Refund.create(charge: charge.id)
|
396
395
|
|
397
396
|
expect(charge.id).to match(/^(test_)?ch/)
|
398
|
-
expect(refund.
|
397
|
+
expect(refund.charge).to eq(charge.id)
|
399
398
|
end
|
400
399
|
|
401
400
|
it "creates a stripe refund with a refund ID" do
|
@@ -405,10 +404,12 @@ shared_examples 'Refund API' do
|
|
405
404
|
source: stripe_helper.generate_card_token,
|
406
405
|
description: 'card charge'
|
407
406
|
)
|
408
|
-
refund = charge.refund
|
409
407
|
|
410
|
-
|
411
|
-
|
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/)
|
412
413
|
end
|
413
414
|
|
414
415
|
it "creates a stripe refund with a status" do
|
@@ -418,10 +419,12 @@ shared_examples 'Refund API' do
|
|
418
419
|
source: stripe_helper.generate_card_token,
|
419
420
|
description: 'card charge'
|
420
421
|
)
|
421
|
-
refund = charge.refund
|
422
422
|
|
423
|
-
|
424
|
-
|
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")
|
425
428
|
end
|
426
429
|
|
427
430
|
it "creates a stripe refund with a different balance transaction than the charge" do
|
@@ -431,9 +434,10 @@ shared_examples 'Refund API' do
|
|
431
434
|
source: stripe_helper.generate_card_token,
|
432
435
|
description: 'card charge'
|
433
436
|
)
|
434
|
-
|
437
|
+
Stripe::Refund.create(charge: charge.id)
|
438
|
+
refunds = Stripe::Refund.list(charge: charge.id)
|
435
439
|
|
436
|
-
expect(charge.balance_transaction).not_to eq(
|
440
|
+
expect(charge.balance_transaction).not_to eq(refunds.data.first.balance_transaction)
|
437
441
|
end
|
438
442
|
|
439
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
4
|
shared_examples 'Customer Subscriptions' 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
17
|
it "adds a new subscription to customer with none using items", :live => true do
|
11
|
-
plan
|
12
|
-
amount: 4999, currency: 'usd')
|
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
52
|
it "adds a new subscription to customer with none", :live => true do
|
41
|
-
plan
|
42
|
-
amount: 4999, currency: 'usd')
|
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,94 +99,85 @@ 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" )
|
99
118
|
end
|
100
119
|
|
101
120
|
it "adds a new subscription to customer (string/symbol agnostic)" do
|
102
121
|
customer = Stripe::Customer.create(source: gen_card_tk)
|
103
|
-
|
122
|
+
subscriptions = Stripe::Subscription.list(customer: customer.id)
|
123
|
+
expect(subscriptions.count).to eq(0)
|
104
124
|
|
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)
|
125
|
+
plan
|
126
|
+
sub = Stripe::Subscription.create({plan: plan.id, customer: customer.id })
|
111
127
|
|
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
128
|
customer = Stripe::Customer.retrieve(customer.id)
|
129
|
+
subscriptions = Stripe::Subscription.list(customer: customer.id)
|
116
130
|
expect(sub.plan.to_hash).to eq(plan.to_hash)
|
117
|
-
expect(
|
131
|
+
expect(subscriptions.count).to eq(1)
|
118
132
|
end
|
119
133
|
|
120
134
|
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
135
|
customer = Stripe::Customer.create(source: gen_card_tk)
|
125
|
-
Stripe::Subscription.create({ plan:
|
136
|
+
Stripe::Subscription.create({ plan: plan.id, customer: customer.id, metadata: { foo: "bar", example: "yes" } })
|
126
137
|
customer = Stripe::Customer.retrieve(customer.id)
|
138
|
+
charges = Stripe::Charge.list(customer: customer.id)
|
127
139
|
|
128
|
-
expect(
|
129
|
-
expect(
|
140
|
+
expect(charges.data.length).to eq(1)
|
141
|
+
expect(charges.data.first.amount).to eq(4999)
|
130
142
|
end
|
131
143
|
|
132
144
|
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
145
|
coupon = stripe_helper.create_coupon(id: 'free_coupon', duration: 'repeating', duration_in_months: 3)
|
136
146
|
customer = Stripe::Customer.create(source: gen_card_tk)
|
137
147
|
Stripe::Subscription.create(plan: plan.id, customer: customer.id, coupon: coupon.id)
|
138
148
|
customer = Stripe::Customer.retrieve(customer.id)
|
139
149
|
|
140
|
-
|
141
|
-
|
142
|
-
expect(
|
143
|
-
expect(
|
144
|
-
expect(
|
150
|
+
subscriptions = Stripe::Subscription.list(customer: customer.id)
|
151
|
+
|
152
|
+
expect(subscriptions.data).to be_a(Array)
|
153
|
+
expect(subscriptions.data.count).to eq(1)
|
154
|
+
expect(subscriptions.data.first.discount).not_to be_nil
|
155
|
+
expect(subscriptions.data.first.discount).to be_a(Stripe::Discount)
|
156
|
+
expect(subscriptions.data.first.discount.coupon.id).to eq(coupon.id)
|
145
157
|
end
|
146
158
|
|
147
159
|
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
160
|
customer = Stripe::Customer.create(source: gen_card_tk)
|
151
161
|
|
152
|
-
expect {
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
162
|
+
expect {
|
163
|
+
Stripe::Subscription.create(plan: plan.id, customer: customer.id, coupon: 'none')
|
164
|
+
}.to raise_error {|e|
|
165
|
+
expect(e).to be_a Stripe::InvalidRequestError
|
166
|
+
expect(e.http_status).to eq(400)
|
167
|
+
expect(e.message).to eq('No such coupon: none')
|
168
|
+
}
|
157
169
|
end
|
158
170
|
|
159
171
|
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
172
|
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk)
|
171
173
|
|
172
174
|
subscription = Stripe::Subscription.create({
|
173
|
-
plan:
|
175
|
+
plan: plan.id,
|
176
|
+
customer: customer.id,
|
177
|
+
quantity: 2,
|
178
|
+
application_fee_percent: 10,
|
179
|
+
tax_percent: 20
|
180
|
+
})
|
174
181
|
expect(subscription.quantity).to eq(2)
|
175
182
|
expect(subscription.application_fee_percent).to eq(10)
|
176
183
|
expect(subscription.tax_percent).to eq(20)
|
@@ -178,26 +185,22 @@ shared_examples 'Customer Subscriptions' do
|
|
178
185
|
|
179
186
|
it "correctly sets created when it's not provided as a parameter", live: true do
|
180
187
|
customer = Stripe::Customer.create(source: gen_card_tk)
|
181
|
-
|
182
|
-
amount: 4999, currency: 'usd')
|
183
|
-
subscription = Stripe::Subscription.create({ plan: 'silver', customer: customer.id })
|
188
|
+
subscription = Stripe::Subscription.create({ plan: plan.id, customer: customer.id })
|
184
189
|
|
185
190
|
expect(subscription.created).to eq(subscription.current_period_start)
|
186
191
|
end
|
187
192
|
|
188
193
|
it "correctly sets created when it's provided as a parameter" do
|
189
194
|
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 })
|
195
|
+
subscription = Stripe::Subscription.create({ plan: plan.id, customer: customer.id, created: 1473576318 })
|
193
196
|
|
194
197
|
expect(subscription.created).to eq(1473576318)
|
195
198
|
end
|
196
199
|
|
197
200
|
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')
|
201
|
+
silver = stripe_helper.create_plan(id: 'silver', product: product.id)
|
202
|
+
gold = stripe_helper.create_plan(id: 'gold', product: product.id)
|
203
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', product: product.id, source: gen_card_tk, plan: 'gold')
|
201
204
|
|
202
205
|
sub = Stripe::Subscription.create({ plan: 'silver', customer: customer.id })
|
203
206
|
|
@@ -218,7 +221,7 @@ shared_examples 'Customer Subscriptions' do
|
|
218
221
|
end
|
219
222
|
|
220
223
|
it "subscribes a cardless customer when specifing a card token" do
|
221
|
-
plan = stripe_helper.create_plan(id: 'enterprise', amount: 499)
|
224
|
+
plan = stripe_helper.create_plan(id: 'enterprise', product: product.id, amount: 499)
|
222
225
|
customer = Stripe::Customer.create(id: 'cardless')
|
223
226
|
|
224
227
|
sub = Stripe::Subscription.create(plan: 'enterprise', customer: customer.id, source: gen_card_tk)
|
@@ -247,10 +250,10 @@ shared_examples 'Customer Subscriptions' do
|
|
247
250
|
end
|
248
251
|
|
249
252
|
it "throws an error when subscribing a customer with no card" do
|
250
|
-
plan = stripe_helper.create_plan(id: 'enterprise', amount: 499)
|
253
|
+
plan = stripe_helper.create_plan(id: 'enterprise', product: product.id, amount: 499)
|
251
254
|
customer = Stripe::Customer.create(id: 'cardless')
|
252
255
|
|
253
|
-
expect { Stripe::Subscription.create({ plan:
|
256
|
+
expect { Stripe::Subscription.create({ plan: plan.id, customer: customer.id }) }.to raise_error {|e|
|
254
257
|
expect(e).to be_a Stripe::InvalidRequestError
|
255
258
|
expect(e.http_status).to eq(400)
|
256
259
|
expect(e.message).to_not be_nil
|
@@ -261,12 +264,14 @@ shared_examples 'Customer Subscriptions' do
|
|
261
264
|
end
|
262
265
|
|
263
266
|
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
267
|
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
268
|
|
268
|
-
|
269
|
-
|
269
|
+
expect(plan.currency).to eql("usd")
|
270
|
+
usd_subscription = Stripe::Subscription.create({ plan: plan.id, customer: customer.id })
|
271
|
+
|
272
|
+
eur_plan = stripe_helper.create_plan(plan_attrs.merge(id: "plan_EURO", currency: 'eur'))
|
273
|
+
expect(eur_plan.currency).to eql("eur")
|
274
|
+
expect { Stripe::Subscription.create({ plan: eur_plan.id, customer: customer.id }) }.to raise_error {|e|
|
270
275
|
expect(e).to be_a Stripe::InvalidRequestError
|
271
276
|
expect(e.http_status).to eq(400)
|
272
277
|
expect(e.message).to_not be_nil
|
@@ -274,7 +279,7 @@ shared_examples 'Customer Subscriptions' do
|
|
274
279
|
end
|
275
280
|
|
276
281
|
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)
|
282
|
+
plan = stripe_helper.create_plan(id: 'trial', product: product.id, amount: 999)
|
278
283
|
customer = Stripe::Customer.create(source: gen_card_tk)
|
279
284
|
|
280
285
|
expect{ Stripe::Subscription.create(plan: plan.id, customer: customer.id, trial: 10) }.to raise_error {|e|
|
@@ -286,35 +291,34 @@ shared_examples 'Customer Subscriptions' do
|
|
286
291
|
end
|
287
292
|
|
288
293
|
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
294
|
customer = Stripe::Customer.create(id: 'cardless')
|
291
|
-
|
292
|
-
sub = Stripe::Subscription.create({ plan: 'trial', customer: customer.id })
|
295
|
+
sub = Stripe::Subscription.create({ plan: plan_with_trial.id, customer: customer.id })
|
293
296
|
|
294
297
|
expect(sub.object).to eq('subscription')
|
295
|
-
expect(sub.plan.to_hash).to eq(
|
298
|
+
expect(sub.plan.to_hash).to eq(plan_with_trial.to_hash)
|
296
299
|
expect(sub.trial_end - sub.trial_start).to eq(14 * 86400)
|
297
300
|
expect(sub.billing_cycle_anchor).to be_nil
|
298
301
|
|
299
|
-
customer = Stripe::Customer.retrieve(
|
300
|
-
|
301
|
-
|
302
|
-
expect(customer.subscriptions.data.length).to eq(1)
|
302
|
+
customer = Stripe::Customer.retrieve(customer.id)
|
303
|
+
subscriptions = Stripe::Subscription.list(customer: customer.id)
|
304
|
+
charges = Stripe::Charge.list(customer: customer.id)
|
303
305
|
|
304
|
-
expect(
|
305
|
-
expect(
|
306
|
-
expect(
|
307
|
-
|
306
|
+
expect(subscriptions.data).to_not be_empty
|
307
|
+
expect(subscriptions.count).to eq(1)
|
308
|
+
expect(subscriptions.data.length).to eq(1)
|
309
|
+
|
310
|
+
expect(subscriptions.data.first.id).to eq(sub.id)
|
311
|
+
expect(subscriptions.data.first.plan.to_hash).to eq(plan_with_trial.to_hash)
|
312
|
+
expect(subscriptions.data.first.customer).to eq(customer.id)
|
313
|
+
expect(charges.count).to eq(0)
|
308
314
|
end
|
309
315
|
|
310
316
|
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
317
|
customer = Stripe::Customer.create(id: 'cardless')
|
313
|
-
|
314
|
-
sub = Stripe::Subscription.create({ items: [ { plan: 'trial' } ], customer: customer.id })
|
318
|
+
sub = Stripe::Subscription.create({ items: [ { plan: plan_with_trial.id } ], customer: customer.id })
|
315
319
|
|
316
320
|
expect(sub.object).to eq('subscription')
|
317
|
-
expect(sub.items.data[0].plan.to_hash).to eq(
|
321
|
+
expect(sub.items.data[0].plan.to_hash).to eq(plan_with_trial.to_hash)
|
318
322
|
# no idea how to fix this one
|
319
323
|
# expect(sub.trial_end - sub.trial_start).to eq(14 * 86400)
|
320
324
|
|
@@ -324,17 +328,17 @@ shared_examples 'Customer Subscriptions' do
|
|
324
328
|
expect(customer.subscriptions.data.length).to eq(1)
|
325
329
|
|
326
330
|
expect(customer.subscriptions.data.first.id).to eq(sub.id)
|
327
|
-
expect(customer.subscriptions.data.first.items.data.first.plan.to_hash).to eq(
|
331
|
+
expect(customer.subscriptions.data.first.items.data.first.plan.to_hash).to eq(plan_with_trial.to_hash)
|
328
332
|
expect(customer.subscriptions.data.first.customer).to eq(customer.id)
|
329
333
|
# No idea on this one
|
330
334
|
# expect(customer.charges.count).to eq(0)
|
331
335
|
end
|
332
336
|
|
333
337
|
it "subscribes a customer with no card to a free plan" do
|
334
|
-
plan = stripe_helper.create_plan(id: 'free_tier', amount: 0)
|
338
|
+
plan = stripe_helper.create_plan(id: 'free_tier', product: product.id, amount: 0)
|
335
339
|
customer = Stripe::Customer.create(id: 'cardless')
|
336
340
|
|
337
|
-
sub = Stripe::Subscription.create({ plan:
|
341
|
+
sub = Stripe::Subscription.create({ plan: plan.id, customer: customer.id })
|
338
342
|
|
339
343
|
expect(sub.object).to eq('subscription')
|
340
344
|
expect(sub.plan.to_hash).to eq(plan.to_hash)
|
@@ -350,20 +354,21 @@ shared_examples 'Customer Subscriptions' do
|
|
350
354
|
end
|
351
355
|
|
352
356
|
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
357
|
customer = Stripe::Customer.create(id: 'short_trial')
|
355
358
|
trial_end = Time.now.utc.to_i + 3600
|
356
359
|
|
357
|
-
sub = Stripe::Subscription.create({ plan:
|
360
|
+
sub = Stripe::Subscription.create({ plan: plan_with_trial.id, customer: customer.id, trial_end: trial_end })
|
358
361
|
|
359
362
|
expect(sub.object).to eq('subscription')
|
360
|
-
expect(sub.plan.to_hash).to eq(
|
363
|
+
expect(sub.plan.to_hash).to eq(plan_with_trial.to_hash)
|
361
364
|
expect(sub.current_period_end).to eq(trial_end)
|
362
365
|
expect(sub.trial_end).to eq(trial_end)
|
363
366
|
end
|
364
367
|
|
365
368
|
it "does not override trial end when trial end is not set" do
|
366
|
-
|
369
|
+
product = stripe_helper.create_product(name: 'Trial')
|
370
|
+
plan = stripe_helper.create_plan(id: 'trial', amount: 999,
|
371
|
+
trial_period_days: 14, product: product.id)
|
367
372
|
customer = Stripe::Customer.create(id: 'short_trial')
|
368
373
|
trial_end = Time.now.utc.to_i + 3600
|
369
374
|
metadata = {description: 'original description'}
|
@@ -387,23 +392,21 @@ shared_examples 'Customer Subscriptions' do
|
|
387
392
|
end
|
388
393
|
|
389
394
|
it "returns without a trial when trial_end is set to 'now'" do
|
390
|
-
plan = stripe_helper.create_plan(id: 'trial', amount: 999, trial_period_days: 14)
|
391
395
|
customer = Stripe::Customer.create(id: 'no_trial', source: gen_card_tk)
|
392
396
|
|
393
|
-
sub = Stripe::Subscription.create({ plan:
|
397
|
+
sub = Stripe::Subscription.create({ plan: plan_with_trial.id, customer: customer.id, trial_end: "now" })
|
394
398
|
|
395
399
|
expect(sub.object).to eq('subscription')
|
396
|
-
expect(sub.plan.to_hash).to eq(
|
400
|
+
expect(sub.plan.to_hash).to eq(plan_with_trial.to_hash)
|
397
401
|
expect(sub.status).to eq('active')
|
398
402
|
expect(sub.trial_start).to be_nil
|
399
403
|
expect(sub.trial_end).to be_nil
|
400
404
|
end
|
401
405
|
|
402
406
|
it "raises error when trial_end is not an integer or 'now'" do
|
403
|
-
plan = stripe_helper.create_plan(id: 'trial', amount: 999, trial_period_days: 14)
|
404
407
|
customer = Stripe::Customer.create(id: 'cus_trial')
|
405
408
|
|
406
|
-
expect { Stripe::Subscription.create({ plan:
|
409
|
+
expect { Stripe::Subscription.create({ plan: plan_with_trial.id, customer: customer.id, trial_end: "gazebo" }) }.to raise_error {|e|
|
407
410
|
expect(e).to be_a Stripe::InvalidRequestError
|
408
411
|
expect(e.http_status).to eq(400)
|
409
412
|
expect(e.message).to eq("Invalid timestamp: must be an integer")
|
@@ -411,11 +414,10 @@ shared_examples 'Customer Subscriptions' do
|
|
411
414
|
end
|
412
415
|
|
413
416
|
it "raises error when trial_end is set to a time in the past" do
|
414
|
-
plan = stripe_helper.create_plan(id: 'trial', amount: 999, trial_period_days: 14)
|
415
417
|
customer = Stripe::Customer.create(id: 'past_trial')
|
416
418
|
trial_end = Time.now.utc.to_i - 3600
|
417
419
|
|
418
|
-
expect { Stripe::Subscription.create({ plan:
|
420
|
+
expect { Stripe::Subscription.create({ plan: plan_with_trial.id, customer: customer.id, trial_end: trial_end }) }.to raise_error {|e|
|
419
421
|
expect(e).to be_a Stripe::InvalidRequestError
|
420
422
|
expect(e.http_status).to eq(400)
|
421
423
|
expect(e.message).to eq("Invalid timestamp: must be an integer Unix timestamp in the future")
|
@@ -423,11 +425,10 @@ shared_examples 'Customer Subscriptions' do
|
|
423
425
|
end
|
424
426
|
|
425
427
|
it "raises error when trial_end is set to a time more than five years in the future" do
|
426
|
-
plan = stripe_helper.create_plan(id: 'trial', amount: 999, trial_period_days: 14)
|
427
428
|
customer = Stripe::Customer.create(id: 'long_trial')
|
428
429
|
trial_end = Time.now.utc.to_i + 31557600*5 + 3600 # 5 years + 1 hour
|
429
430
|
|
430
|
-
expect { Stripe::Subscription.create({ plan:
|
431
|
+
expect { Stripe::Subscription.create({ plan: plan_with_trial.id, customer: customer.id, trial_end: trial_end }) }.to raise_error {|e|
|
431
432
|
expect(e).to be_a Stripe::InvalidRequestError
|
432
433
|
expect(e.http_status).to eq(400)
|
433
434
|
expect(e.message).to eq("Invalid timestamp: can be no more than five years in the future")
|
@@ -435,11 +436,10 @@ shared_examples 'Customer Subscriptions' do
|
|
435
436
|
end
|
436
437
|
|
437
438
|
it 'overrides current period end when billing cycle anchor is set' do
|
438
|
-
plan = stripe_helper.create_plan(id: 'plan', amount: 999)
|
439
439
|
customer = Stripe::Customer.create(source: gen_card_tk)
|
440
440
|
billing_cycle_anchor = Time.now.utc.to_i + 3600
|
441
441
|
|
442
|
-
sub = Stripe::Subscription.create({ plan:
|
442
|
+
sub = Stripe::Subscription.create({ plan: plan.id, customer: customer.id, billing_cycle_anchor: billing_cycle_anchor })
|
443
443
|
|
444
444
|
expect(sub.status).to eq('active')
|
445
445
|
expect(sub.current_period_end).to eq(billing_cycle_anchor)
|
@@ -447,17 +447,11 @@ shared_examples 'Customer Subscriptions' do
|
|
447
447
|
end
|
448
448
|
|
449
449
|
it 'when plan defined inside items', live: true do
|
450
|
-
plan = stripe_helper.create_plan(id: 'BASE_PRICE_PLAN1')
|
450
|
+
plan = stripe_helper.create_plan(id: 'BASE_PRICE_PLAN1', product: product.id)
|
451
451
|
|
452
|
-
plan2 = stripe_helper.create_plan(id: 'PER_USER_PLAN1')
|
452
|
+
plan2 = stripe_helper.create_plan(id: 'PER_USER_PLAN1', product: product.id)
|
453
453
|
customer = Stripe::Customer.create(
|
454
|
-
source:
|
455
|
-
object: 'card',
|
456
|
-
exp_month: 11,
|
457
|
-
exp_year: 2019,
|
458
|
-
number: '4242424242424242',
|
459
|
-
cvc: '123'
|
460
|
-
}
|
454
|
+
source: stripe_helper.generate_card_token
|
461
455
|
)
|
462
456
|
subscription = Stripe::Subscription.create(
|
463
457
|
customer: customer.id,
|
@@ -476,9 +470,9 @@ shared_examples 'Customer Subscriptions' do
|
|
476
470
|
end
|
477
471
|
|
478
472
|
it 'when plan defined inside items for trials with no card', live: true do
|
479
|
-
plan = stripe_helper.create_plan(id: 'BASE_PRICE_PLAN1')
|
473
|
+
plan = stripe_helper.create_plan(id: 'BASE_PRICE_PLAN1', product: product.id)
|
480
474
|
|
481
|
-
plan2 = stripe_helper.create_plan(id: 'PER_USER_PLAN1')
|
475
|
+
plan2 = stripe_helper.create_plan(id: 'PER_USER_PLAN1', product: product.id)
|
482
476
|
customer = Stripe::Customer.create
|
483
477
|
trial_end = Time.now.utc.to_i + 3600
|
484
478
|
|
@@ -498,7 +492,8 @@ shared_examples 'Customer Subscriptions' do
|
|
498
492
|
end
|
499
493
|
|
500
494
|
it 'add a new subscription to bill via an invoice' do
|
501
|
-
|
495
|
+
product = stripe_helper.create_product(id: 'invoice_billing')
|
496
|
+
plan = stripe_helper.create_plan(id: 'silver', product: product.id,
|
502
497
|
amount: 4999, currency: 'usd')
|
503
498
|
customer = Stripe::Customer.create(id: 'cardless')
|
504
499
|
|
@@ -520,41 +515,51 @@ shared_examples 'Customer Subscriptions' do
|
|
520
515
|
end
|
521
516
|
|
522
517
|
let(:subscription_header) {{
|
523
|
-
:idempotency_key =>
|
518
|
+
:idempotency_key => SecureRandom.hex
|
524
519
|
}}
|
525
520
|
|
526
521
|
it "adds a new subscription to customer with identical idempotency key" do
|
527
|
-
|
522
|
+
product = stripe_helper.create_product(name: 'Silver Product')
|
523
|
+
plan = stripe_helper.create_plan(id: 'silver', product: product.id,
|
528
524
|
amount: 4999, currency: 'usd')
|
529
525
|
customer = Stripe::Customer.create(source: gen_card_tk)
|
530
526
|
|
531
527
|
expect(customer.subscriptions.data).to be_empty
|
532
528
|
expect(customer.subscriptions.count).to eq(0)
|
533
529
|
|
530
|
+
subscription_header = {
|
531
|
+
:idempotency_key => "uniq_idempotency_key_#{customer.id}"
|
532
|
+
}
|
533
|
+
|
534
534
|
sub1 = Stripe::Subscription.create({ items: [{ plan: 'silver' }], customer: customer.id }, subscription_header)
|
535
535
|
sub2 = Stripe::Subscription.create({ items: [{ plan: 'silver' }], customer: customer.id }, subscription_header)
|
536
536
|
expect(sub1).to eq(sub2)
|
537
537
|
end
|
538
538
|
|
539
539
|
it "adds a new subscription to customer with different idempotency key", :live => true do
|
540
|
-
|
540
|
+
product = stripe_helper.create_product(name: 'Silver Product')
|
541
|
+
plan = stripe_helper.create_plan(id: 'silver', product: product.id,
|
541
542
|
amount: 4999, currency: 'usd')
|
542
543
|
customer = Stripe::Customer.create(source: gen_card_tk)
|
543
544
|
|
544
545
|
expect(customer.subscriptions.data).to be_empty
|
545
546
|
expect(customer.subscriptions.count).to eq(0)
|
546
547
|
|
547
|
-
|
548
|
-
:idempotency_key =>
|
548
|
+
sub_header_1 = {
|
549
|
+
:idempotency_key => SecureRandom.hex
|
550
|
+
}
|
551
|
+
sub_header_2 = {
|
552
|
+
:idempotency_key => SecureRandom.hex
|
549
553
|
}
|
550
554
|
|
551
|
-
sub1 = Stripe::Subscription.create({ items: [{ plan: 'silver' }], customer: customer.id },
|
552
|
-
sub2 = Stripe::Subscription.create({ items: [{ plan: 'silver' }], customer: customer.id },
|
555
|
+
sub1 = Stripe::Subscription.create({ items: [{ plan: 'silver' }], customer: customer.id }, sub_header_1)
|
556
|
+
sub2 = Stripe::Subscription.create({ items: [{ plan: 'silver' }], customer: customer.id }, sub_header_2)
|
553
557
|
expect(sub1).not_to eq(sub2)
|
554
558
|
end
|
555
559
|
|
556
560
|
it "accepts a hash of items" do
|
557
|
-
|
561
|
+
product = stripe_helper.create_product(name: 'Silver Product')
|
562
|
+
silver = stripe_helper.create_plan(id: 'silver', product: product.id)
|
558
563
|
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk)
|
559
564
|
|
560
565
|
sub = Stripe::Subscription.create({ items: { '0' => { plan: 'silver' } }, customer: customer.id })
|
@@ -562,15 +567,36 @@ shared_examples 'Customer Subscriptions' do
|
|
562
567
|
|
563
568
|
expect(sub.cancel_at_period_end).to be_truthy
|
564
569
|
expect(sub.save).to be_truthy
|
565
|
-
expect(sub.cancel_at_period_end).to
|
570
|
+
expect(sub.cancel_at_period_end).to be_truthy
|
566
571
|
end
|
567
572
|
|
573
|
+
it 'accepts default_tax_rates param' do
|
574
|
+
tax_rate = Stripe::TaxRate.create(
|
575
|
+
display_name: 'VAT',
|
576
|
+
description: 'VAT Germany',
|
577
|
+
jurisdiction: 'DE',
|
578
|
+
percentage: 19.0,
|
579
|
+
inclusive: false,
|
580
|
+
)
|
581
|
+
product = stripe_helper.create_product(name: 'Silver Product')
|
582
|
+
silver = stripe_helper.create_plan(id: 'silver', product: product.id)
|
583
|
+
customer = Stripe::Customer.create(source: gen_card_tk)
|
584
|
+
subscription = Stripe::Subscription.create(
|
585
|
+
customer: customer.id,
|
586
|
+
items: [{ plan: silver.id }],
|
587
|
+
default_tax_rates: [ tax_rate ]
|
588
|
+
)
|
589
|
+
|
590
|
+
aggregate_failures do
|
591
|
+
expect(subscription.default_tax_rates.length).to eq(1)
|
592
|
+
expect(subscription.default_tax_rates.first.id).to eq(tax_rate.id)
|
593
|
+
end
|
594
|
+
end
|
568
595
|
end
|
569
596
|
|
570
597
|
context "updating a subscription" do
|
571
598
|
it 'raises invalid request exception when subscription is cancelled' do
|
572
|
-
|
573
|
-
customer = Stripe::Customer.create(source: gen_card_tk, plan: 'the truth')
|
599
|
+
customer = Stripe::Customer.create(source: gen_card_tk, plan: plan.id)
|
574
600
|
|
575
601
|
subscription = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
576
602
|
subscription.delete
|
@@ -583,24 +609,22 @@ shared_examples 'Customer Subscriptions' do
|
|
583
609
|
end
|
584
610
|
|
585
611
|
it "updates a stripe customer's existing subscription with one plan inside items" do
|
586
|
-
silver = stripe_helper.create_plan(id: 'silver')
|
587
612
|
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk)
|
588
613
|
|
589
|
-
sub = Stripe::Subscription.create({ items: [ { plan:
|
614
|
+
sub = Stripe::Subscription.create({ items: [ { plan: plan.id } ], customer: customer.id })
|
590
615
|
sub.delete(at_period_end: true)
|
591
616
|
|
592
617
|
expect(sub.cancel_at_period_end).to be_truthy
|
593
618
|
expect(sub.save).to be_truthy
|
594
|
-
expect(sub.cancel_at_period_end).to
|
619
|
+
expect(sub.cancel_at_period_end).to be_truthy
|
595
620
|
end
|
596
621
|
|
597
622
|
it "updates a stripe customer's existing subscription when plan inside of items" do
|
598
|
-
|
599
|
-
gold = stripe_helper.create_plan(id: 'gold')
|
600
|
-
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: 'silver')
|
623
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: plan.id)
|
601
624
|
|
625
|
+
gold_plan = stripe_helper.create_plan(id: 'gold', product: product.id)
|
602
626
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
603
|
-
sub.plan =
|
627
|
+
sub.plan = gold_plan.id
|
604
628
|
sub.quantity = 5
|
605
629
|
sub.metadata.foo = "bar"
|
606
630
|
sub.metadata.example = "yes"
|
@@ -608,7 +632,7 @@ shared_examples 'Customer Subscriptions' do
|
|
608
632
|
expect(sub.save).to be_truthy
|
609
633
|
|
610
634
|
expect(sub.object).to eq('subscription')
|
611
|
-
expect(sub.plan.to_hash).to eq(
|
635
|
+
expect(sub.plan.to_hash).to eq(gold_plan.to_hash)
|
612
636
|
expect(sub.quantity).to eq(5)
|
613
637
|
expect(sub.metadata.foo).to eq( "bar" )
|
614
638
|
expect(sub.metadata.example).to eq( "yes" )
|
@@ -619,16 +643,15 @@ shared_examples 'Customer Subscriptions' do
|
|
619
643
|
expect(customer.subscriptions.data.length).to eq(1)
|
620
644
|
|
621
645
|
expect(customer.subscriptions.data.first.id).to eq(sub.id)
|
622
|
-
expect(customer.subscriptions.data.first.plan.to_hash).to eq(
|
646
|
+
expect(customer.subscriptions.data.first.plan.to_hash).to eq(gold_plan.to_hash)
|
623
647
|
expect(customer.subscriptions.data.first.customer).to eq(customer.id)
|
624
648
|
end
|
625
649
|
|
626
650
|
it "updates a stripe customer's existing subscription with single plan when multiple plans inside of items" do
|
627
|
-
|
628
|
-
gold_plan = stripe_helper.create_plan(id: 'gold')
|
629
|
-
addon_plan = stripe_helper.create_plan(id: 'addon_plan')
|
630
|
-
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: silver_plan.id)
|
651
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: plan.id)
|
631
652
|
|
653
|
+
gold_plan = stripe_helper.create_plan(id: 'gold', product: product.id)
|
654
|
+
addon_plan = stripe_helper.create_plan(id: 'addon_plan', product: product.id)
|
632
655
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
633
656
|
sub.items = [{ plan: gold_plan.id, quantity: 2 }, { plan: addon_plan.id, quantity: 2 }]
|
634
657
|
expect(sub.save).to be_truthy
|
@@ -649,12 +672,12 @@ shared_examples 'Customer Subscriptions' do
|
|
649
672
|
end
|
650
673
|
|
651
674
|
it "updates a stripe customer's existing subscription with multple plans when multiple plans inside of items" do
|
652
|
-
silver_plan = stripe_helper.create_plan(id: 'silver')
|
653
|
-
gold_plan = stripe_helper.create_plan(id: 'gold')
|
654
|
-
addon1_plan = stripe_helper.create_plan(id: 'addon1')
|
655
|
-
addon2_plan = stripe_helper.create_plan(id: 'addon2')
|
656
675
|
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk)
|
657
|
-
|
676
|
+
addon1_plan = stripe_helper.create_plan(id: 'addon1', product: product.id)
|
677
|
+
sub = Stripe::Subscription.create(customer: customer.id, items: [{ plan: plan.id }, { plan: addon1_plan.id }])
|
678
|
+
|
679
|
+
gold_plan = stripe_helper.create_plan(id: 'gold', product: product.id)
|
680
|
+
addon2_plan = stripe_helper.create_plan(id: 'addon2', product: product.id)
|
658
681
|
|
659
682
|
sub.items = [{ plan: gold_plan.id, quantity: 2 }, { plan: addon2_plan.id, quantity: 2 }]
|
660
683
|
expect(sub.save).to be_truthy
|
@@ -674,9 +697,30 @@ shared_examples 'Customer Subscriptions' do
|
|
674
697
|
expect(customer.subscriptions.data.first.items.data[1].plan.to_hash).to eq(addon2_plan.to_hash)
|
675
698
|
end
|
676
699
|
|
700
|
+
it "updates a subscription's cancel_at_period_end" do
|
701
|
+
silver = stripe_helper.create_plan(id: 'silver', product: product.id)
|
702
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk)
|
703
|
+
|
704
|
+
sub = Stripe::Subscription.create({ items: [ { plan: 'silver' } ], customer: customer.id })
|
705
|
+
|
706
|
+
expect(sub.cancel_at_period_end).to be_falsey
|
707
|
+
|
708
|
+
sub.cancel_at_period_end = true
|
709
|
+
sub.save
|
710
|
+
|
711
|
+
expect(sub.save).to be_truthy
|
712
|
+
expect(sub.cancel_at_period_end).to be_truthy
|
713
|
+
expect(sub.canceled_at).to be_truthy
|
714
|
+
|
715
|
+
sub.cancel_at_period_end = false
|
716
|
+
sub.save
|
717
|
+
|
718
|
+
expect(sub.save).to be_truthy
|
719
|
+
expect(sub.cancel_at_period_end).to be_falsey
|
720
|
+
expect(sub.canceled_at).to be_falsey
|
721
|
+
end
|
722
|
+
|
677
723
|
it 'when adds coupon', live: true do
|
678
|
-
plan = stripe_helper.create_plan(id: 'plan_with_coupon2', product: { name: 'One More Test Plan' },
|
679
|
-
amount: 777)
|
680
724
|
coupon = stripe_helper.create_coupon
|
681
725
|
customer = Stripe::Customer.create(source: gen_card_tk, plan: plan.id)
|
682
726
|
subscription = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
@@ -690,8 +734,6 @@ shared_examples 'Customer Subscriptions' do
|
|
690
734
|
end
|
691
735
|
|
692
736
|
it 'when add not exist coupon' do
|
693
|
-
plan = stripe_helper.create_plan(id: 'plan_with_coupon3', product: { name: 'One More Test Plan' },
|
694
|
-
amount: 777)
|
695
737
|
customer = Stripe::Customer.create(source: gen_card_tk, plan: plan.id)
|
696
738
|
subscription = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
697
739
|
|
@@ -706,8 +748,6 @@ shared_examples 'Customer Subscriptions' do
|
|
706
748
|
end
|
707
749
|
|
708
750
|
it 'when coupon is removed' do
|
709
|
-
plan = stripe_helper.create_plan(id: 'plan_with_coupon3', product: { name: 'One More Test Plan' },
|
710
|
-
amount: 777)
|
711
751
|
customer = Stripe::Customer.create(source: gen_card_tk, plan: plan.id)
|
712
752
|
coupon = stripe_helper.create_coupon
|
713
753
|
subscription = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
@@ -721,8 +761,7 @@ shared_examples 'Customer Subscriptions' do
|
|
721
761
|
end
|
722
762
|
|
723
763
|
it "throws an error when plan does not exist" do
|
724
|
-
|
725
|
-
customer = Stripe::Customer.create(id: 'cardless', plan: 'free')
|
764
|
+
customer = Stripe::Customer.create(id: 'cardless', plan: free_plan.id)
|
726
765
|
|
727
766
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
728
767
|
sub.plan = 'gazebo'
|
@@ -736,75 +775,59 @@ shared_examples 'Customer Subscriptions' do
|
|
736
775
|
customer = Stripe::Customer.retrieve('cardless')
|
737
776
|
expect(customer.subscriptions.count).to eq(1)
|
738
777
|
expect(customer.subscriptions.data.length).to eq(1)
|
739
|
-
expect(customer.subscriptions.data.first.plan.to_hash).to eq(
|
778
|
+
expect(customer.subscriptions.data.first.plan.to_hash).to eq(free_plan.to_hash)
|
740
779
|
end
|
741
780
|
|
742
781
|
it "throws an error when subscription does not exist" do
|
743
|
-
|
744
|
-
|
745
|
-
|
746
|
-
expect { Stripe::Subscription.retrieve("gazebo") }.to raise_error {|e|
|
782
|
+
expect(stripe_helper.list_subscriptions(50).keys).to_not include("sub_NONEXIST")
|
783
|
+
expect { Stripe::Subscription.retrieve("sub_NONEXIST") }.to raise_error {|e|
|
747
784
|
expect(e).to be_a Stripe::InvalidRequestError
|
748
785
|
expect(e.http_status).to eq(404)
|
749
786
|
expect(e.message).to_not be_nil
|
750
787
|
}
|
751
|
-
|
752
|
-
customer = Stripe::Customer.retrieve('cardless')
|
753
|
-
expect(customer.subscriptions.count).to eq(1)
|
754
|
-
expect(customer.subscriptions.data.length).to eq(1)
|
755
|
-
expect(customer.subscriptions.data.first.plan.to_hash).to eq(free.to_hash)
|
756
788
|
end
|
757
789
|
|
758
790
|
[nil, 0].each do |trial_period_days|
|
759
|
-
it "
|
791
|
+
it "raises an error when updating a customer with no card, and plan trial_period_days = #{trial_period_days}", live: true do
|
760
792
|
begin
|
761
|
-
|
762
|
-
|
763
|
-
customer = Stripe::Customer.create(description: 'cardless', plan:
|
793
|
+
free_plan
|
794
|
+
paid_plan = stripe_helper.create_plan(id: 'enterprise', product: product.id, amount: 499, trial_period_days: trial_period_days)
|
795
|
+
customer = Stripe::Customer.create(description: 'cardless', plan: free_plan.id)
|
764
796
|
|
765
797
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
766
|
-
sub.plan =
|
767
|
-
|
768
|
-
expect {
|
769
|
-
|
770
|
-
|
771
|
-
expect(e.message).to_not be_nil
|
772
|
-
}
|
773
|
-
|
774
|
-
customer = Stripe::Customer.retrieve(customer.id)
|
775
|
-
expect(customer.subscriptions.count).to eq(1)
|
776
|
-
expect(customer.subscriptions.data.length).to eq(1)
|
777
|
-
expect(customer.subscriptions.data.first.plan.to_hash).to eq(free.to_hash)
|
798
|
+
sub.plan = paid_plan.id
|
799
|
+
|
800
|
+
expect {
|
801
|
+
sub.save
|
802
|
+
}.to raise_error(Stripe::InvalidRequestError, "This customer has no attached payment source")
|
778
803
|
ensure
|
779
804
|
customer.delete if customer
|
780
|
-
|
781
|
-
|
805
|
+
paid_plan.delete if paid_plan
|
806
|
+
free_plan.delete if free_plan
|
782
807
|
end
|
783
808
|
end
|
784
809
|
end
|
785
810
|
|
786
811
|
it 'updates a subscription if the customer has a free trial', live: true do
|
787
|
-
stripe_helper.create_plan(id: 'enterprise', amount: 499)
|
788
812
|
trial_end = Time.now.utc.to_i + 3600
|
789
|
-
customer
|
790
|
-
|
791
|
-
subscription = customer.subscriptions.first
|
813
|
+
customer = Stripe::Customer.create(plan: plan.id, trial_end: trial_end)
|
814
|
+
subscription = customer.subscriptions.first
|
792
815
|
subscription.quantity = 2
|
793
816
|
subscription.save
|
794
817
|
expect(subscription.quantity).to eq(2)
|
795
818
|
end
|
796
819
|
|
797
820
|
it "updates a customer with no card to a plan with a free trial" do
|
798
|
-
|
799
|
-
|
800
|
-
customer = Stripe::Customer.create(id: 'cardless', plan:
|
821
|
+
free_plan
|
822
|
+
trial_plan = stripe_helper.create_plan(id: 'trial', product: product.id, amount: 999, trial_period_days: 14)
|
823
|
+
customer = Stripe::Customer.create(id: 'cardless', plan: free_plan.id)
|
801
824
|
|
802
825
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
803
|
-
sub.plan =
|
826
|
+
sub.plan = trial_plan.id
|
804
827
|
sub.save
|
805
828
|
|
806
829
|
expect(sub.object).to eq('subscription')
|
807
|
-
expect(sub.plan.to_hash).to eq(
|
830
|
+
expect(sub.plan.to_hash).to eq(trial_plan.to_hash)
|
808
831
|
|
809
832
|
customer = Stripe::Customer.retrieve('cardless')
|
810
833
|
expect(customer.subscriptions.data).to_not be_empty
|
@@ -812,21 +835,21 @@ shared_examples 'Customer Subscriptions' do
|
|
812
835
|
expect(customer.subscriptions.data.length).to eq(1)
|
813
836
|
|
814
837
|
expect(customer.subscriptions.data.first.id).to eq(sub.id)
|
815
|
-
expect(customer.subscriptions.data.first.plan.to_hash).to eq(
|
838
|
+
expect(customer.subscriptions.data.first.plan.to_hash).to eq(trial_plan.to_hash)
|
816
839
|
expect(customer.subscriptions.data.first.customer).to eq(customer.id)
|
817
840
|
end
|
818
841
|
|
819
842
|
it "updates a customer with no card to a free plan" do
|
820
|
-
|
821
|
-
|
822
|
-
customer = Stripe::Customer.create(id: 'cardless', plan: 'free')
|
843
|
+
free_plan
|
844
|
+
customer = Stripe::Customer.create(id: 'cardless', product: product.id, plan: free_plan.id)
|
823
845
|
|
824
846
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
825
|
-
|
847
|
+
gratis_plan = stripe_helper.create_plan(id: 'gratis', product: product.id, amount: 0)
|
848
|
+
sub.plan = gratis_plan.id
|
826
849
|
sub.save
|
827
850
|
|
828
851
|
expect(sub.object).to eq('subscription')
|
829
|
-
expect(sub.plan.to_hash).to eq(
|
852
|
+
expect(sub.plan.to_hash).to eq(gratis_plan.to_hash)
|
830
853
|
|
831
854
|
customer = Stripe::Customer.retrieve('cardless')
|
832
855
|
expect(customer.subscriptions.data).to_not be_empty
|
@@ -834,17 +857,15 @@ shared_examples 'Customer Subscriptions' do
|
|
834
857
|
expect(customer.subscriptions.data.length).to eq(1)
|
835
858
|
|
836
859
|
expect(customer.subscriptions.data.first.id).to eq(sub.id)
|
837
|
-
expect(customer.subscriptions.data.first.plan.to_hash).to eq(
|
860
|
+
expect(customer.subscriptions.data.first.plan.to_hash).to eq(gratis_plan.to_hash)
|
838
861
|
expect(customer.subscriptions.data.first.customer).to eq(customer.id)
|
839
862
|
end
|
840
863
|
|
841
864
|
it "sets a card when updating a customer's subscription" do
|
842
|
-
|
843
|
-
paid = stripe_helper.create_plan(id: 'paid', amount: 499)
|
844
|
-
customer = Stripe::Customer.create(id: 'test_customer_sub', plan: 'free')
|
865
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', plan: free_plan.id)
|
845
866
|
|
846
867
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
847
|
-
sub.plan =
|
868
|
+
sub.plan = plan.id
|
848
869
|
sub.source = gen_card_tk
|
849
870
|
sub.save
|
850
871
|
|
@@ -857,11 +878,8 @@ shared_examples 'Customer Subscriptions' do
|
|
857
878
|
end
|
858
879
|
|
859
880
|
it "overrides trial length when trial end is set" do
|
860
|
-
|
861
|
-
customer = Stripe::Customer.create(id: 'test_trial_end', plan: 'trial')
|
862
|
-
|
881
|
+
customer = Stripe::Customer.create(id: 'test_trial_end', plan: plan_with_trial.id)
|
863
882
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
864
|
-
|
865
883
|
trial_end = Time.now.utc.to_i + 3600
|
866
884
|
sub.trial_end = trial_end
|
867
885
|
sub.save
|
@@ -872,8 +890,7 @@ shared_examples 'Customer Subscriptions' do
|
|
872
890
|
end
|
873
891
|
|
874
892
|
it "returns without a trial when trial_end is set to 'now'" do
|
875
|
-
|
876
|
-
customer = Stripe::Customer.create(id: 'test_trial_end', plan: 'trial')
|
893
|
+
customer = Stripe::Customer.create(id: 'test_trial_end', plan: plan_with_trial.id, default_source: 'tok_visa')
|
877
894
|
|
878
895
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
879
896
|
|
@@ -881,18 +898,15 @@ shared_examples 'Customer Subscriptions' do
|
|
881
898
|
sub.save
|
882
899
|
|
883
900
|
expect(sub.object).to eq('subscription')
|
884
|
-
expect(sub.plan.to_hash).to eq(
|
901
|
+
expect(sub.plan.to_hash).to eq(plan_with_trial.to_hash)
|
885
902
|
expect(sub.status).to eq('active')
|
886
903
|
expect(sub.trial_start).to be_nil
|
887
904
|
expect(sub.trial_end).to be_nil
|
888
905
|
end
|
889
906
|
|
890
907
|
it "changes an active subscription to a trial when trial_end is set" do
|
891
|
-
|
892
|
-
customer = Stripe::Customer.create(id: 'test_trial_end', plan: 'no_trial', source: gen_card_tk)
|
893
|
-
|
908
|
+
customer = Stripe::Customer.create(id: 'test_trial_end', plan: plan.id, source: gen_card_tk)
|
894
909
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
895
|
-
|
896
910
|
trial_end = Time.now.utc.to_i + 3600
|
897
911
|
sub.trial_end = trial_end
|
898
912
|
sub.save
|
@@ -906,8 +920,8 @@ shared_examples 'Customer Subscriptions' do
|
|
906
920
|
|
907
921
|
|
908
922
|
it "raises error when trial_end is not an integer or 'now'" do
|
909
|
-
plan
|
910
|
-
customer = Stripe::Customer.create(id: 'test_trial_end', plan:
|
923
|
+
expect(plan.trial_period_days).to be_nil
|
924
|
+
customer = Stripe::Customer.create(id: 'test_trial_end', plan: plan.id, source: gen_card_tk)
|
911
925
|
|
912
926
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
913
927
|
sub.trial_end = "gazebo"
|
@@ -921,10 +935,10 @@ shared_examples 'Customer Subscriptions' do
|
|
921
935
|
end
|
922
936
|
|
923
937
|
context "cancelling a subscription" do
|
938
|
+
let(:customer) { Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: plan.id) }
|
924
939
|
|
925
940
|
it "cancels a stripe customer's subscription", :live => true do
|
926
|
-
|
927
|
-
customer = Stripe::Customer.create(source: gen_card_tk, plan: "the truth")
|
941
|
+
customer = Stripe::Customer.create(source: gen_card_tk, plan: plan.id)
|
928
942
|
|
929
943
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
930
944
|
result = sub.delete
|
@@ -939,53 +953,11 @@ shared_examples 'Customer Subscriptions' do
|
|
939
953
|
expect(customer.subscriptions.count).to eq(0)
|
940
954
|
expect(customer.subscriptions.data.length).to eq(0)
|
941
955
|
end
|
942
|
-
|
943
|
-
it "cancels a stripe customer's subscription at period end" do
|
944
|
-
truth = stripe_helper.create_plan(id: 'the_truth')
|
945
|
-
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: "the_truth")
|
946
|
-
|
947
|
-
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
948
|
-
result = sub.delete(at_period_end: true)
|
949
|
-
|
950
|
-
expect(result.status).to eq('active')
|
951
|
-
expect(result.cancel_at_period_end).to eq(true)
|
952
|
-
expect(result.id).to eq(sub.id)
|
953
|
-
|
954
|
-
customer = Stripe::Customer.retrieve('test_customer_sub')
|
955
|
-
expect(customer.subscriptions.data).to_not be_empty
|
956
|
-
expect(customer.subscriptions.count).to eq(1)
|
957
|
-
expect(customer.subscriptions.data.length).to eq(1)
|
958
|
-
|
959
|
-
expect(customer.subscriptions.data.first.status).to eq('active')
|
960
|
-
expect(customer.subscriptions.data.first.cancel_at_period_end).to eq(true)
|
961
|
-
expect(customer.subscriptions.data.first.ended_at).to be_nil
|
962
|
-
expect(customer.subscriptions.data.first.canceled_at).to_not be_nil
|
963
|
-
end
|
964
|
-
|
965
|
-
it "resumes an at period end cancelled subscription" do
|
966
|
-
truth = stripe_helper.create_plan(id: 'the_truth')
|
967
|
-
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: "the_truth")
|
968
|
-
|
969
|
-
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
970
|
-
result = sub.delete(at_period_end: true)
|
971
|
-
|
972
|
-
sub.plan = 'the_truth'
|
973
|
-
sub.save
|
974
|
-
|
975
|
-
customer = Stripe::Customer.retrieve('test_customer_sub')
|
976
|
-
expect(customer.subscriptions.data).to_not be_empty
|
977
|
-
expect(customer.subscriptions.count).to eq(1)
|
978
|
-
expect(customer.subscriptions.data.length).to eq(1)
|
979
|
-
|
980
|
-
expect(customer.subscriptions.data.first.status).to eq('active')
|
981
|
-
expect(customer.subscriptions.data.first.cancel_at_period_end).to eq(false)
|
982
|
-
expect(customer.subscriptions.data.first.ended_at).to be_nil
|
983
|
-
expect(customer.subscriptions.data.first.canceled_at).to be_nil
|
984
|
-
end
|
985
956
|
end
|
986
957
|
|
987
958
|
it "supports 'cancelling' by updating cancel_at_period_end" do
|
988
|
-
|
959
|
+
product = stripe_helper.create_product(name: 'Truth Product')
|
960
|
+
truth = stripe_helper.create_plan(id: 'the_truth', product: product.id)
|
989
961
|
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: "the_truth")
|
990
962
|
|
991
963
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
@@ -1007,7 +979,8 @@ shared_examples 'Customer Subscriptions' do
|
|
1007
979
|
end
|
1008
980
|
|
1009
981
|
it "resumes a subscription cancelled by updating cancel_at_period_end" do
|
1010
|
-
|
982
|
+
product = stripe_helper.create_product(name: 'Truth Product')
|
983
|
+
truth = stripe_helper.create_plan(id: 'the_truth', product: product.id)
|
1011
984
|
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: "the_truth")
|
1012
985
|
|
1013
986
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
@@ -1031,7 +1004,7 @@ shared_examples 'Customer Subscriptions' do
|
|
1031
1004
|
end
|
1032
1005
|
|
1033
1006
|
it "doesn't change status of subscription when cancelling at period end" do
|
1034
|
-
trial = stripe_helper.create_plan(id: 'trial', trial_period_days: 14)
|
1007
|
+
trial = stripe_helper.create_plan(id: 'trial', product: product.id, trial_period_days: 14)
|
1035
1008
|
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: "trial")
|
1036
1009
|
|
1037
1010
|
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
@@ -1047,8 +1020,8 @@ shared_examples 'Customer Subscriptions' do
|
|
1047
1020
|
it "doesn't require a card when trial_end is present", :live => true do
|
1048
1021
|
plan = stripe_helper.create_plan(
|
1049
1022
|
:amount => 2000,
|
1023
|
+
:product => product.id,
|
1050
1024
|
:interval => 'month',
|
1051
|
-
:name => 'Amazing Gold Plan',
|
1052
1025
|
:currency => 'usd',
|
1053
1026
|
:id => 'gold'
|
1054
1027
|
)
|
@@ -1063,7 +1036,7 @@ shared_examples 'Customer Subscriptions' do
|
|
1063
1036
|
let(:subscription) { Stripe::Subscription.retrieve(customer.subscriptions.data.first.id) }
|
1064
1037
|
|
1065
1038
|
before do
|
1066
|
-
|
1039
|
+
free_plan
|
1067
1040
|
Stripe::Subscription.create({ plan: 'free', customer: customer.id })
|
1068
1041
|
end
|
1069
1042
|
|
@@ -1089,12 +1062,12 @@ shared_examples 'Customer Subscriptions' do
|
|
1089
1062
|
context "retrieve multiple subscriptions" do
|
1090
1063
|
|
1091
1064
|
it "retrieves a list of multiple subscriptions" do
|
1092
|
-
|
1093
|
-
paid = stripe_helper.create_plan(id: 'paid', amount: 499)
|
1094
|
-
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan:
|
1065
|
+
free_plan
|
1066
|
+
paid = stripe_helper.create_plan(id: 'paid', product: product.id, amount: 499)
|
1067
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: free_plan.id)
|
1095
1068
|
Stripe::Subscription.create({ plan: 'paid', customer: customer.id })
|
1096
1069
|
|
1097
|
-
subs = Stripe::Subscription.
|
1070
|
+
subs = Stripe::Subscription.list({ customer: customer.id })
|
1098
1071
|
|
1099
1072
|
expect(subs.object).to eq("list")
|
1100
1073
|
expect(subs.count).to eq(2)
|
@@ -1105,7 +1078,7 @@ shared_examples 'Customer Subscriptions' do
|
|
1105
1078
|
Stripe::Customer.create(id: 'no_subs')
|
1106
1079
|
customer = Stripe::Customer.retrieve('no_subs')
|
1107
1080
|
|
1108
|
-
list = Stripe::Subscription.
|
1081
|
+
list = Stripe::Subscription.list({ customer: customer.id })
|
1109
1082
|
|
1110
1083
|
expect(list.object).to eq("list")
|
1111
1084
|
expect(list.count).to eq(0)
|
@@ -1121,9 +1094,7 @@ shared_examples 'Customer Subscriptions' do
|
|
1121
1094
|
create_plan(
|
1122
1095
|
:amount => 500,
|
1123
1096
|
:interval => 'month',
|
1124
|
-
:product =>
|
1125
|
-
:name => 'Sample Plan'
|
1126
|
-
},
|
1097
|
+
:product => product.id,
|
1127
1098
|
:currency => 'usd',
|
1128
1099
|
:id => 'Sample5'
|
1129
1100
|
)
|