From 1741575d80873248427696f3f63e97d91f4f3da0 Mon Sep 17 00:00:00 2001 From: Kat Date: Wed, 21 Feb 2024 11:02:52 +0000 Subject: [PATCH] Download stock owner schemes --- app/jobs/scheme_email_csv_job.rb | 6 +- spec/jobs/scheme_email_csv_job_spec.rb | 81 +++++++++++++++++--------- 2 files changed, 60 insertions(+), 27 deletions(-) diff --git a/app/jobs/scheme_email_csv_job.rb b/app/jobs/scheme_email_csv_job.rb index 1dad752c5..b731a1921 100644 --- a/app/jobs/scheme_email_csv_job.rb +++ b/app/jobs/scheme_email_csv_job.rb @@ -6,7 +6,11 @@ class SchemeEmailCsvJob < ApplicationJob EXPIRATION_TIME = 24.hours.to_i def perform(user, search_term = nil, filters = {}, all_orgs = false, organisation = nil, download_type = "combined") # rubocop:disable Style/OptionalBooleanParameter - sidekiq can't serialise named params - unfiltered_schemes = organisation.present? && user.support? ? Scheme.where(owning_organisation_id: organisation.id) : user.schemes + unfiltered_schemes = if organisation.present? && user.support? + Scheme.where(owning_organisation: [organisation] + organisation.parent_organisations) + else + Scheme.where(owning_organisation: [user.organisation] + user.organisation.parent_organisations) + end filtered_schemes = FilterManager.filter_schemes(unfiltered_schemes, search_term, filters, all_orgs, user) csv_string = Csv::SchemeCsvService.new(download_type:).prepare_csv(filtered_schemes) diff --git a/spec/jobs/scheme_email_csv_job_spec.rb b/spec/jobs/scheme_email_csv_job_spec.rb index d23177ab3..5ddaa91a6 100644 --- a/spec/jobs/scheme_email_csv_job_spec.rb +++ b/spec/jobs/scheme_email_csv_job_spec.rb @@ -6,41 +6,52 @@ describe SchemeEmailCsvJob do test_url = :test_url let(:job) { described_class.new } + let(:storage_service) { instance_double(Storage::S3Service, write_file: nil, get_presigned_url: test_url) } + let(:mailer) { instance_double(CsvDownloadMailer, send_csv_download_mail: nil) } let(:user) { FactoryBot.create(:user) } - let(:storage_service) { instance_double(Storage::S3Service) } - let(:mailer) { instance_double(CsvDownloadMailer) } - let(:scheme_csv_service) { instance_double(Csv::SchemeCsvService) } - let(:search_term) { "meaning" } - let(:filters) { { "owning_organisation" => organisation.id, "status" => %w[active] } } - let(:all_orgs) { false } - let(:organisation) { build(:organisation) } - let(:download_type) { "combined" } - let(:schemes) { build_list(:scheme, 5, owning_organisation: organisation) } - let(:locations) { build_list(:location, 5, scheme: schemes.first) } 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::SchemeCsvService).to receive(:new).and_return(scheme_csv_service) - allow(scheme_csv_service).to receive(:prepare_csv).and_return("") - allow(CsvDownloadMailer).to receive(:new).and_return(mailer) - allow(mailer).to receive(:send_csv_download_mail) end context "when exporting" do + let(:scheme_csv_service) { instance_double(Csv::SchemeCsvService) } + let(:organisation) { user.organisation } + let(:download_type) { "combined" } + let(:schemes) { create_list(:scheme, 1, owning_organisation: organisation) } + before do - allow(FilterManager).to receive(:filter_schemes).and_return(schemes) + create_list(:location, 2, scheme: schemes.first) end context "when download type schemes" do let(:download_type) { "schemes" } - it "uses an appropriate filename in S3" do - expect(storage_service).to receive(:write_file).with(/schemes-.*\.csv/, anything) - job.perform(user) + it "uses an appropriate filename in S3 and exports the correct schemes" do + expect(storage_service).to receive(:write_file).with(/schemes-.*\.csv/, anything) do |_, content| + expect(content).not_to be_nil + expect(content).not_to be_nil + expect(CSV.parse(content).count).to eq(2) + end + job.perform(user, nil, {}, nil, nil, download_type) + end + + context "and there are stock owner schemes" do + let(:parent_organisation) { create(:organisation) } + + before do + create(:scheme, owning_organisation: parent_organisation) + create(:organisation_relationship, parent_organisation:, child_organisation: organisation) + end + + it "exports the correct number of schemes" do + expect(storage_service).to receive(:write_file).with(/schemes-.*\.csv/, anything) do |_, content| + expect(content).not_to be_nil + expect(CSV.parse(content).count).to eq(3) + end + job.perform(user, nil, {}, nil, nil, download_type) + end end end @@ -49,7 +60,7 @@ describe SchemeEmailCsvJob do it "uses an appropriate filename in S3" do expect(storage_service).to receive(:write_file).with(/locations-.*\.csv/, anything) - job.perform(user) + job.perform(user, nil, {}, nil, nil, download_type) end end @@ -58,7 +69,7 @@ describe SchemeEmailCsvJob do it "uses an appropriate filename in S3" do expect(storage_service).to receive(:write_file).with(/schemes-and-locations.*\.csv/, anything) - job.perform(user) + job.perform(user, nil, {}, nil, nil, download_type) end end @@ -67,12 +78,27 @@ describe SchemeEmailCsvJob do job.perform(user, nil, {}, nil, organisation, "combined") end - it "calls the filter manager with the arguments provided" do - expect(FilterManager).to receive(:filter_schemes).with(a_kind_of(ActiveRecord::Relation), search_term, filters, all_orgs, user) - job.perform(user, search_term, filters, all_orgs, organisation, "combined") + context "when resources are filtered" do + let(:search_term) { "meaning" } + let(:filters) { { "owning_organisation" => organisation.id, "status" => %w[active] } } + let(:all_orgs) { false } + + before do + allow(Csv::SchemeCsvService).to receive(:new).and_return(scheme_csv_service) + allow(scheme_csv_service).to receive(:prepare_csv).and_return("") + allow(FilterManager).to receive(:filter_schemes).and_return(schemes) + end + + it "calls the filter manager with the arguments provided" do + expect(FilterManager).to receive(:filter_schemes).with(a_kind_of(ActiveRecord::Relation), search_term, filters, all_orgs, user) + job.perform(user, search_term, filters, all_orgs, organisation, "combined") + end end it "creates a SchemeCsvService with the correct download type" do + allow(Csv::SchemeCsvService).to receive(:new).and_return(scheme_csv_service) + allow(scheme_csv_service).to receive(:prepare_csv).and_return("") + expect(Csv::SchemeCsvService).to receive(:new).with(download_type: "schemes") job.perform(user, nil, {}, nil, nil, "schemes") expect(Csv::SchemeCsvService).to receive(:new).with(download_type: "locations") @@ -82,6 +108,9 @@ describe SchemeEmailCsvJob do end it "passes the schemes returned by the filter manager to the csv service" do + allow(Csv::SchemeCsvService).to receive(:new).and_return(scheme_csv_service) + allow(scheme_csv_service).to receive(:prepare_csv).and_return("") + expect(scheme_csv_service).to receive(:prepare_csv).with(schemes) job.perform(user, nil, {}, nil, nil, "combined") end