Skip to content

Commit 7224e76

Browse files
authored
Merge pull request #11 from ConvertKit/support-coupon-exhaustion
Raise Stripe::InvalidRequestError when attempting to apply an exhausted coupon
2 parents 26e1ec3 + 8ddfae6 commit 7224e76

File tree

4 files changed

+30
-2
lines changed

4 files changed

+30
-2
lines changed

Gemfile

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ end
77

88
group :test do
99
gem 'rake'
10+
gem 'pry'
1011
end
1112

1213
gemspec

lib/stripe_mock/request_handlers/subscriptions.rb

+12
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ def create_customer_subscription(route, method_url, params, headers)
6060
coupon = coupons[coupon_id]
6161

6262
if coupon
63+
if coupon[:times_redeemed] >= coupon[:max_redemptions]
64+
raise Stripe::InvalidRequestError.new("Coupon #{coupon[:id]} is used up and cannot be applied.", 'coupon', http_status: 400)
65+
end
66+
6367
add_coupon_to_object(subscription, coupon)
6468
else
6569
raise Stripe::InvalidRequestError.new("No such coupon: #{coupon_id}", 'coupon', http_status: 400)
@@ -135,6 +139,10 @@ def create_subscription(route, method_url, params, headers)
135139
coupon = coupons[coupon_id]
136140

137141
if coupon
142+
if coupon[:times_redeemed] >= coupon[:max_redemptions]
143+
raise Stripe::InvalidRequestError.new("Coupon #{coupon[:id]} is used up and cannot be applied.", 'coupon', http_status: 400)
144+
end
145+
138146
add_coupon_to_object(subscription, coupon)
139147
else
140148
raise Stripe::InvalidRequestError.new("No such coupon: #{coupon_id}", 'coupon', http_status: 400)
@@ -198,6 +206,10 @@ def update_subscription(route, method_url, params, headers)
198206

199207
coupon = coupons[coupon_id]
200208
if coupon
209+
if coupon[:times_redeemed] >= coupon[:max_redemptions]
210+
raise Stripe::InvalidRequestError.new("Coupon #{coupon[:id]} is used up and cannot be applied.", 'coupon', http_status: 400)
211+
end
212+
201213
add_coupon_to_object(subscription, coupon)
202214
elsif coupon_id == ""
203215
subscription[:discount] = nil

spec/shared_stripe_examples/subscription_examples.rb

+16-2
Original file line numberDiff line numberDiff line change
@@ -878,7 +878,7 @@
878878
metadata: { foo: "bar", example: "yes" },
879879
default_payment_method: payment_method_card.id,
880880
)
881-
881+
882882
subscriptions = Stripe::Subscription.list(customer: customer)
883883
expect(subscriptions.data.first.default_payment_method).to eq(payment_method_card.id)
884884

@@ -887,7 +887,7 @@
887887
default_payment_method: payment_method_sepa.id,
888888
collection_method: 'send_invoice',
889889
)
890-
890+
891891
subscriptions = Stripe::Subscription.list(customer: customer)
892892
expect(subscriptions.data.first.collection_method).to eq('send_invoice')
893893
expect(subscriptions.data.first.default_payment_method).to eq(payment_method_sepa.id)
@@ -906,6 +906,20 @@
906906
expect(subscription.discount.coupon.id).to eq(coupon.id)
907907
end
908908

909+
it 'when it attempts to add an exhausted coupon' do
910+
coupon = stripe_helper.create_coupon(max_redemptions: 1, times_redeemed: 1)
911+
customer = Stripe::Customer.create(source: gen_card_tk, plan: plan.id)
912+
subscription = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)
913+
914+
subscription.coupon = coupon.id
915+
916+
expect { subscription.save }.to raise_error {|e|
917+
expect(e).to be_a Stripe::InvalidRequestError
918+
expect(e.http_status).to eq(400)
919+
expect(e.message).to eq("Coupon #{coupon.id} is used up and cannot be applied.")
920+
}
921+
end
922+
909923
it 'when add not exist coupon' do
910924
customer = Stripe::Customer.create(source: gen_card_tk, plan: plan.id)
911925
subscription = Stripe::Subscription.retrieve(customer.subscriptions.data.first.id)

spec/spec_helper.rb

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
gem 'rspec', '~> 3.1'
44
require 'rspec'
5+
require 'pry'
56
require 'stripe'
67
require 'stripe_mock'
78
require 'stripe_mock/server'

0 commit comments

Comments
 (0)