mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-24 20:36:49 +00:00
Refresh the products cache on stock change
This ensures the cache is up-to-date when a user accesses the shopfront
and we use the appropriate stock levels.
Besides, this makes the (very annoying) ProductsCacheIntegrityCheckerJob
succeed and thus Bugsnag won't be flooded with failures anymore.
As for the implementation of this. I'm not happy at all. It's disgusting
to use `class_eval` for this but it's a good trade-off to deliver this
fix ASAP. Katuma's been experiencing this error far too long
🙈. I was working on a better implementation that required
a bit of refactoring but it was taking too much time. I'll open another
PR with it soon.
This commit is contained in:
7
app/models/spree/stock_item_decorator.rb
Normal file
7
app/models/spree/stock_item_decorator.rb
Normal file
@@ -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
|
||||
10
spec/models/spree/stock_item_spec.rb
Normal file
10
spec/models/spree/stock_item_spec.rb
Normal file
@@ -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
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user