From 9645ec727beb359e2e6afdd5e10ce5951918c42c Mon Sep 17 00:00:00 2001 From: Rohan Mitchell Date: Wed, 9 Mar 2016 14:07:04 +1100 Subject: [PATCH] Refresh products cache when inventory items are changed --- app/models/inventory_item.rb | 11 +++++++++++ lib/open_food_network/products_cache.rb | 7 +++++++ .../open_food_network/products_cache_spec.rb | 19 +++++++++++++++++++ spec/models/inventory_item_spec.rb | 16 ++++++++++++++++ 4 files changed, 53 insertions(+) create mode 100644 spec/models/inventory_item_spec.rb diff --git a/app/models/inventory_item.rb b/app/models/inventory_item.rb index 2648e38341..60e1713612 100644 --- a/app/models/inventory_item.rb +++ b/app/models/inventory_item.rb @@ -1,3 +1,5 @@ +require 'open_food_network/products_cache' + class InventoryItem < ActiveRecord::Base attr_accessible :enterprise, :enterprise_id, :variant, :variant_id, :visible @@ -11,4 +13,13 @@ class InventoryItem < ActiveRecord::Base scope :visible, where(visible: true) scope :hidden, where(visible: false) + + after_save :refresh_products_cache + + + private + + def refresh_products_cache + OpenFoodNetwork::ProductsCache.inventory_item_changed self + end end diff --git a/lib/open_food_network/products_cache.rb b/lib/open_food_network/products_cache.rb index d5b39609d9..f6ef15829f 100644 --- a/lib/open_food_network/products_cache.rb +++ b/lib/open_food_network/products_cache.rb @@ -95,6 +95,13 @@ module OpenFoodNetwork end + def self.inventory_item_changed(inventory_item) + exchanges_featuring_variants(inventory_item.variant, distributor: inventory_item.enterprise).each do |exchange| + refresh_cache exchange.receiver, exchange.order_cycle + end + end + + private def self.exchanges_featuring_variants(variants, distributor: nil) diff --git a/spec/lib/open_food_network/products_cache_spec.rb b/spec/lib/open_food_network/products_cache_spec.rb index 6b0bc61eb2..a395873f45 100644 --- a/spec/lib/open_food_network/products_cache_spec.rb +++ b/spec/lib/open_food_network/products_cache_spec.rb @@ -386,6 +386,25 @@ module OpenFoodNetwork end end + describe "when an inventory item is changed" do + let!(:d) { create(:distributor_enterprise) } + let!(:v) { create(:variant) } + let!(:oc1) { create(:open_order_cycle, distributors: [d], variants: [v]) } + let(:oc2) { create(:open_order_cycle, distributors: [d], variants: []) } + let!(:ii) { create(:inventory_item, enterprise: d, variant: v) } + + it "updates each distribution for that enterprise+variant" do + expect(ProductsCache).to receive(:refresh_cache).with(d, oc1) + ProductsCache.inventory_item_changed ii + end + + it "doesn't update distributions that don't feature the variant" do + oc2 + expect(ProductsCache).to receive(:refresh_cache).with(d, oc2).never + ProductsCache.inventory_item_changed ii + end + end + describe "refreshing the cache" do let(:distributor) { double(:distributor) } let(:order_cycle) { double(:order_cycle) } diff --git a/spec/models/inventory_item_spec.rb b/spec/models/inventory_item_spec.rb new file mode 100644 index 0000000000..99a16d3fdb --- /dev/null +++ b/spec/models/inventory_item_spec.rb @@ -0,0 +1,16 @@ +require 'spec_helper' +require 'open_food_network/products_cache' + +describe InventoryItem do + describe "caching" do + let(:ii) { create(:inventory_item) } + + it "refreshes the products cache on save" do + expect(OpenFoodNetwork::ProductsCache).to receive(:inventory_item_changed).with(ii) + ii.visible = false + ii.save + end + + # Inventory items are not destroyed + end +end