Pull apart OrderCompletionReset service

This commit is contained in:
Matt-Yorkley
2021-12-05 10:58:09 +00:00
parent 67b8a55273
commit 02995530e2
5 changed files with 34 additions and 115 deletions

View File

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

View File

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

View File

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

View File

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

View File

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