diff --git a/app/services/place_proxy_order.rb b/app/services/place_proxy_order.rb index 667f63690c..ffce95c12a 100644 --- a/app/services/place_proxy_order.rb +++ b/app/services/place_proxy_order.rb @@ -23,7 +23,7 @@ class PlaceProxyOrder move_to_completion send_placement_email rescue StandardError => e - summarizer.record_and_log_error(:processing, e.message) + summarizer.record_and_log_error(:processing, order, e.message) Bugsnag.notify(e, order: order) end diff --git a/spec/jobs/subscription_placement_job_spec.rb b/spec/jobs/subscription_placement_job_spec.rb index bc8d7a9a97..caa9f52e44 100644 --- a/spec/jobs/subscription_placement_job_spec.rb +++ b/spec/jobs/subscription_placement_job_spec.rb @@ -51,7 +51,8 @@ describe SubscriptionPlacementJob do describe "performing the job" do context "when unplaced proxy_orders exist" do let!(:subscription) { create(:subscription, with_items: true) } - let!(:proxy_order) { create(:proxy_order, subscription: subscription, order: build(:order)) } + let(:order) { build(:order, distributor: create(:enterprise)) } + let!(:proxy_order) { create(:proxy_order, subscription: subscription, order: order) } before do allow(job).to receive(:proxy_orders) { ProxyOrder.where(id: proxy_order.id) } @@ -73,6 +74,18 @@ describe SubscriptionPlacementJob do expect(service).to have_received(:call) end + + it "records exceptions" do + order.line_items << build(:line_item) + + summarizer = TestSummarizer.new + allow(OrderManagement::Subscriptions::Summarizer).to receive(:new).and_return(summarizer) + + job.perform + + expect(summarizer.recorded_issues[order.id]) + .to eq("Errors: Cannot transition state via :next from :address (Reason(s): Items cannot be shipped)") + end end end diff --git a/spec/services/place_proxy_order_spec.rb b/spec/services/place_proxy_order_spec.rb index 12858692d0..5502f181a2 100644 --- a/spec/services/place_proxy_order_spec.rb +++ b/spec/services/place_proxy_order_spec.rb @@ -8,7 +8,7 @@ describe PlaceProxyOrder do subject { described_class.new(proxy_order, summarizer, logger, stock_changes_loader) } let(:proxy_order) { create(:proxy_order, order: order) } - let(:order) { build(:order) } + let(:order) { build(:order, distributor: build(:enterprise)) } let(:summarizer) { instance_double(OrderManagement::Subscriptions::Summarizer) } let(:logger) { instance_double(JobLogger.logger.class, info: true) } @@ -19,7 +19,7 @@ describe PlaceProxyOrder do let!(:proxy_order) { create(:proxy_order, subscription: subscription, order: order) } let(:stock_changes_loader) { lambda { {} } } - let(:summarizer) { instance_double(OrderManagement::Subscriptions::Summarizer, record_order: true, record_issue: true) } + let(:summarizer) { OrderManagement::Subscriptions::Summarizer.new } before do allow(SubscriptionMailer).to receive(:empty_email) { mail_mock } @@ -31,6 +31,15 @@ describe PlaceProxyOrder do expect(proxy_order.placed_at).to eq(Time.zone.now) end end + + it "tracks exceptions" do + order.line_items << build(:line_item) + + expect(summarizer).to receive(:record_and_log_error).with(:processing, order, kind_of(String)) + expect(Bugsnag).to receive(:notify).with(kind_of(StandardError), order: order) + + subject.call + end end describe "#send_placement_email" do diff --git a/spec/support/test_summarizer.rb b/spec/support/test_summarizer.rb new file mode 100644 index 0000000000..73af2daac0 --- /dev/null +++ b/spec/support/test_summarizer.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +# A fake summarizer that implements a more handy public API to reach out to its internal state, +# which greatly simplifyies integration testing. +class TestSummarizer < OrderManagement::Subscriptions::Summarizer + attr_reader :recorded_issues + + def initialize + @recorded_issues = {} + super + end + + def record_issue(_type, order, message = nil) + @recorded_issues[order.id] = message + end +end