From daa1f187d7acf13da7675211cd3e1955f7cb298e Mon Sep 17 00:00:00 2001 From: Phil Lee Date: Thu, 2 Feb 2023 17:03:35 +0000 Subject: [PATCH] handle errors during bulk upload parsing --- app/services/bulk_upload/processor.rb | 3 ++ spec/services/bulk_upload/processor_spec.rb | 44 ++++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/app/services/bulk_upload/processor.rb b/app/services/bulk_upload/processor.rb index c5cfa21ce..0cf059da2 100644 --- a/app/services/bulk_upload/processor.rb +++ b/app/services/bulk_upload/processor.rb @@ -13,6 +13,9 @@ class BulkUpload::Processor validator.call create_logs if validator.create_logs? send_success_mail + rescue StandardError => e + Sentry.capture_exception(e) + send_failure_mail ensure downloader.delete_local_file! end diff --git a/spec/services/bulk_upload/processor_spec.rb b/spec/services/bulk_upload/processor_spec.rb index 1e219d833..7c2ebaf06 100644 --- a/spec/services/bulk_upload/processor_spec.rb +++ b/spec/services/bulk_upload/processor_spec.rb @@ -47,7 +47,49 @@ RSpec.describe BulkUpload::Processor do end end - context "when the bulk upload processing throws an error" + context "when the bulk upload processing throws an error" do + let(:mock_downloader) do + instance_double( + BulkUpload::Downloader, + call: nil, + path: file_fixture("2022_23_lettings_bulk_upload.csv"), + delete_local_file!: nil, + ) + end + + let(:mock_validator) do + instance_double( + BulkUpload::Lettings::Validator, + invalid?: false, + ) + end + + before do + allow(BulkUpload::Downloader).to receive(:new).with(bulk_upload:).and_return(mock_downloader) + allow(BulkUpload::Lettings::Validator).to receive(:new).and_return(mock_validator) + + allow(mock_validator).to receive(:call).and_raise(StandardError) + end + + it "sends failure email" do + mail_double = instance_double("ActionMailer::MessageDelivery", deliver_later: nil) + + allow(BulkUploadMailer).to receive(:send_bulk_upload_failed_service_error_mail).and_return(mail_double) + + processor.call + + expect(BulkUploadMailer).to have_received(:send_bulk_upload_failed_service_error_mail) + expect(mail_double).to have_received(:deliver_later) + end + + it "we log the failure" do + allow(Sentry).to receive(:capture_exception) + + processor.call + + expect(Sentry).to have_received(:capture_exception) + end + end context "when processing a bulk upload with errors" do let(:mock_downloader) do