From 759f50b43f36ea55ba12672c5ffa227f74fbcbda Mon Sep 17 00:00:00 2001 From: Josh Cass Date: Wed, 22 May 2019 16:53:48 -0600 Subject: [PATCH] Fix subscription examples when running specs in live mode * Stripe returns an instance of `Stripe::Discount` and not a basic `Stripe::StripeObject` * Additionally while here update the add_coupon helper to allow it to add discount/coupon to other types of objects besides customers and ensure that we are returning an instance of `Stripe::Discount` with correct parameters in all cases where we would expect Stripe to do so. --- lib/stripe_mock/request_handlers/customers.rb | 4 ++-- .../helpers/coupon_helpers.rb | 21 +++++++++---------- .../request_handlers/subscriptions.rb | 8 +++---- .../subscription_examples.rb | 4 ++-- 4 files changed, 18 insertions(+), 19 deletions(-) diff --git a/lib/stripe_mock/request_handlers/customers.rb b/lib/stripe_mock/request_handlers/customers.rb index 4928715df..28dc9fd81 100644 --- a/lib/stripe_mock/request_handlers/customers.rb +++ b/lib/stripe_mock/request_handlers/customers.rb @@ -51,7 +51,7 @@ def new_customer(route, method_url, params, headers) coupon = coupons[ params[:coupon] ] assert_existence :coupon, params[:coupon], coupon - add_coupon_to_customer(customers[params[:id]], coupon) + add_coupon_to_object(customers[params[:id]], coupon) end customers[ params[:id] ] @@ -90,7 +90,7 @@ def update_customer(route, method_url, params, headers) coupon = coupons[ params[:coupon] ] assert_existence :coupon, params[:coupon], coupon - add_coupon_to_customer(cus, coupon) + add_coupon_to_object(cus, coupon) end cus diff --git a/lib/stripe_mock/request_handlers/helpers/coupon_helpers.rb b/lib/stripe_mock/request_handlers/helpers/coupon_helpers.rb index dbba39313..ac4e0ce40 100644 --- a/lib/stripe_mock/request_handlers/helpers/coupon_helpers.rb +++ b/lib/stripe_mock/request_handlers/helpers/coupon_helpers.rb @@ -1,18 +1,17 @@ module StripeMock module RequestHandlers module Helpers + def add_coupon_to_object(object, coupon) + discount_attrs = {}.tap do |attrs| + attrs[object[:object]] = object[:id] + attrs[:coupon] = coupon + attrs[:start] = Time.now.to_i + attrs[:end] = (DateTime.now >> coupon[:duration_in_months].to_i).to_time.to_i if coupon[:duration] == 'repeating' + end - def add_coupon_to_customer(customer, coupon) - customer[:discount] = { - coupon: coupon, - customer: customer[:id], - start: Time.now.to_i, - } - customer[:discount][:end] = (DateTime.now >> coupon[:duration_in_months]).to_time.to_i if coupon[:duration].to_sym == :repeating && coupon[:duration_in_months] - - customer + object[:discount] = Stripe::Discount.construct_from(discount_attrs) + object end - end end -end \ No newline at end of file +end diff --git a/lib/stripe_mock/request_handlers/subscriptions.rb b/lib/stripe_mock/request_handlers/subscriptions.rb index 6e29d4fbf..c9a261521 100644 --- a/lib/stripe_mock/request_handlers/subscriptions.rb +++ b/lib/stripe_mock/request_handlers/subscriptions.rb @@ -60,7 +60,7 @@ def create_customer_subscription(route, method_url, params, headers) coupon = coupons[coupon_id] if coupon - subscription[:discount] = Stripe::Util.convert_to_stripe_object({ coupon: coupon }, {}) + add_coupon_to_object(subscription, coupon) else raise Stripe::InvalidRequestError.new("No such coupon: #{coupon_id}", 'coupon', http_status: 400) end @@ -117,7 +117,7 @@ def create_subscription(route, method_url, params, headers) coupon = coupons[coupon_id] if coupon - subscription[:discount] = Stripe::Util.convert_to_stripe_object({ coupon: coupon }, {}) + add_coupon_to_object(subscription, coupon) else raise Stripe::InvalidRequestError.new("No such coupon: #{coupon_id}", 'coupon', http_status: 400) end @@ -174,9 +174,9 @@ def update_subscription(route, method_url, params, headers) coupon = coupons[coupon_id] if coupon - subscription[:discount] = Stripe::Util.convert_to_stripe_object({ coupon: coupon }, {}) + add_coupon_to_object(subscription, coupon) elsif coupon_id == "" - subscription[:discount] = Stripe::Util.convert_to_stripe_object(nil, {}) + subscription[:discount] = nil else raise Stripe::InvalidRequestError.new("No such coupon: #{coupon_id}", 'coupon', http_status: 400) end diff --git a/spec/shared_stripe_examples/subscription_examples.rb b/spec/shared_stripe_examples/subscription_examples.rb index af76b713f..b0f0ccda1 100644 --- a/spec/shared_stripe_examples/subscription_examples.rb +++ b/spec/shared_stripe_examples/subscription_examples.rb @@ -140,7 +140,7 @@ def gen_card_tk expect(customer.subscriptions.data).to be_a(Array) expect(customer.subscriptions.data.count).to eq(1) expect(customer.subscriptions.data.first.discount).not_to be_nil - expect(customer.subscriptions.data.first.discount).to be_a(Stripe::StripeObject) + expect(customer.subscriptions.data.first.discount).to be_a(Stripe::Discount) expect(customer.subscriptions.data.first.discount.coupon.id).to eq(coupon.id) end @@ -614,7 +614,7 @@ def gen_card_tk subscription.save expect(subscription.discount).not_to be_nil - expect(subscription.discount).to be_an_instance_of(Stripe::StripeObject) + expect(subscription.discount).to be_a(Stripe::Discount) expect(subscription.discount.coupon.id).to eq(coupon.id) end