diff --git a/app/controllers/split_checkout_controller.rb b/app/controllers/split_checkout_controller.rb index 7f5ff145dc..7236106331 100644 --- a/app/controllers/split_checkout_controller.rb +++ b/app/controllers/split_checkout_controller.rb @@ -63,7 +63,7 @@ class SplitCheckoutController < ::BaseController end def selected_payment_method - @selected_payment_method ||= @order.payments.order(:created_at).last&.payment_method + @selected_payment_method ||= Checkout::PaymentMethodFetcher.new(@order).call end def update_order diff --git a/app/services/checkout/payment_method_fetcher.rb b/app/services/checkout/payment_method_fetcher.rb new file mode 100644 index 0000000000..15b1829325 --- /dev/null +++ b/app/services/checkout/payment_method_fetcher.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module Checkout + class PaymentMethodFetcher + def initialize(order) + @order = order + end + + def call + latest_payment&.payment_method + end + + private + + attr_reader :order + + def latest_payment + order.payments.order(:created_at).last + end + end +end diff --git a/spec/controllers/split_checkout_controller_spec.rb b/spec/controllers/split_checkout_controller_spec.rb index fb622ca4c1..4753782db3 100644 --- a/spec/controllers/split_checkout_controller_spec.rb +++ b/spec/controllers/split_checkout_controller_spec.rb @@ -196,7 +196,8 @@ describe SplitCheckoutController, type: :controller do context "when an external payment gateway is used" do before do - expect(controller).to receive(:selected_payment_method).at_least(:once) { payment_method } + expect(Checkout::PaymentMethodFetcher). + to receive_message_chain(:new, :call) { payment_method } expect(payment_method).to receive(:external_gateway?) { true } expect(payment_method).to receive(:external_payment_url) { "https://example.com/pay" } end diff --git a/spec/services/checkout/payment_method_fetcher_spec.rb b/spec/services/checkout/payment_method_fetcher_spec.rb new file mode 100644 index 0000000000..3607eac7fc --- /dev/null +++ b/spec/services/checkout/payment_method_fetcher_spec.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Checkout::PaymentMethodFetcher do + let!(:order) { create(:completed_order_with_totals) } + let(:payment1) { build(:payment, order: order) } + let(:payment2) { build(:payment, order: order) } + let(:service) { Checkout::PaymentMethodFetcher.new(order) } + + describe '#call' do + context "when the order has payments" do + before do + order.payments << payment1 + order.payments << payment2 + end + + it "returns the payment_method of the most recently created payment" do + expect(service.call).to eq payment2.payment_method + end + end + + context "when the order has no payments" do + it "returns nil" do + expect(service.call).to be_nil + end + end + end +end