Skip to content

Commit

Permalink
Break OrderCartReset in two steps so that memoized method current_cus…
Browse files Browse the repository at this point in the history
…tomer (that uses memoized current_distributor) is called after reset_distributor
  • Loading branch information
luisramos0 committed May 26, 2020
1 parent cf53423 commit d3317e2
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 20 deletions.
6 changes: 5 additions & 1 deletion app/controllers/enterprises_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,11 @@ def enough_stock?
def reset_order
order = current_order(true)

OrderCartReset.new(order, params[:id], try_spree_current_user, current_customer).call
# Reseting order in two steps is necessary
# because memoized current_customer needs to called after reset_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
Expand Down
31 changes: 15 additions & 16 deletions app/services/order_cart_reset.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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!
Expand All @@ -29,12 +16,24 @@ def reset_distributor
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)
Expand Down
6 changes: 3 additions & 3 deletions spec/services/order_cart_reset_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
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
Expand All @@ -28,7 +28,7 @@
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
Expand All @@ -38,7 +38,7 @@
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
Expand Down

0 comments on commit d3317e2

Please sign in to comment.