Break OrderCartReset in two steps so that memoized method current_customer (that uses memoized current_distributor) is called after reset_distributor

This commit is contained in:
Luis Ramos
2020-05-26 10:40:58 +01:00
parent cf534237cd
commit 4026e072d5
3 changed files with 22 additions and 20 deletions

View File

@@ -65,7 +65,10 @@ class EnterprisesController < BaseController
def reset_order
order = current_order(true)
OrderCartReset.new(order, params[:id], try_spree_current_user, current_customer).call
# reset_distributor must be called before any call to current_customer or current_distributor
order_cart_reset = OrderCartReset.new(order, params[:id])
order_cart_reset.reset_distributor
order_cart_reset.reset_other!(try_spree_current_user, current_customer)
rescue ActiveRecord::RecordNotFound
flash[:error] = I18n.t(:enterprise_shop_show_error)
redirect_to shops_path

View File

@@ -2,25 +2,12 @@
# Resets an order by verifying it's state and fixing any issues
class OrderCartReset
def initialize(order, distributor_id, current_user, current_customer)
def initialize(order, distributor_id)
@order = order
@distributor ||= Enterprise.is_distributor.find_by_permalink(distributor_id) ||
Enterprise.is_distributor.find(distributor_id)
@current_user = current_user
@current_customer = current_customer
end
def call
reset_distributor
reset_user_and_customer if current_user
reset_order_cycle
order.save!
end
private
attr_reader :order, :distributor, :current_user, :current_customer
def reset_distributor
if order.distributor && order.distributor != distributor
order.empty!
@@ -29,12 +16,24 @@ class OrderCartReset
order.distributor = distributor
end
def reset_user_and_customer
def reset_other!(current_user, current_customer)
reset_user_and_customer(current_user)
reset_order_cycle(current_customer)
order.save!
end
private
attr_reader :order, :distributor, :current_user
def reset_user_and_customer(current_user)
return unless current_user
order.associate_user!(current_user) if order.user.blank? || order.email.blank?
order.__send__(:associate_customer) if order.customer.nil? # Only associates existing customers
end
def reset_order_cycle
def reset_order_cycle(current_customer)
listed_order_cycles = Shop::OrderCyclesList.new(distributor, current_customer).call
if order_cycle_not_listed?(order.order_cycle, listed_order_cycles)

View File

@@ -10,7 +10,7 @@ describe OrderCartReset do
let(:new_distributor) { create(:distributor_enterprise) }
it "empties order" do
OrderCartReset.new(order, new_distributor.id.to_s, nil, nil).call
OrderCartReset.new(order, new_distributor.id.to_s).reset_distributor
expect(order.line_items).to be_empty
end
@@ -28,7 +28,7 @@ describe OrderCartReset do
it "empties order and makes order cycle nil" do
expect(order_cycle_list).to receive(:call).and_return([])
OrderCartReset.new(order, distributor.id.to_s, nil, nil).call
OrderCartReset.new(order, distributor.id.to_s).reset_other!(nil, nil)
expect(order.line_items).to be_empty
expect(order.order_cycle).to be_nil
@@ -38,7 +38,7 @@ describe OrderCartReset do
other_order_cycle = create(:simple_order_cycle, distributors: [distributor])
expect(order_cycle_list).to receive(:call).and_return([other_order_cycle])
OrderCartReset.new(order, distributor.id.to_s, nil, nil).call
OrderCartReset.new(order, distributor.id.to_s).reset_other!(nil, nil)
expect(order.order_cycle).to eq other_order_cycle
end