diff --git a/app/models/spree/payment/processing.rb b/app/models/spree/payment/processing.rb index ec7d154f66..f50a23ccb0 100644 --- a/app/models/spree/payment/processing.rb +++ b/app/models/spree/payment/processing.rb @@ -147,7 +147,7 @@ module Spree record_response(response) if response.success? - self.class.create(order: order, + self.class.create!(order: order, source: self, payment_method: payment_method, amount: refund_amount.abs * -1, diff --git a/spec/controllers/spree/admin/orders/payments/payments_controller_spec.rb b/spec/controllers/spree/admin/orders/payments/payments_controller_spec.rb index 27ea7dac50..8e78be69d8 100644 --- a/spec/controllers/spree/admin/orders/payments/payments_controller_spec.rb +++ b/spec/controllers/spree/admin/orders/payments/payments_controller_spec.rb @@ -142,23 +142,23 @@ describe Spree::Admin::PaymentsController, type: :controller do end describe '#fire' do + let(:payment_method) do + create( + :stripe_sca_payment_method, + distributor_ids: [create(:distributor_enterprise).id], + preferred_enterprise_id: create(:enterprise).id + ) + end + let(:order) { create(:order, state: 'complete') } + let(:payment) do + create(:payment, order: order, payment_method: payment_method, amount: order.total) + end + + let(:successful_response) { ActiveMerchant::Billing::Response.new(true, "Yay!") } + context 'on credit event' do - let(:payment_method) do - create( - :stripe_sca_payment_method, - distributor_ids: [create(:distributor_enterprise).id], - preferred_enterprise_id: create(:enterprise).id - ) - end - let(:order) { create(:order, state: 'complete') } - let(:payment) do - create(:payment, order: order, payment_method: payment_method, amount: order.total) - end - let(:params) { { e: 'credit', order_id: order.number, id: payment.id } } - let(:successful_response) { ActiveMerchant::Billing::Response.new(true, "Yay!") } - before do allow(request).to receive(:referer) { 'http://foo.com' } allow(Spree::Payment).to receive(:find).with(payment.id.to_s) { payment } @@ -191,5 +191,41 @@ describe Spree::Admin::PaymentsController, type: :controller do expect(flash[:success]).to eq(I18n.t(:payment_updated)) end end + + context 'on refund event' do + let(:params) { { e: 'refund', order_id: order.number, id: payment.id } } + + before do + allow(request).to receive(:referer) { 'http://foo.com' } + allow(Spree::Payment).to receive(:find).with(payment.id.to_s) { payment } + end + + it 'handles gateway errors' do + allow(payment.payment_method) + .to receive(:refund).and_raise(Spree::Core::GatewayError, 'error message') + + spree_put :fire, params + + expect(flash[:error]).to eq('error message') + expect(response).to redirect_to('http://foo.com') + end + + it 'handles validation errors' do + allow(payment).to receive(:refund!).and_raise(StandardError, 'validation error') + + spree_put :fire, params + + expect(flash[:error]).to eq('validation error') + expect(response).to redirect_to('http://foo.com') + end + + it 'displays a success message and redirects to the referer' do + allow(payment_method).to receive(:refund) { successful_response } + + spree_put :fire, params + + expect(flash[:success]).to eq(I18n.t(:payment_updated)) + end + end end end diff --git a/spec/models/spree/payment_spec.rb b/spec/models/spree/payment_spec.rb index 144122631b..200efab868 100644 --- a/spec/models/spree/payment_spec.rb +++ b/spec/models/spree/payment_spec.rb @@ -725,7 +725,7 @@ describe Spree::Payment do end end - describe "refunding" do + describe "refund!" do let(:payment) { create(:payment) } let(:success) { double(success?: true, authorization: 'abc123') } let(:failure) { double(success?: false) }