From 02995530e270d8d80e0b0179a4fac41747c44b2b Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Sun, 5 Dec 2021 10:58:09 +0000 Subject: [PATCH] Pull apart OrderCompletionReset service --- app/controllers/checkout_controller.rb | 11 +--- app/controllers/concerns/order_completion.rb | 30 +++++++++ .../payment_gateways/paypal_controller.rb | 9 +-- app/services/order_completion_reset.rb | 33 ---------- spec/services/order_completion_reset_spec.rb | 66 ------------------- 5 files changed, 34 insertions(+), 115 deletions(-) create mode 100644 app/controllers/concerns/order_completion.rb delete mode 100644 app/services/order_completion_reset.rb delete mode 100644 spec/services/order_completion_reset_spec.rb diff --git a/app/controllers/checkout_controller.rb b/app/controllers/checkout_controller.rb index e2d470b06f..6021b4299c 100644 --- a/app/controllers/checkout_controller.rb +++ b/app/controllers/checkout_controller.rb @@ -6,6 +6,7 @@ class CheckoutController < ::BaseController layout 'darkswarm' include OrderStockCheck + include OrderCompletion helper 'terms_and_conditions' helper 'checkout' @@ -56,14 +57,6 @@ class CheckoutController < ::BaseController @order.update_order! end - # Clears the cached order. Required for #current_order to return a new order - # to serve as cart. See https://github.com/spree/spree/blob/1-3-stable/core/lib/spree/core/controller_helpers/order.rb#L14 - # for details. - def expire_current_order - session[:order_id] = nil - @current_order = nil - end - private def check_authorization @@ -221,8 +214,8 @@ class CheckoutController < ::BaseController def checkout_succeeded Checkout::PostCheckoutActions.new(@order).success(params, spree_current_user) - OrderCompletionReset.new(self, @order).call + order_completion_reset(@order) session[:access_token] = current_order.token flash[:notice] = t(:order_processed_successfully) end diff --git a/app/controllers/concerns/order_completion.rb b/app/controllers/concerns/order_completion.rb new file mode 100644 index 0000000000..2b9f780d0d --- /dev/null +++ b/app/controllers/concerns/order_completion.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +module OrderCompletion + extend ActiveSupport::Concern + + def order_completion_reset(order) + distributor = order.distributor + token = order.token + + expire_current_order + build_new_order(distributor, token) + end + + private + + # Clears the cached order. Required for #current_order to return a new order to serve as cart. + # See https://github.com/spree/spree/blob/1-3-stable/core/lib/spree/core/controller_helpers/order.rb#L14 + def expire_current_order + session[:order_id] = nil + @current_order = nil + end + + # Builds an order setting the token and distributor of the one specified + def build_new_order(distributor, token) + new_order = current_order(true) + new_order.set_distributor!(distributor) + new_order.tokenized_permission.token = token + new_order.tokenized_permission.save! + end +end diff --git a/app/controllers/payment_gateways/paypal_controller.rb b/app/controllers/payment_gateways/paypal_controller.rb index deb0c1a885..6b92ee3ad9 100644 --- a/app/controllers/payment_gateways/paypal_controller.rb +++ b/app/controllers/payment_gateways/paypal_controller.rb @@ -3,6 +3,7 @@ module PaymentGateways class PaypalController < ::BaseController include OrderStockCheck + include OrderCompletion before_action :enable_embedded_shopfront before_action :destroy_orphaned_paypal_payments, only: :confirm @@ -67,12 +68,6 @@ module PaymentGateways redirect_to main_app.checkout_path end - # Clears the cached order. Required for #current_order to return a new order to serve as cart. - def expire_current_order - session[:order_id] = nil - @current_order = nil - end - private def express_checkout_request_details(order) @@ -104,8 +99,8 @@ module PaymentGateways def reset_order_when_complete return unless current_order.complete? + order_completion_reset(current_order) flash[:notice] = t(:order_processed_successfully) - OrderCompletionReset.new(self, current_order).call session[:access_token] = current_order.token end diff --git a/app/services/order_completion_reset.rb b/app/services/order_completion_reset.rb deleted file mode 100644 index a9576c3977..0000000000 --- a/app/services/order_completion_reset.rb +++ /dev/null @@ -1,33 +0,0 @@ -# frozen_string_literal: false - -# Resets a completed order by building a new order based on the one specified. -# This implements the "continue shopping" feature once an order is completed. -class OrderCompletionReset - # Constructor - # - # @param controller [#expire_current_order, #current_order] - # @param order [Spree::Order] - def initialize(controller, order) - @controller = controller - @distributor = order.distributor - @token = order.token - end - - # Expires the order currently in use and builds a new one based on it - def call - controller.expire_current_order - build_new_order - end - - private - - attr_reader :controller, :distributor, :token - - # Builds an order setting the token and distributor of the one specified - def build_new_order - new_order = controller.current_order(true) - new_order.set_distributor!(distributor) - new_order.tokenized_permission.token = token - new_order.tokenized_permission.save! - end -end diff --git a/spec/services/order_completion_reset_spec.rb b/spec/services/order_completion_reset_spec.rb deleted file mode 100644 index de05203181..0000000000 --- a/spec/services/order_completion_reset_spec.rb +++ /dev/null @@ -1,66 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -describe OrderCompletionReset do - let(:current_token) { double(:current_token) } - let(:current_distributor) { double(:distributor) } - let(:current_order) do - double( - :current_order, - token: current_token, - distributor: current_distributor - ) - end - let(:tokenized_permission) { double(:tokenized_permission, save!: true) } - let(:new_order) do - double( - :new_order, - set_distributor!: true, - tokenized_permission: tokenized_permission, - ) - end - let(:controller) do - double( - :controller, - current_order: new_order, - expire_current_order: true - ) - end - let(:reset_order_service) { described_class.new(controller, current_order) } - - before do - allow(new_order) - .to receive(:tokenized_permission) - .and_return(tokenized_permission) - - allow(tokenized_permission).to receive(:token=) - end - - describe '#call' do - it 'creates a new order' do - reset_order_service.call - expect(controller).to have_received(:current_order).once.with(true) - end - - it 'sets the new order\'s distributor to the same as the old order' do - reset_order_service.call - - expect(new_order) - .to have_received(:set_distributor!) - .with(current_distributor) - end - - it 'sets the token of the tokenized permissions' do - reset_order_service.call - - expect(new_order.tokenized_permission) - .to have_received(:token=).with(current_token) - end - - it 'persists the tokenized permissions' do - reset_order_service.call - expect(tokenized_permission).to have_received(:save!) - end - end -end