diff --git a/app/models/spree/adjustment.rb b/app/models/spree/adjustment.rb index 8312229736..34044dcc31 100644 --- a/app/models/spree/adjustment.rb +++ b/app/models/spree/adjustment.rb @@ -100,6 +100,11 @@ module Spree def update_adjustment!(calculable = nil, force: false) return amount if immutable? && !force + if calculable.nil? && adjustable.nil? + self.delete + return 0.0 + end + if originator.present? amount = originator.compute_amount(calculable || adjustable) update_columns( diff --git a/spec/models/spree/adjustment_spec.rb b/spec/models/spree/adjustment_spec.rb index 7ae26c83c6..009f1ccecf 100644 --- a/spec/models/spree/adjustment_spec.rb +++ b/spec/models/spree/adjustment_spec.rb @@ -64,6 +64,23 @@ module Spree expect(adjustment).not_to receive(:update_columns) adjustment.update_adjustment! end + + context "where the adjustable has been deleted" do + let(:line_item) { create(:line_item, price: 10) } + let!(:adjustment) { create(:adjustment, adjustable: line_item) } + + it "returns zero" do + line_item.delete + expect(adjustment.reload.update_adjustment!).to eq 0.0 + end + + it "removes orphaned adjustments" do + expect { + line_item.delete + adjustment.reload.update_adjustment! + }.to change{ Spree::Adjustment.count }.by -1 + end + end end context "adjustment state" do