diff --git a/app/models/spree/order.rb b/app/models/spree/order.rb index 802992a73c..8a4401ff3e 100644 --- a/app/models/spree/order.rb +++ b/app/models/spree/order.rb @@ -665,6 +665,7 @@ module Spree def after_cancel shipments.each(&:cancel!) + payments.checkout.each(&:void!) OrderMailer.cancel_email(id).deliver_later if send_cancellation_email update(payment_state: updater.update_payment_state) diff --git a/engines/order_management/spec/services/order_management/order/updater_spec.rb b/engines/order_management/spec/services/order_management/order/updater_spec.rb index 23827e1c85..718cdc662b 100644 --- a/engines/order_management/spec/services/order_management/order/updater_spec.rb +++ b/engines/order_management/spec/services/order_management/order/updater_spec.rb @@ -61,7 +61,7 @@ module OrderManagement expect(order.shipment_state).to be_nil end - ["shipped", "ready", "pending"].each do |state| + ["shipped", "ready", "pending", "canceled"].each do |state| it "is #{state}" do allow(shipment).to receive(:state).and_return(state) updater.update_shipment_state diff --git a/spec/models/spree/order_spec.rb b/spec/models/spree/order_spec.rb index 8c1adba511..51f164a13b 100644 --- a/spec/models/spree/order_spec.rb +++ b/spec/models/spree/order_spec.rb @@ -303,6 +303,29 @@ describe Spree::Order do end end + describe "#cancel" do + let(:order) { create(:order_with_totals_and_distribution, :completed) } + + before { order.cancel! } + + it "should cancel the order" do + expect(order.state).to eq 'canceled' + end + + it "should cancel the shipments" do + expect(order.shipments.pluck(:state)).to eq ['canceled'] + end + + context "when payment has not been taken" do + context "and payment is in checkout state" do + it "should change the state of the payment to void" do + order.payments.reload + expect(order.payments.pluck(:state)).to eq ['void'] + end + end + end + end + context "insufficient_stock_lines" do let(:line_item) { build(:line_item) }