From 6b9af00663098a2d2acd3b463a8969cf54b29e6b Mon Sep 17 00:00:00 2001 From: Kat Date: Thu, 28 Sep 2023 12:01:37 +0100 Subject: [PATCH] Add missing addresses csv job --- app/jobs/email_missing_addresses_csv_job.rb | 27 ++++++++ app/mailers/csv_download_mailer.rb | 4 ++ .../csv/missing_addresses_csv_service.rb | 9 +++ .../email_missing_addresses_csv_job_spec.rb | 66 +++++++++++++++++++ 4 files changed, 106 insertions(+) create mode 100644 app/jobs/email_missing_addresses_csv_job.rb create mode 100644 app/services/csv/missing_addresses_csv_service.rb create mode 100644 spec/jobs/email_missing_addresses_csv_job_spec.rb diff --git a/app/jobs/email_missing_addresses_csv_job.rb b/app/jobs/email_missing_addresses_csv_job.rb new file mode 100644 index 000000000..02ccee8c2 --- /dev/null +++ b/app/jobs/email_missing_addresses_csv_job.rb @@ -0,0 +1,27 @@ +class EmailMissingAddressesCsvJob < ApplicationJob + queue_as :default + + BYTE_ORDER_MARK = "\uFEFF".freeze # Required to ensure Excel always reads CSV as UTF-8 + + def perform(users, organisation, log_type) + case log_type + when "lettings" + csv_string = Csv::MissingAddressesCsvService.new(organisation:).create_missing_lettings_addresses_csv + filename = "#{['missing-lettings-logs-addresses', organisation.name, Time.zone.now].compact.join('-')}.csv" + email_method = :send_missing_lettings_addresses_csv_download_mail + when "sales" + csv_string = Csv::MissingAddressesCsvService.new(organisation:).create_missing_sales_addresses_csv + filename = "#{['missing-sales-logs-addresses', organisation.name, Time.zone.now].compact.join('-')}.csv" + email_method = :send_missing_sales_addresses_csv_download_mail + end + + storage_service = Storage::S3Service.new(Configuration::EnvConfigurationService.new, ENV["CSV_DOWNLOAD_PAAS_INSTANCE"]) + storage_service.write_file(filename, BYTE_ORDER_MARK + csv_string) + + url = storage_service.get_presigned_url(filename, nil) + + users.each do |user| + CsvDownloadMailer.new.send(email_method, user, url) + end + end +end diff --git a/app/mailers/csv_download_mailer.rb b/app/mailers/csv_download_mailer.rb index 619d5e922..db5957d23 100644 --- a/app/mailers/csv_download_mailer.rb +++ b/app/mailers/csv_download_mailer.rb @@ -8,4 +8,8 @@ class CsvDownloadMailer < NotifyMailer { name: user.name, link:, duration: ActiveSupport::Duration.build(duration).inspect }, ) end + + def send_missing_lettings_addresses_csv_download_mail(user, link); end + + def send_missing_sales_addresses_csv_download_mail(user, link); end end diff --git a/app/services/csv/missing_addresses_csv_service.rb b/app/services/csv/missing_addresses_csv_service.rb new file mode 100644 index 000000000..c052f1594 --- /dev/null +++ b/app/services/csv/missing_addresses_csv_service.rb @@ -0,0 +1,9 @@ +module Csv + class MissingAddressesCsvService + def initialize(organisation); end + + def create_missing_lettings_addresses_csv; end + + def create_missing_sales_addresses_csv; end + end +end diff --git a/spec/jobs/email_missing_addresses_csv_job_spec.rb b/spec/jobs/email_missing_addresses_csv_job_spec.rb new file mode 100644 index 000000000..e5e344c97 --- /dev/null +++ b/spec/jobs/email_missing_addresses_csv_job_spec.rb @@ -0,0 +1,66 @@ +require "rails_helper" + +describe EmailMissingAddressesCsvJob do + include Helpers + + test_url = :test_url + + let(:job) { described_class.new } + let(:storage_service) { instance_double(Storage::S3Service) } + let(:mailer) { instance_double(CsvDownloadMailer) } + let(:missing_addresses_csv_service) { instance_double(Csv::MissingAddressesCsvService) } + let(:organisation) { build(:organisation) } + let(:users) { create_list(:user, 2) } + + before do + allow(Storage::S3Service).to receive(:new).and_return(storage_service) + allow(storage_service).to receive(:write_file) + allow(storage_service).to receive(:get_presigned_url).and_return(test_url) + + allow(Csv::MissingAddressesCsvService).to receive(:new).and_return(missing_addresses_csv_service) + allow(missing_addresses_csv_service).to receive(:create_missing_lettings_addresses_csv).and_return("") + allow(missing_addresses_csv_service).to receive(:create_missing_sales_addresses_csv).and_return("") + + allow(CsvDownloadMailer).to receive(:new).and_return(mailer) + allow(mailer).to receive(:send_missing_lettings_addresses_csv_download_mail) + allow(mailer).to receive(:send_missing_sales_addresses_csv_download_mail) + end + + context "when sending missing lettings logs csv" do + it "uses an appropriate filename in S3" do + expect(storage_service).to receive(:write_file).with(/missing-lettings-logs-addresses-#{organisation.name}-.*\.csv/, anything) + job.perform(users, organisation, "lettings") + end + + it "creates a MissingAddressesCsvService with the correct organisation and calls create missing lettings logs adresses csv" do + expect(Csv::MissingAddressesCsvService).to receive(:new).with(organisation:) + expect(missing_addresses_csv_service).to receive(:create_missing_lettings_addresses_csv) + job.perform(users, organisation, "lettings") + end + + it "sends emails to all the provided users" do + expect(mailer).to receive(:send_missing_lettings_addresses_csv_download_mail).with(users[0], test_url) + expect(mailer).to receive(:send_missing_lettings_addresses_csv_download_mail).with(users[1], test_url) + job.perform(users, organisation, "lettings") + end + end + + context "when sending missing sales logs csv" do + it "uses an appropriate filename in S3" do + expect(storage_service).to receive(:write_file).with(/missing-sales-logs-addresses-#{organisation.name}-.*\.csv/, anything) + job.perform(users, organisation, "sales") + end + + it "creates a MissingAddressesCsvService with the correct organisation and calls create missing sales logs adresses csv" do + expect(Csv::MissingAddressesCsvService).to receive(:new).with(organisation:) + expect(missing_addresses_csv_service).to receive(:create_missing_sales_addresses_csv) + job.perform(users, organisation, "sales") + end + + it "sends emails to all the provided users" do + expect(mailer).to receive(:send_missing_sales_addresses_csv_download_mail).with(users[0], test_url) + expect(mailer).to receive(:send_missing_sales_addresses_csv_download_mail).with(users[1], test_url) + job.perform(users, organisation, "sales") + end + end +end