diff --git a/spec/services/bulk_upload/lettings/validator_spec.rb b/spec/services/bulk_upload/lettings/validator_spec.rb index 57c2a3dbd..bdf9fcb99 100644 --- a/spec/services/bulk_upload/lettings/validator_spec.rb +++ b/spec/services/bulk_upload/lettings/validator_spec.rb @@ -5,8 +5,9 @@ RSpec.describe BulkUpload::Lettings::Validator do let(:organisation) { create(:organisation, old_visible_id: "3", rent_periods: [2]) } let(:user) { create(:user, organisation:) } - let(:log) { build(:lettings_log, :completed, renttype: 1, period: 2, assigned_to: user, owning_organisation: organisation, managing_organisation: organisation) } - let(:bulk_upload) { create(:bulk_upload, user:, year: 2024) } + let(:log) { build(:lettings_log, :completed, period: 2, assigned_to: user) } + let(:log_to_csv) { BulkUpload::LettingsLogToCsv.new(log:) } + let(:bulk_upload) { create(:bulk_upload, user:, year: log.collection_start_year) } let(:path) { file.path } let(:file) { Tempfile.new } @@ -21,9 +22,8 @@ RSpec.describe BulkUpload::Lettings::Validator do context "and file has extra invalid headers" do let(:seed) { rand } - let(:log_to_csv) { BulkUpload::LettingsLogToCsv.new(log:) } - let(:field_numbers) { log_to_csv.default_2024_field_numbers + %w[invalid_field_number] } - let(:field_values) { log_to_csv.to_2024_row + %w[value_for_invalid_field_number] } + let(:field_numbers) { log_to_csv.default_field_numbers + %w[invalid_field_number] } + let(:field_values) { log_to_csv.to_row + %w[value_for_invalid_field_number] } before do file.write(log_to_csv.custom_field_numbers_row(seed:, field_numbers:)) @@ -38,9 +38,8 @@ RSpec.describe BulkUpload::Lettings::Validator do context "and file has too few valid headers" do let(:seed) { rand } - let(:log_to_csv) { BulkUpload::LettingsLogToCsv.new(log:) } - let(:field_numbers) { log_to_csv.default_2024_field_numbers } - let(:field_values) { log_to_csv.to_2024_row } + let(:field_numbers) { log_to_csv.default_field_numbers } + let(:field_values) { log_to_csv.to_row } before do field_numbers.delete_at(20) @@ -58,9 +57,8 @@ RSpec.describe BulkUpload::Lettings::Validator do context "and file has too many valid headers" do let(:seed) { rand } - let(:log_to_csv) { BulkUpload::LettingsLogToCsv.new(log:) } - let(:field_numbers) { log_to_csv.default_2024_field_numbers + %w[23] } - let(:field_values) { log_to_csv.to_2024_row + %w[value] } + let(:field_numbers) { log_to_csv.default_field_numbers + %w[23] } + let(:field_values) { log_to_csv.to_row + %w[value] } before do file.write(log_to_csv.custom_field_numbers_row(seed:, field_numbers:)) @@ -77,10 +75,10 @@ RSpec.describe BulkUpload::Lettings::Validator do context "when uploading a 2023 logs for 2024 bulk upload" do let(:log) { build(:lettings_log, :completed, startdate: Time.zone.local(2023, 5, 6), tenancycode: "5234234234234") } + let(:bulk_upload) { build(:bulk_upload, user:, year: 2024)} context "with headers" do let(:seed) { rand } - let(:log_to_csv) { BulkUpload::LettingsLogToCsv.new(log:) } let(:field_numbers) { log_to_csv.default_2024_field_numbers } let(:field_values) { log_to_csv.to_2024_row } @@ -100,7 +98,7 @@ RSpec.describe BulkUpload::Lettings::Validator do describe "#call" do context "with an invalid 2024 csv" do - let(:log_to_csv) { BulkUpload::LettingsLogToCsv.new(log:) } + let(:log) { build(:lettings_log, :completed, startdate: Time.zone.local(2024, 7, 1), period: 2, assigned_to: user) } before do values = log_to_csv.to_2024_row @@ -129,12 +127,10 @@ RSpec.describe BulkUpload::Lettings::Validator do end end - context "with a valid 2024 csv" do - let(:log_to_csv) { BulkUpload::LettingsLogToCsv.new(log:) } - + context "with a valid csv" do before do - file.write(log_to_csv.default_2024_field_numbers_row) - file.write(log_to_csv.to_2024_csv_row) + file.write(log_to_csv.default_field_numbers_row) + file.write(log_to_csv.to_csv_row) file.rewind end @@ -145,11 +141,11 @@ RSpec.describe BulkUpload::Lettings::Validator do context "with arbitrary ordered invalid csv" do let(:seed) { 321 } - let(:log_to_csv) { BulkUpload::LettingsLogToCsv.new(log:) } + let(:log) { build(:lettings_log, :completed, startdate: Time.zone.local(2024, 7, 1), period: 2, assigned_to: user) } before do + log.needstype = nil values = log_to_csv.to_2024_row - values[3] = nil file.write(log_to_csv.default_2024_field_numbers_row(seed:)) file.write(log_to_csv.to_custom_csv_row(seed:, field_values: values)) file.close @@ -175,14 +171,10 @@ RSpec.describe BulkUpload::Lettings::Validator do end context "when duplicate rows present" do - let(:file) { Tempfile.new } - let(:path) { file.path } - let(:log) { build(:lettings_log, :completed) } - before do - file.write(BulkUpload::LettingsLogToCsv.new(log:, line_ending: "\r\n").default_2024_field_numbers_row) - file.write(BulkUpload::LettingsLogToCsv.new(log:, line_ending: "\r\n").to_2024_csv_row) - file.write(BulkUpload::LettingsLogToCsv.new(log:, line_ending: "\r\n").to_2024_csv_row) + file.write(log_to_csv.default_field_numbers_row) + file.write(log_to_csv.to_csv_row) + file.write(log_to_csv.to_csv_row) file.close end @@ -196,12 +188,12 @@ RSpec.describe BulkUpload::Lettings::Validator do { line_ending: "\r\n", name: "windows" }, ].each do |test_case| context "with #{test_case[:name]} line endings" do - context "with a valid file" do - let(:log_to_csv) { BulkUpload::LettingsLogToCsv.new(log:, line_ending: test_case[:line_ending]) } + let(:log_to_csv) { BulkUpload::LettingsLogToCsv.new(log:, line_ending: test_case[:line_ending]) } + context "with a valid file" do before do - file.write(log_to_csv.default_2024_field_numbers_row) - file.write(log_to_csv.to_2024_csv_row) + file.write(log_to_csv.default_field_numbers_row) + file.write(log_to_csv.to_csv_row) file.rewind end @@ -212,11 +204,10 @@ RSpec.describe BulkUpload::Lettings::Validator do context "with an invalid file" do let(:log) { build(:lettings_log, :completed, assigned_to: user, owning_organisation: organisation, managing_organisation: organisation, declaration: nil) } - let(:log_to_csv) { BulkUpload::LettingsLogToCsv.new(log:, line_ending: test_case[:line_ending]) } before do - file.write(log_to_csv.default_2024_field_numbers_row) - file.write(log_to_csv.to_2024_csv_row) + file.write(log_to_csv.default_field_numbers_row) + file.write(log_to_csv.to_csv_row) file.rewind end @@ -227,13 +218,11 @@ RSpec.describe BulkUpload::Lettings::Validator do end end - context "without headers" do - let(:log) { build(:lettings_log, :completed) } - let(:file) { Tempfile.new } - let(:path) { file.path } + context "with a 2024 csv without headers" do + let(:log) { build(:lettings_log, :completed, startdate: Time.zone.local(2024, 7, 1), period: 2, assigned_to: user) } before do - file.write(BulkUpload::LettingsLogToCsv.new(log:, line_ending: "\r\n", col_offset: 0).to_2024_csv_row) + file.write(log_to_csv.to_csv_row) file.close end @@ -244,29 +233,29 @@ RSpec.describe BulkUpload::Lettings::Validator do end describe "#create_logs?" do - context "when a log is not valid?" do - let(:log_1) { build(:lettings_log, :completed, assigned_to: user) } - let(:log_2) { build(:lettings_log, :completed, assigned_to: user) } + 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) } before do - file.write(BulkUpload::LettingsLogToCsv.new(log: log_1, line_ending: "\r\n", col_offset: 0).to_2024_csv_row) - file.write(BulkUpload::LettingsLogToCsv.new(log: log_2, line_ending: "\r\n", col_offset: 0, overrides: { illness: 100 }).to_2024_csv_row) + file.write(BulkUpload::LettingsLogToCsv.new(log: log_1, col_offset: 0).to_csv_row) + file.write(BulkUpload::LettingsLogToCsv.new(log: log_2, col_offset: 0, overrides: { age1: 5 }).to_csv_row) file.close end it "returns false" do validator.call - expect(validator).not_to be_create_logs + expect(validator).to be_create_logs end end context "when all logs valid?" do - let(:log_1) { build(:lettings_log, :completed, renttype: 1, assigned_to: user) } - let(:log_2) { build(:lettings_log, :completed, renttype: 1, assigned_to: user) } + let(:log_1) { build(:lettings_log, :completed, period: 2, assigned_to: user) } + let(:log_2) { build(:lettings_log, :completed, period: 2, assigned_to: user) } before do - file.write(BulkUpload::LettingsLogToCsv.new(log: log_1, line_ending: "\r\n", col_offset: 0).to_2024_csv_row) - file.write(BulkUpload::LettingsLogToCsv.new(log: log_2, line_ending: "\r\n", col_offset: 0).to_2024_csv_row) + file.write(BulkUpload::LettingsLogToCsv.new(log: log_1, col_offset: 0).to_csv_row) + file.write(BulkUpload::LettingsLogToCsv.new(log: log_2, col_offset: 0).to_csv_row) file.close end @@ -276,13 +265,13 @@ RSpec.describe BulkUpload::Lettings::Validator do end end - context "when a single log wants to block log creation" do + context "when a log wants to block log creation" do let(:unaffiliated_org) { create(:organisation) } - let(:log_1) { build(:lettings_log, :completed, renttype: 1, assigned_to: user, owning_organisation: unaffiliated_org) } + let(:log) { build(:lettings_log, :completed, assigned_to: user, owning_organisation: unaffiliated_org) } before do - file.write(BulkUpload::LettingsLogToCsv.new(log: log_1, line_ending: "\r\n", col_offset: 0).to_2024_csv_row) + file.write(log_to_csv.to_csv_row) file.close end @@ -293,10 +282,10 @@ RSpec.describe BulkUpload::Lettings::Validator do end context "when a log has incomplete setup section" do - let(:log) { build(:lettings_log, :completed, renttype: 1, declaration: nil, assigned_to: user) } + let(:log) { build(:lettings_log, :completed, declaration: nil, assigned_to: user) } before do - file.write(BulkUpload::LettingsLogToCsv.new(log:, line_ending: "\r\n", col_offset: 0).to_2024_csv_row) + file.write(log_to_csv.to_csv_row) file.close end diff --git a/spec/support/bulk_upload/lettings_log_to_csv.rb b/spec/support/bulk_upload/lettings_log_to_csv.rb index 3af5731ce..c28d13c71 100644 --- a/spec/support/bulk_upload/lettings_log_to_csv.rb +++ b/spec/support/bulk_upload/lettings_log_to_csv.rb @@ -12,6 +12,62 @@ class BulkUpload::LettingsLogToCsv [nil] * col_offset end + def to_csv_row(seed: nil) + year = log.collection_start_year + case year + when 2022 + to_2022_csv_row(seed:) + when 2023 + to_2023_csv_row(seed:) + when 2024 + to_2024_csv_row(seed:) + else + raise NotImplementedError "No mapping function implemented for year #{year}" + end + end + + def to_row + year = log.collection_start_year + case year + when 2022 + to_2022_row + when 2023 + to_2023_row + when 2024 + to_2024_row + else + raise NotImplementedError "No mapping function implemented for year #{year}" + end + end + + def default_field_numbers_row(seed: nil) + year = log.collection_start_year + case year + when 2022 + default_2022_field_numbers_row(seed:) + when 2023 + default_2023_field_numbers_row(seed:) + when 2024 + default_2024_field_numbers_row(seed:) + else + raise NotImplementedError "No mapping function implemented for year #{year}" + end + end + + def default_field_numbers + year = log.collection_start_year + case year + when 2022 + default_2022_field_numbers + when 2023 + default_2023_field_numbers + when 2024 + default_2024_field_numbers + else + raise NotImplementedError "No mapping function implemented for year #{year}" + end + end + def to_2022_csv_row(seed: nil) if seed row = to_2022_row.shuffle(random: Random.new(seed)) @@ -421,7 +477,7 @@ private end def rent_type - case log.renttype + case log.rent_type when LettingsLog::RENT_TYPE[:social_rent] 1 when LettingsLog::RENT_TYPE[:affordable_rent]