diff --git a/app/controllers/spree/admin/variants_controller_decorator.rb b/app/controllers/spree/admin/variants_controller_decorator.rb index f93c6fcafc..a87155b300 100644 --- a/app/controllers/spree/admin/variants_controller_decorator.rb +++ b/app/controllers/spree/admin/variants_controller_decorator.rb @@ -10,7 +10,8 @@ Spree::Admin::VariantsController.class_eval do def destroy @variant = Spree::Variant.find(params[:id]) - @variant.delete # This line changed, as well as removal of following conditional + @variant.delete_and_refresh_cache + flash[:success] = I18n.t('notice_messages.variant_deleted') respond_with(@variant) do |format| diff --git a/app/models/spree/variant_decorator.rb b/app/models/spree/variant_decorator.rb index cefb7917da..69359c6851 100644 --- a/app/models/spree/variant_decorator.rb +++ b/app/models/spree/variant_decorator.rb @@ -118,6 +118,11 @@ Spree::Variant.class_eval do end end + # Deletes the record, skipping callbacks, but it also refreshes the cache + def delete_and_refresh_cache + destruction { delete } + end + private def update_weight_from_unit_value diff --git a/spec/models/spree/variant_spec.rb b/spec/models/spree/variant_spec.rb index fe4e132ae8..cc37f889ef 100644 --- a/spec/models/spree/variant_spec.rb +++ b/spec/models/spree/variant_spec.rb @@ -196,7 +196,6 @@ module Spree end it "refreshes the products cache for the entire product on destroy" do - # Does this ever happen? expect(OpenFoodNetwork::ProductsCache).to receive(:product_changed).with(product) expect(OpenFoodNetwork::ProductsCache).to receive(:variant_destroyed).never master.destroy @@ -551,4 +550,26 @@ module Spree end end end + + describe '#delete_and_refresh_cache' do + context 'when it is not the master variant' do + let(:variant) { create(:variant) } + + it 'refreshes the products cache on delete' do + expect(OpenFoodNetwork::ProductsCache).to receive(:variant_destroyed).with(variant) + variant.delete_and_refresh_cache + end + end + + context "when it is the master variant" do + let(:product) { create(:simple_product) } + let(:master) { product.master } + + it 'refreshes the products cache for the entire product on delete' do + expect(OpenFoodNetwork::ProductsCache).to receive(:product_changed).with(product) + expect(OpenFoodNetwork::ProductsCache).to receive(:variant_destroyed).never + master.delete_and_refresh_cache + end + end + end end