From 829fc7a32291f0fd214ebed48ed36de2097a9f8e Mon Sep 17 00:00:00 2001 From: Phil Lee Date: Wed, 15 Mar 2023 10:26:41 +0000 Subject: [PATCH] able to return column for given field --- .../lettings/year2022/csv_parser.rb | 8 +++ .../lettings/year2023/csv_parser.rb | 14 +++-- .../lettings/year2022/csv_parser_spec.rb | 25 +++++++++ .../lettings/year2023/csv_parser_spec.rb | 56 +++++++++++++++++++ 4 files changed, 98 insertions(+), 5 deletions(-) diff --git a/app/services/bulk_upload/lettings/year2022/csv_parser.rb b/app/services/bulk_upload/lettings/year2022/csv_parser.rb index 0e337abf0..81977c3cb 100644 --- a/app/services/bulk_upload/lettings/year2022/csv_parser.rb +++ b/app/services/bulk_upload/lettings/year2022/csv_parser.rb @@ -39,8 +39,16 @@ class BulkUpload::Lettings::Year2022::CsvParser @rows ||= CSV.parse(normalised_string, row_sep:) end + def column_for_field(field) + cols[headers.find_index(field) + col_offset] + end + private + def headers + @headers ||= ("field_1".."field_134").to_a + end + def with_headers? rows[0][0]&.match?(/\D+/) end diff --git a/app/services/bulk_upload/lettings/year2023/csv_parser.rb b/app/services/bulk_upload/lettings/year2023/csv_parser.rb index 17d14f86c..27bf9949f 100644 --- a/app/services/bulk_upload/lettings/year2023/csv_parser.rb +++ b/app/services/bulk_upload/lettings/year2023/csv_parser.rb @@ -38,6 +38,10 @@ class BulkUpload::Lettings::Year2023::CsvParser @rows ||= CSV.parse(normalised_string, row_sep:) end + def column_for_field(field) + cols[field_numbers.find_index(field) + col_offset] + end + private def default_field_numbers @@ -45,11 +49,11 @@ private end def field_numbers - if with_headers? - rows[row_offset - 1][col_offset..].map { |h| h.present? ? "field_#{h}" : "field_blank" } - else - default_field_numbers - end + @field_numbers ||= if with_headers? + rows[row_offset - 1][col_offset..].map { |h| h.present? ? "field_#{h}" : "field_blank" } + else + default_field_numbers + end end def with_headers? diff --git a/spec/services/bulk_upload/lettings/year2022/csv_parser_spec.rb b/spec/services/bulk_upload/lettings/year2022/csv_parser_spec.rb index 5ec50b753..d396ad78e 100644 --- a/spec/services/bulk_upload/lettings/year2022/csv_parser_spec.rb +++ b/spec/services/bulk_upload/lettings/year2022/csv_parser_spec.rb @@ -69,4 +69,29 @@ RSpec.describe BulkUpload::Lettings::Year2022::CsvParser do expect(service.row_parsers[0].field_12.to_i).to eql(log.age1) end end + + describe "#column_for_field", aggregate_failures: true do + context "when headers present" do + it "returns correct column" do + expect(service.column_for_field("field_1")).to eql("B") + expect(service.column_for_field("field_134")).to eql("EE") + end + end + + context "when no headers" do + let(:file) { Tempfile.new } + let(:path) { file.path } + let(:log) { build(:lettings_log, :completed) } + + before do + file.write(BulkUpload::LogToCsv.new(log:, col_offset: 0).to_2022_csv_row) + file.rewind + end + + it "returns correct column" do + expect(service.column_for_field("field_1")).to eql("A") + expect(service.column_for_field("field_134")).to eql("ED") + end + end + end end diff --git a/spec/services/bulk_upload/lettings/year2023/csv_parser_spec.rb b/spec/services/bulk_upload/lettings/year2023/csv_parser_spec.rb index b933f3e73..b7c92f6f4 100644 --- a/spec/services/bulk_upload/lettings/year2023/csv_parser_spec.rb +++ b/spec/services/bulk_upload/lettings/year2023/csv_parser_spec.rb @@ -98,4 +98,60 @@ RSpec.describe BulkUpload::Lettings::Year2023::CsvParser do expect(service.row_parsers[0].field_13).to eql(log.tenancycode) end end + + describe "#column_for_field", aggregate_failures: true do + context "when with headers using default ordering" do + before do + file.write("Question\n") + file.write("Additional info\n") + file.write("Values\n") + file.write("Can be empty?\n") + file.write("Type of letting the question applies to\n") + file.write("Duplicate check field?\n") + file.write(BulkUpload::LogToCsv.new(log:).default_2023_field_numbers_row) + file.write(BulkUpload::LogToCsv.new(log:).to_2023_csv_row) + file.rewind + end + + it "returns correct column" do + expect(service.column_for_field("field_5")).to eql("B") + expect(service.column_for_field("field_22")).to eql("EL") + end + end + + context "when without headers using default ordering" do + before do + file.write(BulkUpload::LogToCsv.new(log:, col_offset: 0).to_2023_csv_row) + file.rewind + end + + it "returns correct column" do + expect(service.column_for_field("field_5")).to eql("A") + expect(service.column_for_field("field_22")).to eql("EK") + end + end + + context "when with headers using custom ordering" do + let(:seed) { 123 } + + before do + file.write("Question\n") + file.write("Additional info\n") + file.write("Values\n") + file.write("Can be empty?\n") + file.write("Type of letting the question applies to\n") + file.write("Duplicate check field?\n") + file.write(BulkUpload::LogToCsv.new(log:).default_2023_field_numbers_row(seed:)) + file.write(BulkUpload::LogToCsv.new(log:).to_2023_csv_row(seed:)) + file.rewind + end + + it "returns correct column" do + expect(service.column_for_field("field_5")).to eql("N") + expect(service.column_for_field("field_22")).to eql("O") + expect(service.column_for_field("field_26")).to eql("B") + expect(service.column_for_field("field_25")).to eql("EF") + end + end + end end