Skip to content

Commit db74ffd

Browse files
committed
Merge remote-tracking branch 'upstream/master'
2 parents 5d48c74 + 73430a8 commit db74ffd

File tree

3 files changed

+78
-3
lines changed

3 files changed

+78
-3
lines changed

lib/stripe_mock/request_handlers/subscriptions.rb

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ def create_subscription(route, method_url, params, headers)
9797
customer[:default_source] = new_card[:id]
9898
end
9999

100-
allowed_params = %w(customer application_fee_percent coupon items metadata plan quantity source tax_percent trial_end trial_period_days current_period_start created prorate billing_cycle_anchor billing days_until_due idempotency_key enable_incomplete_payments cancel_at_period_end default_tax_rates payment_behavior pending_invoice_item_interval default_payment_method collection_method off_session trial_from_plan proration_behavior backdate_start_date expand)
100+
allowed_params = %w(customer application_fee_percent coupon items metadata plan quantity source tax_percent trial_end trial_period_days current_period_start created prorate billing_cycle_anchor billing days_until_due idempotency_key enable_incomplete_payments cancel_at_period_end default_tax_rates payment_behavior pending_invoice_item_interval default_payment_method collection_method off_session trial_from_plan proration_behavior backdate_start_date transfer_data expand)
101101
unknown_params = params.keys - allowed_params.map(&:to_sym)
102102
if unknown_params.length > 0
103103
raise Stripe::InvalidRequestError.new("Received unknown parameter: #{unknown_params.join}", unknown_params.first.to_s, http_status: 400)
@@ -132,11 +132,36 @@ def create_subscription(route, method_url, params, headers)
132132
subscription[:status] = 'trialing'
133133
end
134134

135+
if params[:payment_behavior] == 'default_incomplete'
136+
subscription[:status] = 'incomplete'
137+
end
138+
135139
if params[:cancel_at_period_end]
136140
subscription[:cancel_at_period_end] = true
137141
subscription[:canceled_at] = Time.now.utc.to_i
138142
end
139143

144+
if params[:transfer_data] && !params[:transfer_data].empty?
145+
throw Stripe::InvalidRequestError.new(missing_param_message("transfer_data[destination]")) unless params[:transfer_data][:destination]
146+
subscription[:transfer_data] = params[:transfer_data].dup
147+
subscription[:transfer_data][:amount_percent] ||= 100
148+
end
149+
150+
if (s = params[:expand]&.first { |s| s.starts_with? 'latest_invoice' })
151+
payment_intent = nil
152+
unless subscription[:status] == 'trialing'
153+
intent_status = subscription[:status] == 'incomplete' ? 'requires_payment_method' : 'succeeded'
154+
intent = Data.mock_payment_intent({
155+
status: intent_status,
156+
amount: subscription[:plan][:amount],
157+
currency: subscription[:plan][:currency]
158+
})
159+
payment_intent = s.include?('latest_invoice.payment_intent') ? intent : intent.id
160+
end
161+
invoice = Data.mock_invoice([], { payment_intent: payment_intent })
162+
subscription[:latest_invoice] = invoice
163+
end
164+
140165
subscriptions[subscription[:id]] = subscription
141166
add_subscription_to_customer(customer, subscription)
142167

@@ -298,6 +323,7 @@ def verify_card_present(customer, plan, subscription, params={})
298323
return if customer[:invoice_settings][:default_payment_method]
299324
return if customer[:trial_end]
300325
return if params[:trial_end]
326+
return if params[:payment_behavior] == 'default_incomplete'
301327
return if subscription[:default_payment_method]
302328

303329
plan_trial_period_days = plan[:trial_period_days] || 0

spec/shared_stripe_examples/subscription_examples.rb

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,27 @@
290290
expect(customer.subscriptions.count).to eq(0)
291291
end
292292

293+
it "creates a subscription when subscription's payment_behavior is default_incomplete" do
294+
plan = stripe_helper.create_plan(id: 'enterprise', product: product.id, amount: 499)
295+
customer = Stripe::Customer.create(id: 'cardless')
296+
297+
sub = Stripe::Subscription.create({ plan: plan.id, customer: customer.id, payment_behavior: 'default_incomplete' })
298+
customer = Stripe::Customer.retrieve('cardless')
299+
300+
expect(customer.subscriptions.count).to eq(1)
301+
expect(customer.subscriptions.data.first.id).to eq(sub.id)
302+
expect(customer.subscriptions.data.first.status).to eq('incomplete')
303+
end
304+
305+
it "allows setting transfer_data" do
306+
customer = Stripe::Customer.create(id: 'test_customer_sub', source: gen_card_tk)
307+
308+
sub = Stripe::Subscription.create({ customer: customer.id, plan: plan.id, transfer_data: {destination: "acct_0000000000000000", amount_percent: 50} })
309+
310+
expect(sub.transfer_data.destination).to eq("acct_0000000000000000")
311+
expect(sub.transfer_data.amount_percent).to eq(50)
312+
end
313+
293314
it "throws an error when subscribing a customer with no card" do
294315
plan = stripe_helper.create_plan(id: 'enterprise', product: product.id, amount: 499)
295316
customer = Stripe::Customer.create(id: 'cardless')
@@ -672,6 +693,35 @@
672693
expect(subscription.default_tax_rates.first.id).to eq(tax_rate.id)
673694
end
674695
end
696+
697+
it 'expands latest_invoice.payment_intent' do
698+
customer = Stripe::Customer.create(source: gen_card_tk)
699+
subscription = Stripe::Subscription.create({
700+
customer: customer.id,
701+
plan: plan.id,
702+
expand: ['latest_invoice.payment_intent']
703+
})
704+
705+
expect(subscription.latest_invoice.payment_intent.status).to eq('succeeded')
706+
707+
subscription = Stripe::Subscription.create({
708+
customer: customer.id,
709+
plan: plan.id,
710+
expand: ['latest_invoice.payment_intent'],
711+
payment_behavior: 'default_incomplete'
712+
})
713+
714+
expect(subscription.latest_invoice.payment_intent.status).to eq('requires_payment_method')
715+
716+
subscription = Stripe::Subscription.create({
717+
customer: customer.id,
718+
plan: plan.id,
719+
expand: ['latest_invoice.payment_intent'],
720+
trial_period_days: 14
721+
})
722+
723+
expect(subscription.latest_invoice.payment_intent).to be_nil
724+
end
675725
end
676726

677727
context "updating a subscription" do
@@ -1264,7 +1314,6 @@
12641314
expect(customer.subscriptions.first.metadata['foo']).to eq('bar')
12651315
end
12661316
end
1267-
12681317
end
12691318

12701319
shared_examples 'Customer Subscriptions with prices' do

stripe-ruby-mock.gemspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,5 @@ Gem::Specification.new do |gem|
2828

2929
gem.add_development_dependency 'rspec', '~> 3.7.0'
3030
gem.add_development_dependency 'rubygems-tasks', '~> 0.2'
31-
gem.add_development_dependency 'thin', '~> 1.6.4'
31+
gem.add_development_dependency 'thin', '~> 1.8.1'
3232
end

0 commit comments

Comments
 (0)