Handle #refund! as we do with #credit!

This commit is contained in:
Pau Perez
2020-07-22 16:52:31 +02:00
parent 0f0a704147
commit c0f72f89f2
3 changed files with 52 additions and 16 deletions

View File

@@ -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,

View File

@@ -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

View File

@@ -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) }