From 47df9493aee9bba535c267fabfd194508d177d33 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Fri, 2 Jun 2023 23:19:26 +0100 Subject: [PATCH 1/3] Fix ProcessPaymentIntent service --- app/services/process_payment_intent.rb | 5 ++-- .../stripe_controller_spec.rb | 26 +++++++------------ spec/services/process_payment_intent_spec.rb | 2 +- 3 files changed, 14 insertions(+), 19 deletions(-) diff --git a/app/services/process_payment_intent.rb b/app/services/process_payment_intent.rb index b18319d83d..ee13414b9c 100644 --- a/app/services/process_payment_intent.rb +++ b/app/services/process_payment_intent.rb @@ -56,8 +56,9 @@ class ProcessPaymentIntent attr_reader :order, :payment_intent, :payment def process_payment - OrderWorkflow.new(order).next if order.state == "payment" - order.process_payments! + return unless order.process_payments! && order.state == "confirmation" + + OrderWorkflow.new(order).next end def ready_for_capture? diff --git a/spec/controllers/payment_gateways/stripe_controller_spec.rb b/spec/controllers/payment_gateways/stripe_controller_spec.rb index 3984a4a382..8daf8ec871 100644 --- a/spec/controllers/payment_gateways/stripe_controller_spec.rb +++ b/spec/controllers/payment_gateways/stripe_controller_spec.rb @@ -46,21 +46,6 @@ module PaymentGateways order.payments << payment end - shared_examples "successful order completion" do - it "completes the order and redirects to the order confirmation page" do - expect(controller).to receive(:processing_succeeded).and_call_original - expect(controller).to receive(:order_completion_reset).and_call_original - - get :confirm, params: { payment_intent: "pi_123" } - - expect(order.completed?).to be true - expect(response).to redirect_to order_path(order, order_token: order.token) - expect(flash[:notice]).to eq 'Your order has been processed successfully' - end - end - - include_examples "successful order completion" - it "creates a customer record" do order.update_columns(customer_id: nil) Customer.delete_all @@ -94,7 +79,16 @@ Please try again!" order.update_attribute :state, "confirmation" end - include_examples "successful order completion" + it "completes the order and redirects to the order confirmation page" do + expect(controller).to receive(:processing_succeeded).and_call_original + expect(controller).to receive(:order_completion_reset).and_call_original + + get :confirm, params: { payment_intent: "pi_123" } + + expect(order.completed?).to be true + expect(response).to redirect_to order_path(order, order_token: order.token) + expect(flash[:notice]).to eq 'Your order has been processed successfully' + end end end diff --git a/spec/services/process_payment_intent_spec.rb b/spec/services/process_payment_intent_spec.rb index 1e7b43decd..5d9570e5c7 100644 --- a/spec/services/process_payment_intent_spec.rb +++ b/spec/services/process_payment_intent_spec.rb @@ -9,7 +9,7 @@ describe ProcessPaymentIntent do let(:customer) { create(:customer) } let(:order) { create(:order_with_totals, customer: customer, distributor: customer.enterprise, - state: "payment") + state: "confirmation") } let(:payment_method) { create(:stripe_sca_payment_method) } From abd55b210468b3cd85701873a3ed9e69f30a8b1b Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Wed, 7 Jun 2023 15:54:01 +0100 Subject: [PATCH 2/3] Move order to completed whether it's current state is payment or confirmation --- app/services/process_payment_intent.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/services/process_payment_intent.rb b/app/services/process_payment_intent.rb index ee13414b9c..be6d4f233f 100644 --- a/app/services/process_payment_intent.rb +++ b/app/services/process_payment_intent.rb @@ -56,9 +56,9 @@ class ProcessPaymentIntent attr_reader :order, :payment_intent, :payment def process_payment - return unless order.process_payments! && order.state == "confirmation" + return unless order.process_payments! - OrderWorkflow.new(order).next + OrderWorkflow.new(order).complete end def ready_for_capture? From 93c3241bb528d2500986ad567b168da353407c71 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Wed, 7 Jun 2023 15:54:32 +0100 Subject: [PATCH 3/3] Add more test coverage in stripe controller spec --- .../payment_gateways/stripe_controller_spec.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/spec/controllers/payment_gateways/stripe_controller_spec.rb b/spec/controllers/payment_gateways/stripe_controller_spec.rb index 8daf8ec871..36095c9f74 100644 --- a/spec/controllers/payment_gateways/stripe_controller_spec.rb +++ b/spec/controllers/payment_gateways/stripe_controller_spec.rb @@ -230,6 +230,16 @@ completed due to stock issues." expect(payment.state).to eq("completed") expect(payment.cvv_response_message).to be nil end + + it "moves the order state to completed" do + expect(order).to receive(:process_payments!) do + payment.complete! + end + + get :authorize, params: { order_number: order.number, payment_intent: payment_intent } + + expect(order.reload.state).to eq "complete" + end end context "when the order is already completed" do