From 8e0f2fcb35a2e89398ed5cf8553465c9f1e509b3 Mon Sep 17 00:00:00 2001 From: Rob Harrington Date: Sat, 10 Dec 2016 15:30:55 +1100 Subject: [PATCH] Adding optional manual override of line item stock level check --- app/models/spree/line_item_decorator.rb | 11 +++++++++++ spec/models/spree/line_item_spec.rb | 19 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/app/models/spree/line_item_decorator.rb b/app/models/spree/line_item_decorator.rb index 0bb1910b63..6250530c51 100644 --- a/app/models/spree/line_item_decorator.rb +++ b/app/models/spree/line_item_decorator.rb @@ -7,8 +7,12 @@ Spree::LineItem.class_eval do # Redefining here to add the inverse_of option belongs_to :order, :class_name => "Spree::Order", inverse_of: :line_items + # Allows manual skipping of stock_availability check + attr_accessor :skip_stock_check + attr_accessible :max_quantity, :final_weight_volume, :price attr_accessible :final_weight_volume, :price, :as => :api + attr_accessible :skip_stock_check before_save :calculate_final_weight_volume, if: :quantity_changed?, unless: :final_weight_volume_changed? after_save :update_units @@ -139,6 +143,13 @@ Spree::LineItem.class_eval do private + # Override of Spree validation method + # Added check for in-memory :skip_stock_check attribute + def stock_availability + return if skip_stock_check || sufficient_stock? + errors.add(:quantity, I18n.t('validation.exceeds_available_stock')) + end + def scoper return @scoper unless @scoper.nil? @scoper = OpenFoodNetwork::ScopeVariantToHub.new(order.distributor) diff --git a/spec/models/spree/line_item_spec.rb b/spec/models/spree/line_item_spec.rb index 4bd685131f..e055d089a6 100644 --- a/spec/models/spree/line_item_spec.rb +++ b/spec/models/spree/line_item_spec.rb @@ -535,5 +535,24 @@ module Spree }.to change(Spree::OptionValue, :count).by(0) end end + + describe "checking stock availability" do + let(:line_item) { LineItem.new } + + context "when skip_stock_check is not set" do + it "checks stock" do + expect(line_item).to receive(:sufficient_stock?) { true } + line_item.send(:stock_availability) + end + end + + context "when skip_stock_check is set to true" do + before { line_item.skip_stock_check = true } + it "does not check stock" do + expect(line_item).to_not receive(:sufficient_stock?) + line_item.send(:stock_availability) + end + end + end end end