diff --git a/app/models/spree/line_item_decorator.rb b/app/models/spree/line_item_decorator.rb index 6250530c51..11c9d36850 100644 --- a/app/models/spree/line_item_decorator.rb +++ b/app/models/spree/line_item_decorator.rb @@ -131,7 +131,9 @@ Spree::LineItem.class_eval do # MONKEYPATCH of Spree method # Enables scoping of variant to hub/shop, so we check stock against relevant overrides if they exist + # Also skips stock check if requested quantity is zero def sufficient_stock? + return true if quantity == 0 # This line added scoper.scope(variant) # This line added return true if Spree::Config[:allow_backorders] if new_record? || !order.completed? diff --git a/spec/models/spree/line_item_spec.rb b/spec/models/spree/line_item_spec.rb index 2d32674d0f..cb1755f60c 100644 --- a/spec/models/spree/line_item_spec.rb +++ b/spec/models/spree/line_item_spec.rb @@ -76,6 +76,12 @@ module Spree expect(li.max_quantity).to eq 10 end + it "caps at zero when stock is negative" do + v.update_attributes(on_hand: -2) + li.cap_quantity_at_stock! + expect(li.reload.quantity).to eq 0 + end + context "when a variant override is in place" do let!(:hub) { create(:distributor_enterprise) } let!(:vo) { create(:variant_override, hub: hub, variant: v, count_on_hand: 2) } @@ -92,6 +98,16 @@ module Spree li.cap_quantity_at_stock! expect(li.quantity).to eq 2 end + + context "when count on hand is negative" do + before { vo.update_attributes(count_on_hand: -3) } + + it "caps at zero" do + v.update_attributes(on_hand: -2) + li.cap_quantity_at_stock! + expect(li.reload.quantity).to eq 0 + end + end end end