From 9d2cd86f5413282d55a38d11229486ed5aebd2ed Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Tue, 23 May 2017 12:27:34 +1000 Subject: [PATCH 1/2] stripe service can create subscriptions --- app/services/discourse_donations/stripe.rb | 12 ++++ .../discourse_donations/stripe_spec.rb | 56 +++++++++++++------ 2 files changed, 50 insertions(+), 18 deletions(-) diff --git a/app/services/discourse_donations/stripe.rb b/app/services/discourse_donations/stripe.rb index f11a092..c93fffd 100644 --- a/app/services/discourse_donations/stripe.rb +++ b/app/services/discourse_donations/stripe.rb @@ -23,6 +23,18 @@ module DiscourseDonations @charge end + def subscribe(email, opts) + customer = ::Stripe::Customer.create( + email: email, + source: opts[:stripeToken] + ) + @subscription = ::Stripe::Subscription.create( + customer: customer.id, + plan: opts[:plan] + ) + @subscription + end + def successful? @charge[:paid] end diff --git a/spec/services/discourse_donations/stripe_spec.rb b/spec/services/discourse_donations/stripe_spec.rb index d7f6746..0664c09 100644 --- a/spec/services/discourse_donations/stripe_spec.rb +++ b/spec/services/discourse_donations/stripe_spec.rb @@ -6,7 +6,6 @@ module DiscourseDonations before { SiteSetting.stubs(:discourse_donations_secret_key).returns('secret-key-yo') } let(:stripe_options) { { description: 'hi there', currency: 'AUD' } } - let(:params) { { email: email, stripeToken: 'stripe-token', amount: '1234', other: 'redundant param' } } let(:email) { 'ray-zintoast@example.com' } let(:customer) { stub(id: 1) } let!(:subject) { described_class.new('secret-key-yo', stripe_options) } @@ -15,26 +14,47 @@ module DiscourseDonations expect(::Stripe.api_key).to eq 'secret-key-yo' end - it 'creates a customer and charges them an amount' do - ::Stripe::Customer.expects(:create).with( - email: email, - source: 'stripe-token' - ).returns(customer) - ::Stripe::Charge.expects(:create).with( - customer: customer.id, - amount: params[:amount], - description: stripe_options[:description], - currency: stripe_options[:currency] - ).returns( - { - paid: true, - outcome: { seller_message: 'yay!' } - } - ) - subject.charge(email, params) + describe 'subscribe' do + let(:params) { { email: email, stripeToken: 'stripe-token', plan: 'subscription-plan-1234', other: 'redundant param' } } + + it 'creates a customer and a subscription' do + ::Stripe::Customer.expects(:create).with( + email: email, + source: 'stripe-token' + ).returns(customer) + ::Stripe::Subscription.expects(:create).with( + customer: customer.id, + plan: params[:plan] + ) + subject.subscribe(email, params) + end + end + + describe 'charge' do + let(:params) { { email: email, stripeToken: 'stripe-token', amount: '1234', other: 'redundant param' } } + + it 'creates a customer and charges them an amount' do + ::Stripe::Customer.expects(:create).with( + email: email, + source: 'stripe-token' + ).returns(customer) + ::Stripe::Charge.expects(:create).with( + customer: customer.id, + amount: params[:amount], + description: stripe_options[:description], + currency: stripe_options[:currency] + ).returns( + { + paid: true, + outcome: { seller_message: 'yay!' } + } + ) + subject.charge(email, params) + end end describe '.successful?' do + let(:params) { { email: email, stripeToken: 'stripe-token', amount: '1234', other: 'redundant param' } } let(:charge_options) { { customer: customer.id, amount: params[:amount], description: stripe_options[:description], currency: stripe_options[:currency] } } before do From 17a43740d661e36fa7b83efa39f350a8edd2e99e Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Tue, 23 May 2017 14:32:52 +1000 Subject: [PATCH 2/2] fix missing strong param --- app/controllers/discourse_donations/charges_controller.rb | 2 +- plugin.rb | 2 +- .../discourse_donations/charges_controller_spec.rb | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/discourse_donations/charges_controller.rb b/app/controllers/discourse_donations/charges_controller.rb index 9efc1a9..714c325 100644 --- a/app/controllers/discourse_donations/charges_controller.rb +++ b/app/controllers/discourse_donations/charges_controller.rb @@ -7,7 +7,7 @@ module DiscourseDonations skip_before_filter :verify_authenticity_token, only: [:create] def create - params.permit(:name, :username, :email, :password, :stripeToken, :amount) + params.permit(:name, :username, :email, :password, :stripeToken, :amount, :create_account) output = { 'messages' => [], 'rewards' => [] } diff --git a/plugin.rb b/plugin.rb index a0a3a44..e32812c 100644 --- a/plugin.rb +++ b/plugin.rb @@ -1,6 +1,6 @@ # name: discourse-donations # about: Integrating Discourse with Stripe for donations -# version: 1.10.0 +# version: 1.10.1 # url: https://github.com/choiceaustralia/discourse-donations # authors: Rimian Perkins diff --git a/spec/controllers/discourse_donations/charges_controller_spec.rb b/spec/controllers/discourse_donations/charges_controller_spec.rb index 1b981cf..c69b1d6 100644 --- a/spec/controllers/discourse_donations/charges_controller_spec.rb +++ b/spec/controllers/discourse_donations/charges_controller_spec.rb @@ -24,8 +24,8 @@ module DiscourseDonations end it 'whitelists the params' do - params = { email: 'email@example.com', password: 'secret', username: 'mr-pink', name: 'kirsten', amount: 100, stripeToken: 'rrurrrurrrrr' } - should permit(:name, :username, :email, :password).for(:create, params: params) + params = { create_account: 'true', email: 'email@example.com', password: 'secret', username: 'mr-pink', name: 'kirsten', amount: 100, stripeToken: 'rrurrrurrrrr' } + should permit(:name, :username, :email, :password, :create_account).for(:create, params: params) end it 'responds ok for anonymous users' do