From dea6a01e61d1e9db1bd23c0330d267deb7151036 Mon Sep 17 00:00:00 2001 From: Pau Perez Date: Thu, 6 May 2021 16:03:25 +0200 Subject: [PATCH] Handle SCA payments that can't complete --- app/services/process_payment_intent.rb | 15 ++++++++----- spec/services/process_payment_intent_spec.rb | 22 ++++++++++++++++++++ 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/app/services/process_payment_intent.rb b/app/services/process_payment_intent.rb index bff7f40170..90d41fd3e0 100644 --- a/app/services/process_payment_intent.rb +++ b/app/services/process_payment_intent.rb @@ -23,10 +23,10 @@ class ProcessPaymentIntent end end - def initialize(payment_intent, order) + def initialize(payment_intent, order, last_payment = nil) @payment_intent = payment_intent @order = order - @last_payment = OrderPaymentFinder.new(order).last_payment + @last_payment = last_payment.presence || OrderPaymentFinder.new(order).last_payment end def call! @@ -35,10 +35,15 @@ class ProcessPaymentIntent mark_as_processed - OrderWorkflow.new(@order).next - last_payment.complete! if last_payment.can_complete? + OrderWorkflow.new(order).next + + if last_payment.can_complete? + last_payment.complete! + Result.new(ok: true) + else + Result.new(ok: false, error: "The payment could not be completed") + end - Result.new(ok: true) rescue Stripe::StripeError => e Result.new(ok: false, error: e.message) end diff --git a/spec/services/process_payment_intent_spec.rb b/spec/services/process_payment_intent_spec.rb index 2166ccb619..53af674f7d 100644 --- a/spec/services/process_payment_intent_spec.rb +++ b/spec/services/process_payment_intent_spec.rb @@ -94,5 +94,27 @@ describe ProcessPaymentIntent do expect(payment.reload.state).to eq("failed") end end + + context "when the payment can't be completed" do + let(:intent) { "pi_123" } + let(:service) { ProcessPaymentIntent.new(intent, order, payment) } + + before do + allow(payment).to receive(:can_complete?).and_return(false) + allow(validator).to receive(:call).with(intent, anything).and_return(intent) + end + + it "returns a failed result" do + result = service.call! + + expect(result.ok?).to eq(false) + expect(result.error).to eq("The payment could not be completed") + end + + it "does not complete the payment" do + service.call! + expect(payment.reload.state).to eq("pending") + end + end end end