From b34e7ade8cd81b67444881530f62158fdae2667d Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Fri, 13 Sep 2019 22:03:29 +1000 Subject: [PATCH] a payment model is created --- app/controllers/patrons_controller.rb | 7 +++++ .../20190913010928_create_payments_table.rb | 7 ++++- .../patrons_controller_spec.rb | 30 ++++++++++++------- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/app/controllers/patrons_controller.rb b/app/controllers/patrons_controller.rb index 181f5ab..d40c1cc 100644 --- a/app/controllers/patrons_controller.rb +++ b/app/controllers/patrons_controller.rb @@ -29,6 +29,13 @@ module DiscoursePatrons confirm: true, ) + Payment.create( + payment_intent_id: response[:id], + receipt_email: response[:receipt_email], + url: response[:charges][:url], + amount: response[:amount] + ) + rescue ::Stripe::InvalidRequestError => e response = { error: e } rescue ::Stripe::CardError => e diff --git a/db/migrate/20190913010928_create_payments_table.rb b/db/migrate/20190913010928_create_payments_table.rb index b8cff72..2c9e0f5 100644 --- a/db/migrate/20190913010928_create_payments_table.rb +++ b/db/migrate/20190913010928_create_payments_table.rb @@ -3,9 +3,14 @@ class CreatePaymentsTable < ActiveRecord::Migration[5.2] def change create_table :payments do |t| + t.integer :payment_intent_id, null: false + t.string :receipt_email, null: false + t.string :url, null: false + t.integer :amount, null: false + t.references :user, foreign_key: true t.timestamps end - # add_index :payments, [:payment_intent_id], unique: true + add_index :payments, :payment_intent_id, unique: true end end diff --git a/spec/controllers/discourse_patrons/patrons_controller_spec.rb b/spec/controllers/discourse_patrons/patrons_controller_spec.rb index 965cd0b..e156848 100644 --- a/spec/controllers/discourse_patrons/patrons_controller_spec.rb +++ b/spec/controllers/discourse_patrons/patrons_controller_spec.rb @@ -28,57 +28,67 @@ module DiscoursePatrons end describe 'create' do + let(:payment) do + { + id: 'xyz-1234', + charges: { url: '/v1/charges?payment_intent=xyz-1234' }, + amount: 9000, + receipt_email: 'hello@example.com' + } + end + before do SiteSetting.stubs(:discourse_patrons_currency).returns('AUD') SiteSetting.stubs(:discourse_patrons_secret_key).returns('xyz-678') end it 'responds ok' do - ::Stripe::PaymentIntent.expects(:create) - post :create, params: {}, format: :json + ::Stripe::PaymentIntent.expects(:create).returns(payment) + post :create, params: { receipt_email: 'hello@example.com', amount: '20.00' }, format: :json expect(response).to have_http_status(200) end - xit 'creates a payment' do - ::Stripe::PaymentIntent.expects(:create) + it 'creates a payment' do + ::Stripe::PaymentIntent.expects(:create).returns(payment) + expect { post :create, params: { receipt_email: 'hello@example.com', amount: '20.00' }, format: :json }.to change { Payment.count } end it 'has the correct amount' do - ::Stripe::PaymentIntent.expects(:create).with(has_entry(:amount, 2000)) + ::Stripe::PaymentIntent.expects(:create).with(has_entry(:amount, 2000)).returns(payment) post :create, params: { amount: '20.00' }, format: :json expect(response).to have_http_status(200) end it 'has no amount' do - ::Stripe::PaymentIntent.expects(:create).with(has_entry(:amount, 0)) + ::Stripe::PaymentIntent.expects(:create).with(has_entry(:amount, 0)).returns(payment) post :create, params: {}, format: :json expect(response).to have_http_status(200) end it 'has curency' do - ::Stripe::PaymentIntent.expects(:create).with(has_entry(:currency, 'AUD')) + ::Stripe::PaymentIntent.expects(:create).with(has_entry(:currency, 'AUD')).returns(payment) post :create, params: {}, format: :json expect(response).to have_http_status(200) end it 'has a receipt email' do - ::Stripe::PaymentIntent.expects(:create).with(has_entry(:receipt_email, 'hello@example.com')) + ::Stripe::PaymentIntent.expects(:create).with(has_entry(:receipt_email, 'hello@example.com')).returns(payment) post :create, params: { receipt_email: 'hello@example.com' }, format: :json expect(response).to have_http_status(200) end it 'has a payment method' do - ::Stripe::PaymentIntent.expects(:create).with(has_entry(:payment_method, 'xyz-1234')) + ::Stripe::PaymentIntent.expects(:create).with(has_entry(:payment_method, 'xyz-1234')).returns(payment) post :create, params: { payment_method_id: 'xyz-1234' }, format: :json expect(response).to have_http_status(200) end it 'has a description' do SiteSetting.stubs(:discourse_patrons_payment_description).returns('hello-world') - ::Stripe::PaymentIntent.expects(:create).with(has_entry(:description, 'hello-world')) + ::Stripe::PaymentIntent.expects(:create).with(has_entry(:description, 'hello-world')).returns(payment) post :create, params: {}, format: :json expect(response).to have_http_status(200) end