When there's an out of stock product in the cart, visiting the shopfront returns user to the cart

This commit is contained in:
Rohan Mitchell
2016-04-12 11:18:03 +10:00
parent b2d78e7df6
commit 9b3139dba9
3 changed files with 34 additions and 13 deletions

View File

@@ -5,6 +5,8 @@ class EnterprisesController < BaseController
# These prepended filters are in the reverse order of execution
prepend_before_filter :set_order_cycles, :require_distributor_chosen, :reset_order, only: :shop
before_filter :check_stock_levels, only: :shop
before_filter :clean_permalink, only: :check_permalink
respond_to :js, only: :permalink_checker
@@ -21,17 +23,25 @@ class EnterprisesController < BaseController
end
end
private
def clean_permalink
params[:permalink] = params[:permalink].parameterize
end
def check_stock_levels
if current_order(true).insufficient_stock_lines.present?
flash[:error] = t(:spree_inventory_error_flash_for_insufficient_quantity)
redirect_to spree.cart_path
end
end
def reset_order
distributor = Enterprise.is_distributor.find_by_permalink(params[:id]) || Enterprise.is_distributor.find(params[:id])
order = current_order(true)
if order.distributor and order.distributor != distributor
if order.distributor && order.distributor != distributor
order.empty!
order.set_order_cycle! nil
end

View File

@@ -2,13 +2,14 @@ require 'spec_helper'
describe EnterprisesController do
describe "shopping for a distributor" do
let(:order) { controller.current_order(true) }
before(:each) do
@current_distributor = create(:distributor_enterprise, with_payment_and_shipping: true)
@distributor = create(:distributor_enterprise, with_payment_and_shipping: true)
@order_cycle1 = create(:simple_order_cycle, distributors: [@distributor], orders_open_at: 2.days.ago, orders_close_at: 3.days.from_now )
@order_cycle2 = create(:simple_order_cycle, distributors: [@distributor], orders_open_at: 3.days.ago, orders_close_at: 4.days.from_now )
controller.current_order(true).distributor = @current_distributor
order.set_distributor! @current_distributor
end
it "sets the shop as the distributor on the order when shopping for the distributor" do
@@ -52,6 +53,27 @@ describe EnterprisesController do
controller.current_order.line_items.size.should == 1
end
describe "when an out of stock item is in the cart" do
let(:variant) { create(:variant, on_demand: false, on_hand: 10) }
let(:line_item) { create(:line_item, variant: variant) }
let(:order_cycle) { create(:simple_order_cycle, distributors: [@distributor], variants: [variant]) }
before do
order.set_distribution! @current_distributor, order_cycle
order.line_items << line_item
Spree::Config.set allow_backorders: false
variant.on_hand = 0
variant.save!
end
it "redirects to the cart" do
spree_get :shop, {id: @current_distributor}
response.should redirect_to spree.cart_path
end
end
it "sets order cycle if only one is available at the chosen distributor" do
@order_cycle2.destroy

View File

@@ -69,17 +69,6 @@ describe ShopController do
end
describe "producers/suppliers" do
let(:supplier) { create(:supplier_enterprise) }
let(:product) { create(:product, supplier: supplier) }
let(:order_cycle) { create(:simple_order_cycle, distributors: [distributor]) }
before do
exchange = order_cycle.exchanges.to_enterprises(distributor).outgoing.first
exchange.variants << product.master
end
end
describe "returning products" do
let(:order_cycle) { create(:simple_order_cycle, distributors: [distributor]) }
let(:exchange) { order_cycle.exchanges.to_enterprises(distributor).outgoing.first }