Browse Source

CLDC-3779 Add duplicate logs email (#2843)

* Find block log creation reason

* Update mailer

* Remove create_logs? method
pull/2863/head
kosiakkatrina 2 months ago committed by GitHub
parent
commit
e7490f1381
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 21
      app/mailers/bulk_upload_mailer.rb
  2. 14
      app/services/bulk_upload/lettings/validator.rb
  3. 40
      app/services/bulk_upload/processor.rb
  4. 12
      app/services/bulk_upload/sales/validator.rb
  5. 25
      spec/mailers/bulk_upload_mailer_spec.rb
  6. 10
      spec/services/bulk_upload/lettings/validator_spec.rb
  7. 32
      spec/services/bulk_upload/processor_spec.rb
  8. 16
      spec/services/bulk_upload/sales/validator_spec.rb

21
app/mailers/bulk_upload_mailer.rb

@ -3,6 +3,7 @@ class BulkUploadMailer < NotifyMailer
COMPLETE_TEMPLATE_ID = "83279578-c890-4168-838b-33c9cf0dc9f0".freeze
FAILED_CSV_ERRORS_TEMPLATE_ID = "e27abcd4-5295-48c2-b127-e9ee4b781b75".freeze
FAILED_CSV_DUPLICATE_ERRORS_TEMPLATE_ID = "931d5bda-a08f-4de6-a455-38a63bff1956".freeze
FAILED_FILE_SETUP_ERROR_TEMPLATE_ID = "24c9f4c7-96ad-470a-ba31-eb51b7cbafd9".freeze
FAILED_SERVICE_ERROR_TEMPLATE_ID = "c3f6288c-7a74-4e77-99ee-6c4a0f6e125a".freeze
HOW_TO_FIX_UPLOAD_TEMPLATE_ID = "21a07b26-f625-4846-9f4d-39e30937aa24".freeze
@ -95,6 +96,26 @@ class BulkUploadMailer < NotifyMailer
)
end
def send_correct_duplicates_and_upload_again_mail(bulk_upload:)
summary_report_link = if BulkUploadErrorSummaryTableComponent.new(bulk_upload:).errors?
bulk_upload.sales? ? summary_bulk_upload_sales_result_url(bulk_upload) : summary_bulk_upload_lettings_result_url(bulk_upload)
else
bulk_upload.sales? ? bulk_upload_sales_result_url(bulk_upload) : bulk_upload_lettings_result_url(bulk_upload)
end
send_email(
bulk_upload.user.email,
FAILED_CSV_DUPLICATE_ERRORS_TEMPLATE_ID,
{
filename: bulk_upload.filename,
upload_timestamp: bulk_upload.created_at.to_fs(:govuk_date_and_time),
year_combo: bulk_upload.year_combo,
lettings_or_sales: bulk_upload.log_type,
summary_report_link:,
},
)
end
def send_bulk_upload_failed_file_setup_error_mail(bulk_upload:)
bulk_upload_link = if BulkUploadErrorSummaryTableComponent.new(bulk_upload:).errors?
bulk_upload.sales? ? summary_bulk_upload_sales_result_url(bulk_upload) : summary_bulk_upload_lettings_result_url(bulk_upload)

14
app/services/bulk_upload/lettings/validator.rb

@ -40,29 +40,25 @@ class BulkUpload::Lettings::Validator
end
end
def create_logs?
return false if any_setup_errors?
def block_log_creation_reason
return "setup_errors" if any_setup_errors?
if row_parsers.any?(&:block_log_creation?)
Sentry.capture_message("Bulk upload log creation blocked: #{bulk_upload.id}.")
return false
return "row_parser_block_log_creation"
end
if any_logs_already_exist? && FeatureToggle.bulk_upload_duplicate_log_check_enabled?
Sentry.capture_message("Bulk upload log creation blocked due to duplicate logs: #{bulk_upload.id}.")
return false
return "duplicate_logs"
end
row_parsers.each do |row_parser|
row_parser.log.blank_invalid_non_setup_fields!
end
if any_logs_invalid?
Sentry.capture_message("Bulk upload log creation blocked due to invalid logs after blanking non setup fields: #{bulk_upload.id}.")
return false
"logs_invalid"
end
true
end
def self.question_for_field(field)

40
app/services/bulk_upload/processor.rb

