diff --git a/app/models/spree/stock_item_decorator.rb b/app/models/spree/stock_item_decorator.rb new file mode 100644 index 0000000000..e115225c4f --- /dev/null +++ b/app/models/spree/stock_item_decorator.rb @@ -0,0 +1,7 @@ +Spree::StockItem.class_eval do + after_save :refresh_products_cache + + def refresh_products_cache + OpenFoodNetwork::ProductsCache.variant_changed(variant) + end +end diff --git a/lib/open_food_network/integrity_checker.rb b/spec/lib/open_food_network/integrity_checker_spec.rb similarity index 100% rename from lib/open_food_network/integrity_checker.rb rename to spec/lib/open_food_network/integrity_checker_spec.rb diff --git a/spec/models/spree/stock_item_spec.rb b/spec/models/spree/stock_item_spec.rb new file mode 100644 index 0000000000..f934084784 --- /dev/null +++ b/spec/models/spree/stock_item_spec.rb @@ -0,0 +1,10 @@ +require 'spec_helper' + +describe Spree::StockItem do + let!(:variant) { create(:variant) } + + it 'refreshes the products cache on save' do + expect(OpenFoodNetwork::ProductsCache).to receive(:variant_changed).with(variant) + variant.on_hand = -2 + end +end diff --git a/spec/models/spree/variant_spec.rb b/spec/models/spree/variant_spec.rb index b5643e0109..1cf9228b52 100644 --- a/spec/models/spree/variant_spec.rb +++ b/spec/models/spree/variant_spec.rb @@ -166,7 +166,8 @@ module Spree let(:variant) { create(:variant) } it "refreshes the products cache on save" do - expect(OpenFoodNetwork::ProductsCache).to receive(:variant_changed).with(variant) + # When creating the variant both the Variant and StockItem callbacks get executed + expect(OpenFoodNetwork::ProductsCache).to receive(:variant_changed).with(variant).twice variant.sku = 'abc123' variant.save end @@ -182,7 +183,8 @@ module Spree it "refreshes the products cache for the entire product on save" do expect(OpenFoodNetwork::ProductsCache).to receive(:product_changed).with(product) - expect(OpenFoodNetwork::ProductsCache).to receive(:variant_changed).never + # The StockItem callback is still executed + expect(OpenFoodNetwork::ProductsCache).to receive(:variant_changed).once master.sku = 'abc123' master.save end