diff --git a/app/controllers/spree/admin/adjustments_controller.rb b/app/controllers/spree/admin/adjustments_controller.rb index ed6b9d2cde..2712b5858f 100644 --- a/app/controllers/spree/admin/adjustments_controller.rb +++ b/app/controllers/spree/admin/adjustments_controller.rb @@ -5,6 +5,7 @@ module Spree prepend_before_action :set_included_tax, only: [:create, :update] before_action :set_order_id, only: [:create, :update] + before_action :skip_changing_canceled_orders, only: [:create, :update] after_action :update_order, only: [:create, :update, :destroy] before_action :set_default_tax_rate, only: :edit before_action :enable_updates, only: :update @@ -28,6 +29,10 @@ module Spree @adjustment.order_id = parent.id end + def skip_changing_canceled_orders + redirect_to admin_order_adjustments_path(@order) if @order.canceled? + end + # Choose a default tax rate to show on the edit form. The adjustment stores its included # tax in dollars, but doesn't store the source of the tax (ie. TaxRate that generated it). # We guess which tax rate here, choosing: diff --git a/spec/controllers/spree/admin/adjustments_controller_spec.rb b/spec/controllers/spree/admin/adjustments_controller_spec.rb index 87b372c3b9..8dafb83493 100644 --- a/spec/controllers/spree/admin/adjustments_controller_spec.rb +++ b/spec/controllers/spree/admin/adjustments_controller_spec.rb @@ -90,5 +90,33 @@ module Spree end end end + + describe "with a cancelled order" do + let(:order) { create(:completed_order_with_totals) } + let(:tax_rate) { create(:tax_rate, amount: 0.1, calculator: ::Calculator::DefaultTax.new) } + let(:adjustment) { + create(:adjustment, adjustable: order, order: order, amount: 1100, included_tax: 100) + } + + before do + expect(order.cancel).to eq true + end + + it "doesn't create adjustments" do + expect { + spree_post :create, order_id: order.number, adjustment: { label: "Testing", amount: "110" }, tax_rate_id: "" + }.to_not change { [Adjustment.count, order.reload.total] } + + expect(response).to redirect_to spree.admin_order_adjustments_path(order) + end + + it "doesn't change adjustments" do + expect { + spree_put :update, order_id: order.number, id: adjustment.id, adjustment: { label: "Testing", amount: "110" }, tax_rate_id: "" + }.to_not change { [adjustment.reload.amount, order.reload.total] } + + expect(response).to redirect_to spree.admin_order_adjustments_path(order) + end + end end end