@ -36,20 +36,28 @@ class BulkUpload::Processor
if validator.any_setup_errors?
send_setup_errors_mail
elsif validator.create_logs?
create_logs
if validator.soft_validation_errors_only?
send_check_soft_validations_mail
elsif created_logs_but_incompleted?
send_how_to_fix_upload_mail
elsif created_logs_and_all_completed?
bulk_upload.unpend
send_success_mail
end
else
send_correct_and_upload_again_mail # summary/full report
block_creation_reason = validator.block_log_creation_reason
if block_creation_reason.present?
case block_creation_reason
when "duplicate_logs"
send_correct_duplicates_and_upload_again_mail
else
send_correct_and_upload_again_mail # summary/full report
end
else
create_logs
if validator.soft_validation_errors_only?
send_check_soft_validations_mail
elsif created_logs_but_incompleted?
send_how_to_fix_upload_mail
elsif created_logs_and_all_completed?
bulk_upload.unpend
send_success_mail
end
end
end
rescue StandardError => e
Sentry.capture_exception(e)
@ -97,6 +105,12 @@ private
.deliver_later
end
def send_correct_duplicates_and_upload_again_mail
BulkUploadMailer
.send_correct_duplicates_and_upload_again_mail(bulk_upload:)
.deliver_later
end
def send_success_mail
BulkUploadMailer
.send_bulk_upload_complete_mail(user:, bulk_upload:)

12
app/services/bulk_upload/sales/validator.rb

@ -39,17 +39,17 @@ class BulkUpload::Sales::Validator
end
end
def create_logs?
return false if any_setup_errors?
def block_log_creation_reason
return "setup_errors" if any_setup_errors?
if row_parsers.any?(&:block_log_creation?)
Sentry.capture_message("Bulk upload log creation blocked: #{bulk_upload.id}.")
return false
return "row_parser_block_log_creation"
end
if any_logs_already_exist? && FeatureToggle.bulk_upload_duplicate_log_check_enabled?
Sentry.capture_message("Bulk upload log creation blocked due to duplicate logs: #{bulk_upload.id}.")
return false
return "duplicate_logs"
end
row_parsers.each do |row_parser|
@ -58,10 +58,8 @@ class BulkUpload::Sales::Validator
if any_logs_invalid?
Sentry.capture_message("Bulk upload log creation blocked due to invalid logs after blanking non setup fields: #{bulk_upload.id}.")
return false
"logs_invalid"
end
true
end
def any_setup_errors?

25
spec/mailers/bulk_upload_mailer_spec.rb

@ -121,4 +121,29 @@ RSpec.describe BulkUploadMailer do
mailer.send_check_soft_validations_mail(bulk_upload:)
end
end
describe "#send_correct_duplicates_and_upload_again_mail" do
context "when 2 columns with errors" do
before do
create(:bulk_upload_error, bulk_upload:, col: "A")
create(:bulk_upload_error, bulk_upload:, col: "B")
end
it "sends correctly formed email" do
expect(notify_client).to receive(:send_email).with(
email_address: user.email,
template_id: described_class::FAILED_CSV_DUPLICATE_ERRORS_TEMPLATE_ID,
personalisation: {
filename: bulk_upload.filename,
upload_timestamp: bulk_upload.created_at.to_fs(:govuk_date_and_time),
year_combo: bulk_upload.year_combo,
lettings_or_sales: bulk_upload.log_type,
summary_report_link: "http://localhost:3000/lettings-logs/bulk-upload-results/#{bulk_upload.id}",
},
)
mailer.send_correct_duplicates_and_upload_again_mail(bulk_upload:)
end
end
end
end

10
spec/services/bulk_upload/lettings/validator_spec.rb

@ -232,7 +232,7 @@ RSpec.describe BulkUpload::Lettings::Validator do
end
end
describe "#create_logs?" do
describe "#block_log_creation_reason" do
context "when a log has a clearable, non-setup error" do
let(:log_1) { build(:lettings_log, :completed, period: 2, assigned_to: user) }
let(:log_2) { build(:lettings_log, :completed, period: 2, assigned_to: user, age1: 5) }
@ -245,7 +245,7 @@ RSpec.describe BulkUpload::Lettings::Validator do
it "returns false" do
validator.call
expect(validator).to be_create_logs
expect(validator.block_log_creation_reason).to be_nil
end
end
@ -261,7 +261,7 @@ RSpec.describe BulkUpload::Lettings::Validator do
it "returns true" do
validator.call
expect(validator).to be_create_logs
expect(validator.block_log_creation_reason).to be_nil
end
end
@ -277,7 +277,7 @@ RSpec.describe BulkUpload::Lettings::Validator do
it "will not create logs" do
validator.call
expect(validator).not_to be_create_logs
expect(validator.block_log_creation_reason).to eq("setup_errors")
end
end
@ -291,7 +291,7 @@ RSpec.describe BulkUpload::Lettings::Validator do
it "returns false" do
validator.call
expect(validator).not_to be_create_logs
expect(validator.block_log_creation_reason).to eq("setup_errors")
end
end
end

