stripe-ruby-mock 2.4.0 → 2.5.8
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/.env +2 -0
- data/.travis.yml +8 -4
- data/README.md +12 -5
- data/lib/stripe_mock/api/account_balance.rb +14 -0
- data/lib/stripe_mock/api/client.rb +4 -4
- data/lib/stripe_mock/api/conversion_rate.rb +14 -0
- data/lib/stripe_mock/api/errors.rb +25 -14
- data/lib/stripe_mock/api/instance.rb +6 -6
- data/lib/stripe_mock/api/webhooks.rb +5 -1
- data/lib/stripe_mock/client.rb +18 -2
- data/lib/stripe_mock/data/list.rb +14 -2
- data/lib/stripe_mock/data.rb +217 -56
- data/lib/stripe_mock/instance.rb +93 -8
- data/lib/stripe_mock/request_handlers/accounts.rb +34 -2
- data/lib/stripe_mock/request_handlers/balance.rb +17 -0
- data/lib/stripe_mock/request_handlers/balance_transactions.rb +18 -2
- data/lib/stripe_mock/request_handlers/charges.rb +25 -17
- data/lib/stripe_mock/request_handlers/coupons.rb +5 -4
- data/lib/stripe_mock/request_handlers/customers.rb +26 -8
- data/lib/stripe_mock/request_handlers/ephemeral_key.rb +13 -0
- data/lib/stripe_mock/request_handlers/external_accounts.rb +55 -0
- data/lib/stripe_mock/request_handlers/helpers/bank_account_helpers.rb +1 -1
- data/lib/stripe_mock/request_handlers/helpers/card_helpers.rb +9 -7
- data/lib/stripe_mock/request_handlers/helpers/coupon_helpers.rb +10 -6
- data/lib/stripe_mock/request_handlers/helpers/external_account_helpers.rb +49 -0
- data/lib/stripe_mock/request_handlers/helpers/subscription_helpers.rb +55 -15
- data/lib/stripe_mock/request_handlers/helpers/token_helpers.rb +2 -2
- data/lib/stripe_mock/request_handlers/invoices.rb +93 -14
- data/lib/stripe_mock/request_handlers/orders.rb +5 -5
- data/lib/stripe_mock/request_handlers/payouts.rb +32 -0
- data/lib/stripe_mock/request_handlers/plans.rb +1 -0
- data/lib/stripe_mock/request_handlers/products.rb +43 -0
- data/lib/stripe_mock/request_handlers/refunds.rb +10 -7
- data/lib/stripe_mock/request_handlers/subscription_items.rb +36 -0
- data/lib/stripe_mock/request_handlers/subscriptions.rb +95 -34
- data/lib/stripe_mock/request_handlers/tax_rates.rb +36 -0
- data/lib/stripe_mock/request_handlers/tokens.rb +9 -3
- data/lib/stripe_mock/request_handlers/transfers.rb +11 -5
- data/lib/stripe_mock/request_handlers/validators/param_validators.rb +10 -1
- data/lib/stripe_mock/server.rb +14 -1
- data/lib/stripe_mock/test_strategies/base.rb +7 -5
- data/lib/stripe_mock/test_strategies/live.rb +5 -0
- data/lib/stripe_mock/test_strategies/mock.rb +8 -0
- data/lib/stripe_mock/util.rb +8 -2
- data/lib/stripe_mock/version.rb +1 -1
- data/lib/stripe_mock/webhook_fixtures/account.updated.json +1 -1
- 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.updated.json +58 -0
- data/lib/stripe_mock/webhook_fixtures/customer.subscription.created.json +40 -10
- data/lib/stripe_mock/webhook_fixtures/customer.subscription.deleted.json +39 -10
- data/lib/stripe_mock/webhook_fixtures/customer.subscription.trial_will_end.json +39 -10
- data/lib/stripe_mock/webhook_fixtures/customer.subscription.updated.json +40 -11
- data/lib/stripe_mock/webhook_fixtures/invoice.created.json +3 -2
- data/lib/stripe_mock/webhook_fixtures/invoice.payment_failed.json +1 -1
- data/lib/stripe_mock/webhook_fixtures/invoice.payment_succeeded.json +92 -85
- data/lib/stripe_mock/webhook_fixtures/invoice.updated.json +3 -2
- data/lib/stripe_mock/webhook_fixtures/plan.created.json +1 -1
- data/lib/stripe_mock/webhook_fixtures/plan.deleted.json +1 -1
- data/lib/stripe_mock/webhook_fixtures/plan.updated.json +1 -1
- data/lib/stripe_mock.rb +13 -0
- data/spec/instance_spec.rb +54 -4
- data/spec/integration_examples/prepare_error_examples.rb +6 -6
- data/spec/list_spec.rb +16 -3
- data/spec/readme_spec.rb +2 -0
- data/spec/server_spec.rb +6 -2
- data/spec/shared_stripe_examples/account_examples.rb +35 -0
- data/spec/shared_stripe_examples/balance_examples.rb +11 -0
- data/spec/shared_stripe_examples/balance_transaction_examples.rb +28 -0
- data/spec/shared_stripe_examples/bank_examples.rb +28 -1
- data/spec/shared_stripe_examples/card_examples.rb +10 -3
- data/spec/shared_stripe_examples/charge_examples.rb +73 -17
- data/spec/shared_stripe_examples/coupon_examples.rb +8 -2
- data/spec/shared_stripe_examples/customer_examples.rb +54 -2
- data/spec/shared_stripe_examples/dispute_examples.rb +19 -8
- data/spec/shared_stripe_examples/ephemeral_key_examples.rb +17 -0
- data/spec/shared_stripe_examples/error_mock_examples.rb +3 -3
- data/spec/shared_stripe_examples/external_account_examples.rb +170 -0
- data/spec/shared_stripe_examples/extra_features_examples.rb +2 -0
- data/spec/shared_stripe_examples/invoice_examples.rb +314 -51
- data/spec/shared_stripe_examples/payout_examples.rb +68 -0
- data/spec/shared_stripe_examples/plan_examples.rb +37 -5
- data/spec/shared_stripe_examples/product_example.rb +65 -0
- data/spec/shared_stripe_examples/recipient_examples.rb +7 -7
- data/spec/shared_stripe_examples/refund_examples.rb +17 -11
- data/spec/shared_stripe_examples/subscription_examples.rb +463 -33
- data/spec/shared_stripe_examples/subscription_items_examples.rb +75 -0
- data/spec/shared_stripe_examples/tax_rate_examples.rb +42 -0
- data/spec/shared_stripe_examples/transfer_examples.rb +72 -23
- data/spec/shared_stripe_examples/webhook_event_examples.rb +74 -5
- data/spec/spec_helper.rb +7 -6
- data/spec/stripe_mock_spec.rb +16 -3
- data/spec/support/stripe_examples.rb +7 -1
- data/spec/util_spec.rb +35 -1
- data/stripe-ruby-mock.gemspec +1 -1
- metadata +34 -7
- data/ChangeLog.rdoc +0 -4
@@ -7,8 +7,39 @@ shared_examples 'Customer Subscriptions' do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
context "creating a new subscription" do
|
10
|
+
it "adds a new subscription to customer with none using items", :live => true do
|
11
|
+
plan = stripe_helper.create_plan(id: 'silver', product: { name: 'Silver Plan' },
|
12
|
+
amount: 4999, currency: 'usd')
|
13
|
+
customer = Stripe::Customer.create(source: gen_card_tk)
|
14
|
+
|
15
|
+
expect(customer.subscriptions.data).to be_empty
|
16
|
+
expect(customer.subscriptions.count).to eq(0)
|
17
|
+
|
18
|
+
sub = Stripe::Subscription.create({ items: [{ plan: 'silver' }],
|
19
|
+
customer: customer.id, metadata: { foo: "bar", example: "yes" } })
|
20
|
+
|
21
|
+
expect(sub.object).to eq('subscription')
|
22
|
+
expect(sub.plan.to_hash).to eq(plan.to_hash)
|
23
|
+
expect(sub.metadata.foo).to eq( "bar" )
|
24
|
+
expect(sub.metadata.example).to eq( "yes" )
|
25
|
+
|
26
|
+
customer = Stripe::Customer.retrieve(customer.id)
|
27
|
+
expect(customer.subscriptions.data).to_not be_empty
|
28
|
+
expect(customer.subscriptions.count).to eq(1)
|
29
|
+
expect(customer.subscriptions.data.length).to eq(1)
|
30
|
+
expect(customer.charges.data.length).to eq(1)
|
31
|
+
expect(customer.currency).to eq( "usd" )
|
32
|
+
|
33
|
+
expect(customer.subscriptions.data.first.id).to eq(sub.id)
|
34
|
+
expect(customer.subscriptions.data.first.plan.to_hash).to eq(plan.to_hash)
|
35
|
+
expect(customer.subscriptions.data.first.customer).to eq(customer.id)
|
36
|
+
expect(customer.subscriptions.data.first.metadata.foo).to eq( "bar" )
|
37
|
+
expect(customer.subscriptions.data.first.metadata.example).to eq( "yes" )
|
38
|
+
end
|
39
|
+
|
10
40
|
it "adds a new subscription to customer with none", :live => true do
|
11
|
-
plan = stripe_helper.create_plan(id: 'silver', name: 'Silver Plan'
|
41
|
+
plan = stripe_helper.create_plan(id: 'silver', product: { name: 'Silver Plan' },
|
42
|
+
amount: 4999, currency: 'usd')
|
12
43
|
customer = Stripe::Customer.create(source: gen_card_tk)
|
13
44
|
|
14
45
|
expect(customer.subscriptions.data).to be_empty
|
@@ -31,6 +62,38 @@ shared_examples 'Customer Subscriptions' do
|
|
31
62
|
expect(customer.subscriptions.data.first.id).to eq(sub.id)
|
32
63
|
expect(customer.subscriptions.data.first.plan.to_hash).to eq(plan.to_hash)
|
33
64
|
expect(customer.subscriptions.data.first.customer).to eq(customer.id)
|
65
|
+
expect(customer.subscriptions.data.first.billing).to eq('charge_automatically')
|
66
|
+
expect(customer.subscriptions.data.first.metadata.foo).to eq( "bar" )
|
67
|
+
expect(customer.subscriptions.data.first.metadata.example).to eq( "yes" )
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'when customer object provided' do
|
71
|
+
plan = stripe_helper.create_plan(id: 'silver', product: { name: 'Silver Plan' }, amount: 4999, currency: 'usd')
|
72
|
+
customer = Stripe::Customer.create(source: gen_card_tk)
|
73
|
+
|
74
|
+
expect(customer.subscriptions.data).to be_empty
|
75
|
+
expect(customer.subscriptions.count).to eq(0)
|
76
|
+
|
77
|
+
sub = Stripe::Subscription.create({ plan: 'silver', customer: customer, metadata: { foo: "bar", example: "yes" } })
|
78
|
+
|
79
|
+
expect(sub.object).to eq('subscription')
|
80
|
+
expect(sub.plan.to_hash).to eq(plan.to_hash)
|
81
|
+
expect(sub.billing).to eq('charge_automatically')
|
82
|
+
expect(sub.metadata.foo).to eq( "bar" )
|
83
|
+
expect(sub.metadata.example).to eq( "yes" )
|
84
|
+
|
85
|
+
customer = Stripe::Customer.retrieve(customer.id)
|
86
|
+
expect(customer.subscriptions.data).to_not be_empty
|
87
|
+
expect(customer.subscriptions.count).to eq(1)
|
88
|
+
expect(customer.subscriptions.data.length).to eq(1)
|
89
|
+
expect(customer.charges.data.length).to eq(1)
|
90
|
+
expect(customer.currency).to eq( "usd" )
|
91
|
+
|
92
|
+
expect(customer.subscriptions.data.first.id).to eq(sub.id)
|
93
|
+
expect(customer.subscriptions.data.first.plan.to_hash).to eq(plan.to_hash)
|
94
|
+
|
95
|
+
expect(customer.subscriptions.data.first.customer).to eq(customer.id)
|
96
|
+
expect(customer.subscriptions.data.first.billing).to eq('charge_automatically')
|
34
97
|
expect(customer.subscriptions.data.first.metadata.foo).to eq( "bar" )
|
35
98
|
expect(customer.subscriptions.data.first.metadata.example).to eq( "yes" )
|
36
99
|
end
|
@@ -39,13 +102,15 @@ shared_examples 'Customer Subscriptions' do
|
|
39
102
|
customer = Stripe::Customer.create(source: gen_card_tk)
|
40
103
|
expect(customer.subscriptions.count).to eq(0)
|
41
104
|
|
42
|
-
plan = stripe_helper.create_plan(id: :silver, name: 'Silver Plan'
|
105
|
+
plan = stripe_helper.create_plan(id: :silver, product: { name: 'Silver Plan' },
|
106
|
+
amount: 4999, currency: 'usd')
|
43
107
|
sub = Stripe::Subscription.create({ plan: 'silver', customer: customer.id })
|
44
108
|
customer = Stripe::Customer.retrieve(customer.id)
|
45
109
|
expect(sub.plan.to_hash).to eq(plan.to_hash)
|
46
110
|
expect(customer.subscriptions.count).to eq(1)
|
47
111
|
|
48
|
-
plan = stripe_helper.create_plan(id: 'gold', name: 'Gold Plan'
|
112
|
+
plan = stripe_helper.create_plan(id: 'gold', product: { name: 'Gold Plan' },
|
113
|
+
amount: 14999, currency: 'usd')
|
49
114
|
sub = Stripe::Subscription.create({ plan: 'gold', customer: customer.id })
|
50
115
|
customer = Stripe::Customer.retrieve(customer.id)
|
51
116
|
expect(sub.plan.to_hash).to eq(plan.to_hash)
|
@@ -53,7 +118,8 @@ shared_examples 'Customer Subscriptions' do
|
|
53
118
|
end
|
54
119
|
|
55
120
|
it 'creates a charge for the customer', live: true do
|
56
|
-
stripe_helper.create_plan(id: 'silver', name: 'Silver Plan',
|
121
|
+
stripe_helper.create_plan(id: 'silver', product: { name: 'Silver Plan' },
|
122
|
+
amount: 4999)
|
57
123
|
|
58
124
|
customer = Stripe::Customer.create(source: gen_card_tk)
|
59
125
|
Stripe::Subscription.create({ plan: 'silver', customer: customer.id, metadata: { foo: "bar", example: "yes" } })
|
@@ -64,7 +130,8 @@ shared_examples 'Customer Subscriptions' do
|
|
64
130
|
end
|
65
131
|
|
66
132
|
it 'contains coupon object', live: true do
|
67
|
-
plan = stripe_helper.create_plan(id: 'plan_with_coupon', name: 'One More Test Plan',
|
133
|
+
plan = stripe_helper.create_plan(id: 'plan_with_coupon', product: { name: 'One More Test Plan' },
|
134
|
+
amount: 777)
|
68
135
|
coupon = stripe_helper.create_coupon(id: 'free_coupon', duration: 'repeating', duration_in_months: 3)
|
69
136
|
customer = Stripe::Customer.create(source: gen_card_tk)
|
70
137
|
Stripe::Subscription.create(plan: plan.id, customer: customer.id, coupon: coupon.id)
|
@@ -73,12 +140,13 @@ shared_examples 'Customer Subscriptions' do
|
|
73
140
|
expect(customer.subscriptions.data).to be_a(Array)
|
74
141
|
expect(customer.subscriptions.data.count).to eq(1)
|
75
142
|
expect(customer.subscriptions.data.first.discount).not_to be_nil
|
76
|
-
expect(customer.subscriptions.data.first.discount).to be_a(Stripe::
|
143
|
+
expect(customer.subscriptions.data.first.discount).to be_a(Stripe::Discount)
|
77
144
|
expect(customer.subscriptions.data.first.discount.coupon.id).to eq(coupon.id)
|
78
145
|
end
|
79
146
|
|
80
147
|
it 'when coupon is not exist', live: true do
|
81
|
-
plan = stripe_helper.create_plan(id: 'plan_with_coupon', name: 'One More Test Plan',
|
148
|
+
plan = stripe_helper.create_plan(id: 'plan_with_coupon', product: { name: 'One More Test Plan' },
|
149
|
+
amount: 777)
|
82
150
|
customer = Stripe::Customer.create(source: gen_card_tk)
|
83
151
|
|
84
152
|
expect { Stripe::Subscription.create(plan: plan.id, customer: customer.id, coupon: 'none') }.to raise_error {|e|
|
@@ -92,7 +160,9 @@ shared_examples 'Customer Subscriptions' do
|
|
92
160
|
Stripe::Plan.create(
|
93
161
|
:amount => 2500,
|
94
162
|
:interval => 'month',
|
95
|
-
:
|
163
|
+
:product => {
|
164
|
+
:name => 'Test plan'
|
165
|
+
},
|
96
166
|
:currency => 'usd',
|
97
167
|
:id => 'silver',
|
98
168
|
:statement_description => "testPlan"
|
@@ -106,6 +176,24 @@ shared_examples 'Customer Subscriptions' do
|
|
106
176
|
expect(subscription.tax_percent).to eq(20)
|
107
177
|
end
|
108
178
|
|
179
|
+
it "correctly sets created when it's not provided as a parameter", live: true do
|
180
|
+
customer = Stripe::Customer.create(source: gen_card_tk)
|
181
|
+
plan = stripe_helper.create_plan(id: 'silver', product: { name: 'Silver Plan' },
|
182
|
+
amount: 4999, currency: 'usd')
|
183
|
+
subscription = Stripe::Subscription.create({ plan: 'silver', customer: customer.id })
|
184
|
+
|
185
|
+
expect(subscription.created).to eq(subscription.current_period_start)
|
186
|
+
end
|
187
|
+
|
188
|
+
it "correctly sets created when it's provided as a parameter" do
|
189
|
+
customer = Stripe::Customer.create(source: gen_card_tk)
|
190
|
+
plan = stripe_helper.create_plan(id: 'silver', product: { name: 'Silver Plan' },
|
191
|
+
amount: 4999, currency: 'usd')
|
192
|
+
subscription = Stripe::Subscription.create({ plan: 'silver', customer: customer.id, created: 1473576318 })
|
193
|
+
|
194
|
+
expect(subscription.created).to eq(1473576318)
|
195
|
+
end
|
196
|
+
|
109
197
|
it "adds additional subscription to customer with existing subscription" do
|
110
198
|
silver = stripe_helper.create_plan(id: 'silver')
|
111
199
|
gold = stripe_helper.create_plan(id: 'gold')
|
@@ -185,6 +273,18 @@ shared_examples 'Customer Subscriptions' do
|
|
185
273
|
}
|
186
274
|
end
|
187
275
|
|
276
|
+
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)
|
278
|
+
customer = Stripe::Customer.create(source: gen_card_tk)
|
279
|
+
|
280
|
+
expect{ Stripe::Subscription.create(plan: plan.id, customer: customer.id, trial: 10) }.to raise_error {|e|
|
281
|
+
expect(e).to be_a Stripe::InvalidRequestError
|
282
|
+
expect(e.http_status).to eq(400)
|
283
|
+
expect(e.param).to eq('trial')
|
284
|
+
expect(e.message).to match /Received unknown parameter/
|
285
|
+
}
|
286
|
+
end
|
287
|
+
|
188
288
|
it "subscribes a customer with no card to a plan with a free trial" do
|
189
289
|
plan = stripe_helper.create_plan(id: 'trial', amount: 999, trial_period_days: 14)
|
190
290
|
customer = Stripe::Customer.create(id: 'cardless')
|
@@ -194,6 +294,7 @@ shared_examples 'Customer Subscriptions' do
|
|
194
294
|
expect(sub.object).to eq('subscription')
|
195
295
|
expect(sub.plan.to_hash).to eq(plan.to_hash)
|
196
296
|
expect(sub.trial_end - sub.trial_start).to eq(14 * 86400)
|
297
|
+
expect(sub.billing_cycle_anchor).to be_nil
|
197
298
|
|
198
299
|
customer = Stripe::Customer.retrieve('cardless')
|
199
300
|
expect(customer.subscriptions.data).to_not be_empty
|
@@ -206,6 +307,29 @@ shared_examples 'Customer Subscriptions' do
|
|
206
307
|
expect(customer.charges.count).to eq(0)
|
207
308
|
end
|
208
309
|
|
310
|
+
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
|
+
customer = Stripe::Customer.create(id: 'cardless')
|
313
|
+
|
314
|
+
sub = Stripe::Subscription.create({ items: [ { plan: 'trial' } ], customer: customer.id })
|
315
|
+
|
316
|
+
expect(sub.object).to eq('subscription')
|
317
|
+
expect(sub.items.data[0].plan.to_hash).to eq(plan.to_hash)
|
318
|
+
# no idea how to fix this one
|
319
|
+
# expect(sub.trial_end - sub.trial_start).to eq(14 * 86400)
|
320
|
+
|
321
|
+
customer = Stripe::Customer.retrieve('cardless')
|
322
|
+
expect(customer.subscriptions.data).to_not be_empty
|
323
|
+
expect(customer.subscriptions.count).to eq(1)
|
324
|
+
expect(customer.subscriptions.data.length).to eq(1)
|
325
|
+
|
326
|
+
expect(customer.subscriptions.data.first.id).to eq(sub.id)
|
327
|
+
expect(customer.subscriptions.data.first.items.data.first.plan.to_hash).to eq(plan.to_hash)
|
328
|
+
expect(customer.subscriptions.data.first.customer).to eq(customer.id)
|
329
|
+
# No idea on this one
|
330
|
+
# expect(customer.charges.count).to eq(0)
|
331
|
+
end
|
332
|
+
|
209
333
|
it "subscribes a customer with no card to a free plan" do
|
210
334
|
plan = stripe_helper.create_plan(id: 'free_tier', amount: 0)
|
211
335
|
customer = Stripe::Customer.create(id: 'cardless')
|
@@ -238,6 +362,30 @@ shared_examples 'Customer Subscriptions' do
|
|
238
362
|
expect(sub.trial_end).to eq(trial_end)
|
239
363
|
end
|
240
364
|
|
365
|
+
it "does not override trial end when trial end is not set" do
|
366
|
+
plan = stripe_helper.create_plan(id: 'trial', amount: 999, trial_period_days: 14)
|
367
|
+
customer = Stripe::Customer.create(id: 'short_trial')
|
368
|
+
trial_end = Time.now.utc.to_i + 3600
|
369
|
+
metadata = {description: 'original description'}
|
370
|
+
|
371
|
+
sub = Stripe::Subscription.create({ plan: 'trial', customer: customer.id, trial_end: trial_end, metadata: metadata })
|
372
|
+
|
373
|
+
expect(sub.object).to eq('subscription')
|
374
|
+
expect(sub.plan.to_hash).to eq(plan.to_hash)
|
375
|
+
expect(sub.current_period_end).to eq(trial_end)
|
376
|
+
expect(sub.trial_end).to eq(trial_end)
|
377
|
+
expect(sub.metadata.description).to eq(metadata[:description])
|
378
|
+
|
379
|
+
metadata = {description: 'updated description'}
|
380
|
+
sub = Stripe::Subscription.update(sub.id, { metadata: metadata })
|
381
|
+
|
382
|
+
expect(sub.object).to eq('subscription')
|
383
|
+
expect(sub.plan.to_hash).to eq(plan.to_hash)
|
384
|
+
expect(sub.current_period_end).to eq(trial_end)
|
385
|
+
expect(sub.trial_end).to eq(trial_end) # check that the trial_end has NOT changed
|
386
|
+
expect(sub.metadata.description).to eq(metadata[:description]) # check that the description has changed
|
387
|
+
end
|
388
|
+
|
241
389
|
it "returns without a trial when trial_end is set to 'now'" do
|
242
390
|
plan = stripe_helper.create_plan(id: 'trial', amount: 999, trial_period_days: 14)
|
243
391
|
customer = Stripe::Customer.create(id: 'no_trial', source: gen_card_tk)
|
@@ -286,6 +434,137 @@ shared_examples 'Customer Subscriptions' do
|
|
286
434
|
}
|
287
435
|
end
|
288
436
|
|
437
|
+
it 'overrides current period end when billing cycle anchor is set' do
|
438
|
+
plan = stripe_helper.create_plan(id: 'plan', amount: 999)
|
439
|
+
customer = Stripe::Customer.create(source: gen_card_tk)
|
440
|
+
billing_cycle_anchor = Time.now.utc.to_i + 3600
|
441
|
+
|
442
|
+
sub = Stripe::Subscription.create({ plan: 'plan', customer: customer.id, billing_cycle_anchor: billing_cycle_anchor })
|
443
|
+
|
444
|
+
expect(sub.status).to eq('active')
|
445
|
+
expect(sub.current_period_end).to eq(billing_cycle_anchor)
|
446
|
+
expect(sub.billing_cycle_anchor).to eq(billing_cycle_anchor)
|
447
|
+
end
|
448
|
+
|
449
|
+
it 'when plan defined inside items', live: true do
|
450
|
+
plan = stripe_helper.create_plan(id: 'BASE_PRICE_PLAN1')
|
451
|
+
|
452
|
+
plan2 = stripe_helper.create_plan(id: 'PER_USER_PLAN1')
|
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
|
+
}
|
461
|
+
)
|
462
|
+
subscription = Stripe::Subscription.create(
|
463
|
+
customer: customer.id,
|
464
|
+
items: [
|
465
|
+
{ plan: plan.id, quantity: 1 },
|
466
|
+
{ plan: plan2.id, quantity: 2 }
|
467
|
+
]
|
468
|
+
)
|
469
|
+
|
470
|
+
expect(subscription.id).to match /(test_su_|sub_).+/
|
471
|
+
expect(subscription.plan).to eq nil
|
472
|
+
expect(subscription.items.data[0].plan.id).to eq plan.id
|
473
|
+
expect(subscription.items.data[1].plan.id).to eq plan2.id
|
474
|
+
expect(subscription.items.data[0].quantity).to eq 1
|
475
|
+
expect(subscription.items.data[1].quantity).to eq 2
|
476
|
+
end
|
477
|
+
|
478
|
+
it 'when plan defined inside items for trials with no card', live: true do
|
479
|
+
plan = stripe_helper.create_plan(id: 'BASE_PRICE_PLAN1')
|
480
|
+
|
481
|
+
plan2 = stripe_helper.create_plan(id: 'PER_USER_PLAN1')
|
482
|
+
customer = Stripe::Customer.create
|
483
|
+
trial_end = Time.now.utc.to_i + 3600
|
484
|
+
|
485
|
+
subscription = Stripe::Subscription.create(
|
486
|
+
customer: customer.id,
|
487
|
+
items: [
|
488
|
+
{ plan: plan.id, quantity: 1 },
|
489
|
+
{ plan: plan2.id, quantity: 2 }
|
490
|
+
],
|
491
|
+
trial_end: trial_end
|
492
|
+
)
|
493
|
+
|
494
|
+
expect(subscription.id).to match /(test_su_|sub_).+/
|
495
|
+
expect(subscription.plan).to eq nil
|
496
|
+
expect(subscription.items.data[0].plan.id).to eq plan.id
|
497
|
+
expect(subscription.items.data[1].plan.id).to eq plan2.id
|
498
|
+
end
|
499
|
+
|
500
|
+
it 'add a new subscription to bill via an invoice' do
|
501
|
+
plan = stripe_helper.create_plan(id: 'silver', product: { name: 'Silver Plan' },
|
502
|
+
amount: 4999, currency: 'usd')
|
503
|
+
customer = Stripe::Customer.create(id: 'cardless')
|
504
|
+
|
505
|
+
expect(customer.subscriptions.data).to be_empty
|
506
|
+
expect(customer.subscriptions.count).to eq(0)
|
507
|
+
|
508
|
+
sub = Stripe::Subscription.create({
|
509
|
+
plan: 'silver',
|
510
|
+
customer: customer.id,
|
511
|
+
metadata: { foo: 'bar', example: 'yes' },
|
512
|
+
billing: 'send_invoice',
|
513
|
+
days_until_due: 30,
|
514
|
+
})
|
515
|
+
|
516
|
+
expect(sub.object).to eq('subscription')
|
517
|
+
expect(sub.plan.to_hash).to eq(plan.to_hash)
|
518
|
+
expect(sub.billing).to eq 'send_invoice'
|
519
|
+
expect(sub.days_until_due).to eq 30
|
520
|
+
end
|
521
|
+
|
522
|
+
let(:subscription_header) {{
|
523
|
+
:idempotency_key => 'a_idempotency_key'
|
524
|
+
}}
|
525
|
+
|
526
|
+
it "adds a new subscription to customer with identical idempotency key" do
|
527
|
+
plan = stripe_helper.create_plan(id: 'silver', product: { name: 'Silver Plan' },
|
528
|
+
amount: 4999, currency: 'usd')
|
529
|
+
customer = Stripe::Customer.create(source: gen_card_tk)
|
530
|
+
|
531
|
+
expect(customer.subscriptions.data).to be_empty
|
532
|
+
expect(customer.subscriptions.count).to eq(0)
|
533
|
+
|
534
|
+
sub1 = Stripe::Subscription.create({ items: [{ plan: 'silver' }], customer: customer.id }, subscription_header)
|
535
|
+
sub2 = Stripe::Subscription.create({ items: [{ plan: 'silver' }], customer: customer.id }, subscription_header)
|
536
|
+
expect(sub1).to eq(sub2)
|
537
|
+
end
|
538
|
+
|
539
|
+
it "adds a new subscription to customer with different idempotency key", :live => true do
|
540
|
+
plan = stripe_helper.create_plan(id: 'silver', product: { name: 'Silver Plan' },
|
541
|
+
amount: 4999, currency: 'usd')
|
542
|
+
customer = Stripe::Customer.create(source: gen_card_tk)
|
543
|
+
|
544
|
+
expect(customer.subscriptions.data).to be_empty
|
545
|
+
expect(customer.subscriptions.count).to eq(0)
|
546
|
+
|
547
|
+
another_subscription_header = {
|
548
|
+
:idempotency_key => 'another_idempotency_key'
|
549
|
+
}
|
550
|
+
|
551
|
+
sub1 = Stripe::Subscription.create({ items: [{ plan: 'silver' }], customer: customer.id }, subscription_header)
|
552
|
+
sub2 = Stripe::Subscription.create({ items: [{ plan: 'silver' }], customer: customer.id }, another_subscription_header)
|
553
|
+
expect(sub1).not_to eq(sub2)
|
554
|
+
end
|
555
|
+
|
556
|
+
it "accepts a hash of items" do
|
557
|
+
silver = stripe_helper.create_plan(id: 'silver')
|
558
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk)
|
559
|
+
|
560
|
+
sub = Stripe::Subscription.create({ items: { '0' => { plan: 'silver' } }, customer: customer.id })
|
561
|
+
sub.delete(at_period_end: true)
|
562
|
+
|
563
|
+
expect(sub.cancel_at_period_end).to be_truthy
|
564
|
+
expect(sub.save).to be_truthy
|
565
|
+
expect(sub.cancel_at_period_end).to be_falsey
|
566
|
+
end
|
567
|
+
|
289
568
|
end
|
290
569
|
|
291
570
|
context "updating a subscription" do
|
@@ -303,7 +582,19 @@ shared_examples 'Customer Subscriptions' do
|
|
303
582
|
}
|
304
583
|
end
|
305
584
|
|
306
|
-
it "updates a stripe customer's existing subscription" do
|
585
|
+
it "updates a stripe customer's existing subscription with one plan inside items" do
|
586
|
+
silver = stripe_helper.create_plan(id: 'silver')
|
587
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk)
|
588
|
+
|
589
|
+
sub = Stripe::Subscription.create({ items: [ { plan: 'silver' } ], customer: customer.id })
|
590
|
+
sub.delete(at_period_end: true)
|
591
|
+
|
592
|
+
expect(sub.cancel_at_period_end).to be_truthy
|
593
|
+
expect(sub.save).to be_truthy
|
594
|
+
expect(sub.cancel_at_period_end).to be_falsey
|
595
|
+
end
|
596
|
+
|
597
|
+
it "updates a stripe customer's existing subscription when plan inside of items" do
|
307
598
|
silver = stripe_helper.create_plan(id: 'silver')
|
308
599
|
gold = stripe_helper.create_plan(id: 'gold')
|
309
600
|
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: 'silver')
|
@@ -332,8 +623,60 @@ shared_examples 'Customer Subscriptions' do
|
|
332
623
|
expect(customer.subscriptions.data.first.customer).to eq(customer.id)
|
333
624
|
end
|
334
625
|
|
626
|
+
it "updates a stripe customer's existing subscription with single plan when multiple plans inside of items" do
|
627
|
+
silver_plan = stripe_helper.create_plan(id: 'silver')
|
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)
|
631
|
+
|
632
|
+
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
633
|
+
sub.items = [{ plan: gold_plan.id, quantity: 2 }, { plan: addon_plan.id, quantity: 2 }]
|
634
|
+
expect(sub.save).to be_truthy
|
635
|
+
|
636
|
+
expect(sub.object).to eq('subscription')
|
637
|
+
expect(sub.plan).to be_nil
|
638
|
+
|
639
|
+
customer = Stripe::Customer.retrieve('test_customer_sub')
|
640
|
+
expect(customer.subscriptions.data).to_not be_empty
|
641
|
+
expect(customer.subscriptions.count).to eq(1)
|
642
|
+
expect(customer.subscriptions.data.length).to eq(1)
|
643
|
+
|
644
|
+
expect(customer.subscriptions.data.first.id).to eq(sub.id)
|
645
|
+
expect(customer.subscriptions.data.first.plan).to be_nil
|
646
|
+
expect(customer.subscriptions.data.first.customer).to eq(customer.id)
|
647
|
+
expect(customer.subscriptions.data.first.items.data[0].plan.to_hash).to eq(gold_plan.to_hash)
|
648
|
+
expect(customer.subscriptions.data.first.items.data[1].plan.to_hash).to eq(addon_plan.to_hash)
|
649
|
+
end
|
650
|
+
|
651
|
+
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
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk)
|
657
|
+
sub = Stripe::Subscription.create(customer: customer.id, items: [{ plan: silver_plan.id }, { plan: addon1_plan.id }])
|
658
|
+
|
659
|
+
sub.items = [{ plan: gold_plan.id, quantity: 2 }, { plan: addon2_plan.id, quantity: 2 }]
|
660
|
+
expect(sub.save).to be_truthy
|
661
|
+
|
662
|
+
expect(sub.object).to eq('subscription')
|
663
|
+
expect(sub.plan).to be_nil
|
664
|
+
|
665
|
+
customer = Stripe::Customer.retrieve('test_customer_sub')
|
666
|
+
expect(customer.subscriptions.data).to_not be_empty
|
667
|
+
expect(customer.subscriptions.count).to eq(1)
|
668
|
+
expect(customer.subscriptions.data.length).to eq(1)
|
669
|
+
|
670
|
+
expect(customer.subscriptions.data.first.id).to eq(sub.id)
|
671
|
+
expect(customer.subscriptions.data.first.plan).to be_nil
|
672
|
+
expect(customer.subscriptions.data.first.customer).to eq(customer.id)
|
673
|
+
expect(customer.subscriptions.data.first.items.data[0].plan.to_hash).to eq(gold_plan.to_hash)
|
674
|
+
expect(customer.subscriptions.data.first.items.data[1].plan.to_hash).to eq(addon2_plan.to_hash)
|
675
|
+
end
|
676
|
+
|
335
677
|
it 'when adds coupon', live: true do
|
336
|
-
plan = stripe_helper.create_plan(id: 'plan_with_coupon2', name: 'One More Test Plan',
|
678
|
+
plan = stripe_helper.create_plan(id: 'plan_with_coupon2', product: { name: 'One More Test Plan' },
|
679
|
+
amount: 777)
|
337
680
|
coupon = stripe_helper.create_coupon
|
338
681
|
customer = Stripe::Customer.create(source: gen_card_tk, plan: plan.id)
|
339
682
|
subscription = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
@@ -342,12 +685,13 @@ shared_examples 'Customer Subscriptions' do
|
|
342
685
|
subscription.save
|
343
686
|
|
344
687
|
expect(subscription.discount).not_to be_nil
|
345
|
-
expect(subscription.discount).to
|
688
|
+
expect(subscription.discount).to be_a(Stripe::Discount)
|
346
689
|
expect(subscription.discount.coupon.id).to eq(coupon.id)
|
347
690
|
end
|
348
691
|
|
349
692
|
it 'when add not exist coupon' do
|
350
|
-
plan = stripe_helper.create_plan(id: 'plan_with_coupon3', name: 'One More Test Plan',
|
693
|
+
plan = stripe_helper.create_plan(id: 'plan_with_coupon3', product: { name: 'One More Test Plan' },
|
694
|
+
amount: 777)
|
351
695
|
customer = Stripe::Customer.create(source: gen_card_tk, plan: plan.id)
|
352
696
|
subscription = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
353
697
|
|
@@ -362,7 +706,8 @@ shared_examples 'Customer Subscriptions' do
|
|
362
706
|
end
|
363
707
|
|
364
708
|
it 'when coupon is removed' do
|
365
|
-
plan = stripe_helper.create_plan(id: 'plan_with_coupon3', name: 'One More Test Plan',
|
709
|
+
plan = stripe_helper.create_plan(id: 'plan_with_coupon3', product: { name: 'One More Test Plan' },
|
710
|
+
amount: 777)
|
366
711
|
customer = Stripe::Customer.create(source: gen_card_tk, plan: plan.id)
|
367
712
|
coupon = stripe_helper.create_coupon
|
368
713
|
subscription = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
@@ -410,24 +755,32 @@ shared_examples 'Customer Subscriptions' do
|
|
410
755
|
expect(customer.subscriptions.data.first.plan.to_hash).to eq(free.to_hash)
|
411
756
|
end
|
412
757
|
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
758
|
+
[nil, 0].each do |trial_period_days|
|
759
|
+
it "throws an error when updating a customer with no card, and plan trail_period_days = #{trial_period_days}", live: true do
|
760
|
+
begin
|
761
|
+
free = stripe_helper.create_plan(id: 'free', amount: 0)
|
762
|
+
paid = stripe_helper.create_plan(id: 'enterprise', amount: 499, trial_period_days: trial_period_days)
|
763
|
+
customer = Stripe::Customer.create(description: 'cardless', plan: 'free')
|
764
|
+
|
765
|
+
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
766
|
+
sub.plan = 'enterprise'
|
767
|
+
|
768
|
+
expect { sub.save }.to raise_error {|e|
|
769
|
+
expect(e).to be_a Stripe::InvalidRequestError
|
770
|
+
expect(e.http_status).to eq(400)
|
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)
|
778
|
+
ensure
|
779
|
+
customer.delete if customer
|
780
|
+
paid.delete if paid
|
781
|
+
free.delete if free
|
782
|
+
end
|
783
|
+
end
|
431
784
|
end
|
432
785
|
|
433
786
|
it 'updates a subscription if the customer has a free trial', live: true do
|
@@ -631,6 +984,52 @@ shared_examples 'Customer Subscriptions' do
|
|
631
984
|
end
|
632
985
|
end
|
633
986
|
|
987
|
+
it "supports 'cancelling' by updating cancel_at_period_end" do
|
988
|
+
truth = stripe_helper.create_plan(id: 'the_truth')
|
989
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: "the_truth")
|
990
|
+
|
991
|
+
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
992
|
+
result = Stripe::Subscription.update(sub.id, cancel_at_period_end: true)
|
993
|
+
|
994
|
+
expect(result.status).to eq('active')
|
995
|
+
expect(result.cancel_at_period_end).to eq(true)
|
996
|
+
expect(result.id).to eq(sub.id)
|
997
|
+
|
998
|
+
customer = Stripe::Customer.retrieve('test_customer_sub')
|
999
|
+
expect(customer.subscriptions.data).to_not be_empty
|
1000
|
+
expect(customer.subscriptions.count).to eq(1)
|
1001
|
+
expect(customer.subscriptions.data.length).to eq(1)
|
1002
|
+
|
1003
|
+
expect(customer.subscriptions.data.first.status).to eq('active')
|
1004
|
+
expect(customer.subscriptions.data.first.cancel_at_period_end).to eq(true)
|
1005
|
+
expect(customer.subscriptions.data.first.ended_at).to be_nil
|
1006
|
+
expect(customer.subscriptions.data.first.canceled_at).to_not be_nil
|
1007
|
+
end
|
1008
|
+
|
1009
|
+
it "resumes a subscription cancelled by updating cancel_at_period_end" do
|
1010
|
+
truth = stripe_helper.create_plan(id: 'the_truth')
|
1011
|
+
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: "the_truth")
|
1012
|
+
|
1013
|
+
sub = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
|
1014
|
+
Stripe::Subscription.update(sub.id, cancel_at_period_end: true)
|
1015
|
+
|
1016
|
+
result = Stripe::Subscription.update(sub.id, cancel_at_period_end: false)
|
1017
|
+
|
1018
|
+
expect(result.status).to eq('active')
|
1019
|
+
expect(result.cancel_at_period_end).to eq(false)
|
1020
|
+
expect(result.id).to eq(sub.id)
|
1021
|
+
|
1022
|
+
customer = Stripe::Customer.retrieve('test_customer_sub')
|
1023
|
+
expect(customer.subscriptions.data).to_not be_empty
|
1024
|
+
expect(customer.subscriptions.count).to eq(1)
|
1025
|
+
expect(customer.subscriptions.data.length).to eq(1)
|
1026
|
+
|
1027
|
+
expect(customer.subscriptions.data.first.status).to eq('active')
|
1028
|
+
expect(customer.subscriptions.data.first.cancel_at_period_end).to eq(false)
|
1029
|
+
expect(customer.subscriptions.data.first.ended_at).to be_nil
|
1030
|
+
expect(customer.subscriptions.data.first.canceled_at).to be_nil
|
1031
|
+
end
|
1032
|
+
|
634
1033
|
it "doesn't change status of subscription when cancelling at period end" do
|
635
1034
|
trial = stripe_helper.create_plan(id: 'trial', trial_period_days: 14)
|
636
1035
|
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: "trial")
|
@@ -659,6 +1058,34 @@ shared_examples 'Customer Subscriptions' do
|
|
659
1058
|
Stripe::Subscription.create options
|
660
1059
|
end
|
661
1060
|
|
1061
|
+
context 'retrieving a single subscription' do
|
1062
|
+
let(:customer) { Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk, plan: 'free') }
|
1063
|
+
let(:subscription) { Stripe::Subscription.retrieve(customer.subscriptions.data.first.id) }
|
1064
|
+
|
1065
|
+
before do
|
1066
|
+
stripe_helper.create_plan(id: 'free', amount: 0)
|
1067
|
+
Stripe::Subscription.create({ plan: 'free', customer: customer.id })
|
1068
|
+
end
|
1069
|
+
|
1070
|
+
it 'retrieves a single subscription' do
|
1071
|
+
expect(subscription).to be_truthy
|
1072
|
+
end
|
1073
|
+
|
1074
|
+
it "includes 'items' object on retrieved subscription" do
|
1075
|
+
expect(subscription.items).to be_truthy
|
1076
|
+
expect(subscription.items.object).to eq('list')
|
1077
|
+
expect(subscription.items.data.class).to eq(Array)
|
1078
|
+
expect(subscription.items.data.count).to eq(1)
|
1079
|
+
expect(subscription.items.data.first.id).to eq('test_txn_default')
|
1080
|
+
expect(subscription.items.data.first.created).to eq(1504716183)
|
1081
|
+
expect(subscription.items.data.first.object).to eq('subscription_item')
|
1082
|
+
expect(subscription.items.data.first.plan.amount).to eq(0)
|
1083
|
+
expect(subscription.items.data.first.plan.created).to eq(1466698898)
|
1084
|
+
expect(subscription.items.data.first.plan.currency).to eq('usd')
|
1085
|
+
expect(subscription.items.data.first.quantity).to eq(2)
|
1086
|
+
end
|
1087
|
+
end
|
1088
|
+
|
662
1089
|
context "retrieve multiple subscriptions" do
|
663
1090
|
|
664
1091
|
it "retrieves a list of multiple subscriptions" do
|
@@ -690,10 +1117,13 @@ shared_examples 'Customer Subscriptions' do
|
|
690
1117
|
|
691
1118
|
it "creates a stripe customer and subscribes them to a plan with meta data", :live => true do
|
692
1119
|
|
693
|
-
stripe_helper.
|
1120
|
+
stripe_helper.
|
1121
|
+
create_plan(
|
694
1122
|
:amount => 500,
|
695
1123
|
:interval => 'month',
|
696
|
-
:
|
1124
|
+
:product => {
|
1125
|
+
:name => 'Sample Plan'
|
1126
|
+
},
|
697
1127
|
:currency => 'usd',
|
698
1128
|
:id => 'Sample5'
|
699
1129
|
)
|