From b643829fe2ce73d464bfd1171781749989f54fb8 Mon Sep 17 00:00:00 2001 From: Rob Harrington Date: Wed, 7 Dec 2016 11:24:51 +1100 Subject: [PATCH] Standing Orders can be marked as cancelled --- app/models/standing_order.rb | 10 +++++++++ spec/models/standing_order_spec.rb | 35 ++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/app/models/standing_order.rb b/app/models/standing_order.rb index bfc5803068..7ce10a3f75 100644 --- a/app/models/standing_order.rb +++ b/app/models/standing_order.rb @@ -31,6 +31,16 @@ class StandingOrder < ActiveRecord::Base standing_order_orders.not_closed end + def cancel + transaction do + self.update_column(:canceled_at, Time.zone.now) + standing_order_orders.each(&:cancel) + true + end + end + + private + def ends_at_after_begins_at if begins_at.present? && ends_at.present? && ends_at <= begins_at errors.add(:ends_at, "must be after begins at") diff --git a/spec/models/standing_order_spec.rb b/spec/models/standing_order_spec.rb index db2b69f17b..71ac1702af 100644 --- a/spec/models/standing_order_spec.rb +++ b/spec/models/standing_order_spec.rb @@ -85,4 +85,39 @@ describe StandingOrder, type: :model do expect(subject).to validate_presence_of :begins_at end end + + describe "cancel" do + let!(:standing_order) { create(:standing_order, orders: [create(:order), create(:order)]) } + let!(:standing_order_order1) { standing_order.standing_order_orders.first } + let!(:standing_order_order2) { standing_order.standing_order_orders.last } + + before do + allow(standing_order).to receive(:standing_order_orders) { [standing_order_order1, standing_order_order2] } + end + + context "when all standing order orders can be cancelled" do + before { allow(standing_order_order1).to receive(:cancel) { true } } + before { allow(standing_order_order2).to receive(:cancel) { true } } + + it "marks the standing order as cancelled and calls #cancel on all standing_order_orders" do + standing_order.cancel + expect(standing_order.reload.canceled_at).to be_within(5.seconds).of Time.now + expect(standing_order_order1).to have_received(:cancel) + expect(standing_order_order2).to have_received(:cancel) + end + end + + context "when a standing order order cannot be cancelled" do + before { allow(standing_order_order1).to receive(:cancel).and_raise("Some error") } + before { allow(standing_order_order2).to receive(:cancel) { true } } + + it "aborts the transaction" do + # ie. canceled_at remains as nil, #cancel not called on second standing order order + expect{standing_order.cancel}.to raise_error "Some error" + expect(standing_order.reload.canceled_at).to be nil + expect(standing_order_order1).to have_received(:cancel) + expect(standing_order_order2).to_not have_received(:cancel) + end + end + end end