32
spec/services/bulk_upload/processor_spec.rb

@ -14,7 +14,7 @@ RSpec.describe BulkUpload::Processor do
call: nil,
total_logs_count: 1,
any_setup_errors?: false,
create_logs?: true,
block_log_creation_reason: nil,
soft_validation_errors_only?: false,
)
end
@ -165,7 +165,7 @@ RSpec.describe BulkUpload::Processor do
let(:log) { build(:lettings_log, :setup_completed, assigned_to: user) }
before do
allow(mock_validator).to receive(:create_logs?).and_return(true)
allow(mock_validator).to receive(:block_log_creation_reason).and_return(nil)
allow(mock_validator).to receive(:soft_validation_errors_only?).and_return(false)
allow(FeatureToggle).to receive(:bulk_upload_duplicate_log_check_enabled?).and_return(true)
end
@ -198,7 +198,7 @@ RSpec.describe BulkUpload::Processor do
context "when a bulk upload has logs with only soft validations triggered" do
before do
allow(mock_validator).to receive(:create_logs?).and_return(true)
allow(mock_validator).to receive(:block_log_creation_reason).and_return(nil)
allow(mock_validator).to receive(:soft_validation_errors_only?).and_return(true)
allow(FeatureToggle).to receive(:bulk_upload_duplicate_log_check_enabled?).and_return(true)
end
@ -239,7 +239,7 @@ RSpec.describe BulkUpload::Processor do
call: nil,
total_logs_count: 1,
any_setup_errors?: false,
create_logs?: false,
block_log_creation_reason: "row_parser_block_log_creation",
)
end
@ -254,6 +254,30 @@ RSpec.describe BulkUpload::Processor do
expect(mail_double).to have_received(:deliver_later)
end
end
context "when upload has duplicate logs blocking log creation" do
let(:mock_validator) do
instance_double(
BulkUpload::Lettings::Validator,
invalid?: false,
call: nil,
total_logs_count: 1,
any_setup_errors?: false,
block_log_creation_reason: "duplicate_logs",
)
end
it "sends correct_and_upload_again_mail" do
mail_double = instance_double("ActionMailer::MessageDelivery", deliver_later: nil)
allow(BulkUploadMailer).to receive(:send_correct_duplicates_and_upload_again_mail).and_return(mail_double)
processor.call
expect(BulkUploadMailer).to have_received(:send_correct_duplicates_and_upload_again_mail)
expect(mail_double).to have_received(:deliver_later)
end
end
end
describe "#approve" do

16
spec/services/bulk_upload/sales/validator_spec.rb

@ -204,7 +204,7 @@ RSpec.describe BulkUpload::Sales::Validator do
end
end
describe "#create_logs?" do
describe "#block_log_creation_reason" do
context "when all logs are valid" do
let(:log_1) { build(:sales_log, :completed, assigned_to: user) }
let(:log_2) { build(:sales_log, :completed, assigned_to: user) }
@ -214,9 +214,9 @@ RSpec.describe BulkUpload::Sales::Validator do
file.write(BulkUpload::SalesLogToCsv.new(log: log_2).to_csv_row)
end
it "returns truthy" do
it "returns nil" do
validator.call
expect(validator).to be_create_logs
expect(validator.block_log_creation_reason).to be_nil
end
end
@ -229,9 +229,9 @@ RSpec.describe BulkUpload::Sales::Validator do
file.write(BulkUpload::SalesLogToCsv.new(log: log_2).to_csv_row)
end
it "returns truthy" do
it "returns nil" do
validator.call
expect(validator).to be_create_logs
expect(validator.block_log_creation_reason).to be_nil
end
end
@ -245,9 +245,9 @@ RSpec.describe BulkUpload::Sales::Validator do
file.close
end
it "returns false" do
it "returns the reason" do
validator.call
expect(validator).not_to be_create_logs
expect(validator.block_log_creation_reason).to eq("setup_errors")
end
end
@ -262,7 +262,7 @@ RSpec.describe BulkUpload::Sales::Validator do
it "will not create logs" do
validator.call
expect(validator).not_to be_create_logs
expect(validator.block_log_creation_reason).to eq("setup_errors")
end
end
end

Loading…
Cancel
Save