Skip to content

Commit 37e76a2

Browse files
authored
Add support for setting cancellation_details (stripe-ruby-mock#937)
## What Makes it possible to set cancellation_details when marking a subscription for cancellation https://docs.stripe.com/api/subscriptions/update#update_subscription-cancellation_details
1 parent de626e8 commit 37e76a2

File tree

3 files changed

+55
-0
lines changed

3 files changed

+55
-0
lines changed

lib/stripe_mock/data.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,11 @@ def self.mock_subscription(params={})
420420
cancel_at_period_end: false,
421421
canceled_at: nil,
422422
collection_method: 'charge_automatically',
423+
cancellation_details: {
424+
comment: nil,
425+
feedback: nil,
426+
reason: nil
427+
},
423428
ended_at: nil,
424429
start_date: 1308595038,
425430
object: 'subscription',

lib/stripe_mock/request_handlers/helpers/subscription_helpers.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,17 @@ def custom_subscription_params(plans, cus, options = {})
4646
params.merge!(cancel_at_period_end: false, canceled_at: nil)
4747
end
4848

49+
options.fetch(:cancellation_details, {}).each do |key, value|
50+
next if value.nil?
51+
52+
if params[:cancel_at_period_end]
53+
params[:cancellation_details] ||= {}
54+
params[:cancellation_details][key] = value
55+
else
56+
raise Stripe::InvalidRequestError.new("`cancellation_details` can only be set on subscriptions that are set to cancel.", "cancellation_details", http_status: 400)
57+
end
58+
end
59+
4960
# TODO: Implement coupon logic
5061

5162
if (((plan && plan[:trial_period_days]) || 0) == 0 && options[:trial_end].nil?) || options[:trial_end] == "now"

spec/shared_stripe_examples/subscription_examples.rb

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1220,6 +1220,41 @@
12201220
expect(customer.subscriptions.count).to eq(0)
12211221
expect(customer.subscriptions.data.length).to eq(0)
12221222
end
1223+
1224+
it "supports adding a comment to cancellation_details" do
1225+
customer = Stripe::Customer.create(source: gen_card_tk, plan: plan.id)
1226+
subscription = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
1227+
1228+
result = Stripe::Subscription.update(
1229+
subscription.id,
1230+
cancel_at_period_end: true,
1231+
cancellation_details: { comment: 'Cancelled by user' }
1232+
)
1233+
1234+
expect(result.cancellation_details.comment).to eq('Cancelled by user')
1235+
end
1236+
1237+
it "supports adding feedback to cancellation_details" do
1238+
customer = Stripe::Customer.create(source: gen_card_tk, plan: plan.id)
1239+
subscription = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
1240+
1241+
result = Stripe::Subscription.update(
1242+
subscription.id,
1243+
cancel_at_period_end: true,
1244+
cancellation_details: { feedback: 'customer_service' }
1245+
)
1246+
1247+
expect(result.cancellation_details.feedback).to eq('customer_service')
1248+
end
1249+
1250+
it "raises an error if adding a comment to cancellation_details when not cancelling" do
1251+
customer = Stripe::Customer.create(source: gen_card_tk, plan: plan.id)
1252+
subscription = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
1253+
1254+
expect do
1255+
Stripe::Subscription.update(subscription.id, cancellation_details: { comment: 'Cancelled by user' })
1256+
end.to raise_error Stripe::InvalidRequestError, /can only be set on subscriptions that are set to cancel./
1257+
end
12231258
end
12241259

12251260
it "supports 'cancelling' by updating cancel_at_period_end" do
@@ -1328,6 +1363,10 @@
13281363
it "has a start_date attribute" do
13291364
expect(subscription).to respond_to(:start_date)
13301365
end
1366+
1367+
it "has cancellation_details" do
1368+
expect(subscription).to respond_to(:cancellation_details)
1369+
end
13311370
end
13321371

13331372
context "retrieve multiple subscriptions" do

0 commit comments

Comments
 (0)