From a80e9d9bc2c66eb446713fc77a0df737d72c5492 Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Thu, 24 Oct 2019 11:37:20 +1100 Subject: [PATCH] add subscription to group --- app/controllers/subscriptions_controller.rb | 24 ++++---- .../admin/products_controller_spec.rb | 2 +- .../requests/subscriptions_controller_spec.rb | 58 ++++++++++--------- 3 files changed, 47 insertions(+), 37 deletions(-) diff --git a/app/controllers/subscriptions_controller.rb b/app/controllers/subscriptions_controller.rb index 940251b..f56df25 100644 --- a/app/controllers/subscriptions_controller.rb +++ b/app/controllers/subscriptions_controller.rb @@ -8,20 +8,20 @@ module DiscoursePatrons def create begin - subscription = ::Stripe::Subscription.create( + plan = ::Stripe::Plan.retrieve(params[:plan]) + + @subscription = ::Stripe::Subscription.create( customer: params[:customer], - items: [ - { plan: params[:plan] }, - ] + items: [ { plan: params[:plan] } ] ) - if subscription_ok(subscription) - # TODO: check group credentials - group = Group.find_by_name('group-123') + group = plan_group(plan) + + if subscription_ok && group group.add(current_user) end - render_json_dump subscription + render_json_dump @subscription rescue ::Stripe::InvalidRequestError => e return render_json_error e.message @@ -30,8 +30,12 @@ module DiscoursePatrons private - def subscription_ok(subscription) - ['active', 'trialing'].include?(subscription[:status]) + def plan_group(plan) + Group.find_by_name(plan[:metadata][:group_name]) + end + + def subscription_ok + ['active', 'trialing'].include?(@subscription[:status]) end end end diff --git a/spec/requests/admin/products_controller_spec.rb b/spec/requests/admin/products_controller_spec.rb index 06ff720..fff9a12 100644 --- a/spec/requests/admin/products_controller_spec.rb +++ b/spec/requests/admin/products_controller_spec.rb @@ -56,7 +56,7 @@ module DiscoursePatrons describe 'create' do it 'is of product type service' do ::Stripe::Product.expects(:create).with(has_entry(:type, 'service')) - post "/patrons/admin/products.json", params: { } + post "/patrons/admin/products.json", params: {} end it 'has a name' do diff --git a/spec/requests/subscriptions_controller_spec.rb b/spec/requests/subscriptions_controller_spec.rb index 508bc07..b885cc8 100644 --- a/spec/requests/subscriptions_controller_spec.rb +++ b/spec/requests/subscriptions_controller_spec.rb @@ -12,42 +12,48 @@ module DiscoursePatrons end describe "create" do - it "creates a subscription with a customer" do - ::Stripe::Subscription.expects(:create).with(has_entry(customer: 'cus_1234')) - post "/patrons/subscriptions.json", params: { customer: 'cus_1234' } - end - - it "creates a subscription with a plan" do - ::Stripe::Subscription.expects(:create).with(has_entry(items: [ plan: 'plan_1234' ])) - post "/patrons/subscriptions.json", params: { plan: 'plan_1234' } + it "creates a subscription" do + ::Stripe::Plan.expects(:retrieve).returns(metadata: { group_name: 'awesome' }) + ::Stripe::Subscription.expects(:create).with( + customer: 'cus_1234', + items: [ plan: 'plan_1234' ] + ) + post "/patrons/subscriptions.json", params: { plan: 'plan_1234', customer: 'cus_1234' } end end describe "user groups" do - let(:group) { Fabricate(:group, name: 'group-123') } + let(:group_name) { 'group-123' } + let(:group) { Fabricate(:group, name: group_name) } - it "does not add the user to the group" do - ::Stripe::Subscription.expects(:create).returns(status: 'failed') + context "plan has group in metadata" do + before do + ::Stripe::Plan.expects(:retrieve).returns(metadata: { group_name: group_name }) + end - expect { - post "/patrons/subscriptions.json", params: { plan: 'plan_1234' } - }.not_to change { group.users.count } - end + it "does not add the user to the group" do + ::Stripe::Subscription.expects(:create).returns(status: 'failed') - it "adds the user to the group when the subscription is active" do - ::Stripe::Subscription.expects(:create).returns(status: 'active') + expect { + post "/patrons/subscriptions.json", params: { plan: 'plan_1234', customer: 'cus_1234' } + }.not_to change { group.users.count } + end - expect { - post "/patrons/subscriptions.json", params: { plan: 'plan_1234' } - }.to change { group.users.count } - end + it "adds the user to the group when the subscription is active" do + ::Stripe::Subscription.expects(:create).returns(status: 'active') - it "adds the user to the group when the subscription is trialing" do - ::Stripe::Subscription.expects(:create).returns(status: 'trialing') + expect { + post "/patrons/subscriptions.json", params: { plan: 'plan_1234', customer: 'cus_1234' } + }.to change { group.users.count } + end - expect { - post "/patrons/subscriptions.json", params: { plan: 'plan_1234' } - }.to change { group.users.count } + it "adds the user to the group when the subscription is trialing" do + ::Stripe::Subscription.expects(:create).returns(status: 'trialing') + + expect { + post "/patrons/subscriptions.json", params: { plan: 'plan_1234', customer: 'cus_1234' } + }.to change { group.users.count } + end end end end