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:
Pau Perez
2019-05-31 09:48:39 +02:00
parent 545c7c99ed
commit 7ea10f6d98
3 changed files with 21 additions and 2 deletions

View 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

View 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

View File

@@ -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