From 3bcd3257a1f95a1c7e2e4ea6009d683301311e4a Mon Sep 17 00:00:00 2001 From: Rohan Mitchell Date: Fri, 29 Jan 2016 15:59:17 +1100 Subject: [PATCH] Perform refresh of products cache when supplier fee is changed --- lib/open_food_network/products_cache.rb | 29 ++++++++++++++ .../open_food_network/products_cache_spec.rb | 40 +++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/lib/open_food_network/products_cache.rb b/lib/open_food_network/products_cache.rb index 5013f5b37a..cdd4889f4c 100644 --- a/lib/open_food_network/products_cache.rb +++ b/lib/open_food_network/products_cache.rb @@ -50,6 +50,7 @@ module OpenFoodNetwork def self.enterprise_fee_changed(enterprise_fee) + refresh_supplier_fee enterprise_fee refresh_coordinator_fee enterprise_fee refresh_distributor_fee enterprise_fee end @@ -76,6 +77,19 @@ module OpenFoodNetwork end + def self.refresh_supplier_fee(enterprise_fee) + outgoing_exchanges = Set.new + + incoming_exchanges_for_enterprise_fee(enterprise_fee).each do |exchange| + outgoing_exchanges.merge outgoing_exchanges_with_variants(exchange.order_cycle, exchange.variant_ids) + end + + outgoing_exchanges.each do |exchange| + refresh_cache exchange.receiver, exchange.order_cycle + end + end + + def self.refresh_coordinator_fee(enterprise_fee) enterprise_fee.order_cycles.each do |order_cycle| order_cycle_changed order_cycle @@ -96,6 +110,21 @@ module OpenFoodNetwork end + def self.incoming_exchanges_for_enterprise_fee(enterprise_fee) + enterprise_fee.exchanges.incoming. + joins(:order_cycle). + merge(OrderCycle.dated). + merge(OrderCycle.not_closed) + end + + + def self.outgoing_exchanges_with_variants(order_cycle, variant_ids) + order_cycle.exchanges.outgoing. + joins(:exchange_variants). + where('exchange_variants.variant_id IN (?)', variant_ids) + end + + def self.refresh_cache(distributor, order_cycle) Delayed::Job.enqueue RefreshProductsCacheJob.new distributor.id, order_cycle.id end diff --git a/spec/lib/open_food_network/products_cache_spec.rb b/spec/lib/open_food_network/products_cache_spec.rb index c11565212e..1ee8e032d6 100644 --- a/spec/lib/open_food_network/products_cache_spec.rb +++ b/spec/lib/open_food_network/products_cache_spec.rb @@ -174,6 +174,46 @@ module OpenFoodNetwork let(:oc) { create(:open_order_cycle, coordinator: c) } + describe "updating exchanges when it's a supplier fee" do + let(:v) { create(:variant) } + let!(:ex1) { create(:exchange, order_cycle: oc, sender: s, receiver: c, incoming: true, variants: [v], enterprise_fees: [ef]) } + let!(:ex2) { create(:exchange, order_cycle: oc, sender: c, receiver: d1, incoming: false, variants: [v]) } + let!(:ex3) { create(:exchange, order_cycle: oc, sender: c, receiver: d2, incoming: false, variants: []) } + + before { ef.reload } + + describe "updating distributions that include one of the supplier's variants" do + it "does not update undated order cycles" do + oc.update_attributes! orders_open_at: nil, orders_close_at: nil + expect(ProductsCache).to receive(:refresh_cache).with(d1, oc).never + ProductsCache.enterprise_fee_changed ef + end + + it "updates upcoming order cycles" do + oc.update_attributes! orders_open_at: 1.week.from_now, orders_close_at: 2.weeks.from_now + expect(ProductsCache).to receive(:refresh_cache).with(d1, oc).once + ProductsCache.enterprise_fee_changed ef + end + + it "updates open order cycles" do + expect(ProductsCache).to receive(:refresh_cache).with(d1, oc).once + ProductsCache.enterprise_fee_changed ef + end + + it "does not update closed order cycles" do + oc.update_attributes! orders_open_at: 2.weeks.ago, orders_close_at: 1.week.ago + expect(ProductsCache).to receive(:refresh_cache).with(d1, oc).never + ProductsCache.enterprise_fee_changed ef + end + end + + it "doesn't update distributions that don't include any of the supplier's variants" do + expect(ProductsCache).to receive(:refresh_cache).with(d2, oc).never + ProductsCache.enterprise_fee_changed ef + end + end + + it "updates order cycles when it's a coordinator fee" do ef_coord expect(ProductsCache).to receive(:order_cycle_changed).with(oc).once