From dd07132911556a09fdefa58b40cca7faceaa3f85 Mon Sep 17 00:00:00 2001 From: Sam Seed Date: Thu, 20 Apr 2023 15:26:52 +0100 Subject: [PATCH] test: update 2022 csv parser tests to work like 2023 --- .../lettings/year2022/csv_parser_spec.rb | 134 ++++++++++++++---- spec/support/bulk_upload/log_to_csv.rb | 17 ++- 2 files changed, 123 insertions(+), 28 deletions(-) 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 d396ad78e..4119e0ad2 100644 --- a/spec/services/bulk_upload/lettings/year2022/csv_parser_spec.rb +++ b/spec/services/bulk_upload/lettings/year2022/csv_parser_spec.rb @@ -3,24 +3,86 @@ require "rails_helper" RSpec.describe BulkUpload::Lettings::Year2022::CsvParser do subject(:service) { described_class.new(path:) } - let(:path) { file_fixture("2022_23_lettings_bulk_upload.csv") } + let(:file) { Tempfile.new } + let(:path) { file.path } + let(:log) { build(:lettings_log, :completed) } context "when parsing csv with headers" do + before do + file.write(BulkUpload::LogToCsv.new(log:).default_2022_field_numbers_row) + file.write(BulkUpload::LogToCsv.new(log:).to_2022_csv_row) + file.rewind + end + it "returns correct offsets" do - expect(service.row_offset).to eq(5) + expect(service.row_offset).to eq(1) expect(service.col_offset).to eq(1) end it "parses csv correctly" do - expect(service.row_parsers[0].field_12.to_i).to eq(55) + expect(service.row_parsers[0].field_12.to_i).to eq(35) end end - context "when parsing csv without headers" do - let(:file) { Tempfile.new } - let(:path) { file.path } - let(:log) { build(:lettings_log, :completed) } + context "when parsing csv with headers with extra rows" do + before do + file.write("Extra row\n") + file.write(BulkUpload::LogToCsv.new(log:).default_2022_field_numbers_row) + file.write(BulkUpload::LogToCsv.new(log:).to_2022_csv_row) + file.rewind + end + + it "returns correct offsets" do + expect(service.row_offset).to eq(2) + expect(service.col_offset).to eq(1) + end + + it "parses csv correctly" do + expect(service.row_parsers[0].field_12.to_i).to eq(35) + end + end + + context "when parsing csv with headers in arbitrary order" do + let(:seed) { rand } + + before do + file.write(BulkUpload::LogToCsv.new(log:).default_2022_field_numbers_row(seed:)) + file.write(BulkUpload::LogToCsv.new(log:).to_2022_csv_row(seed:)) + file.rewind + end + + it "returns correct offsets" do + expect(service.row_offset).to eq(1) + expect(service.col_offset).to eq(1) + end + + it "parses csv correctly" do + expect(service.row_parsers[0].field_12.to_i).to eq(35) + end + end + + context "when parsing csv with extra invalid headers" do + let(:seed) { rand } + let(:log_to_csv) { BulkUpload::LogToCsv.new(log:) } + let(:field_numbers) { log_to_csv.default_2022_field_numbers + %w[invalid_field_number] } + let(:field_values) { log_to_csv.to_2022_row + %w[value_for_invalid_field_number] } + + before do + file.write(log_to_csv.custom_field_numbers_row(seed:, field_numbers:)) + file.write(log_to_csv.to_custom_csv_row(seed:, field_values:)) + file.rewind + end + + it "parses csv correctly" do + expect(service.row_parsers[0].field_12.to_i).to eq(35) + end + + it "counts the number of valid field numbers correctly" do + expect(service.incorrect_field_count?).to be false + end + end + context "when parsing csv without headers" do before do file.write(BulkUpload::LogToCsv.new(log:, col_offset: 0).to_2022_csv_row) file.rewind @@ -32,59 +94,62 @@ RSpec.describe BulkUpload::Lettings::Year2022::CsvParser do end it "parses csv correctly" do - expect(service.row_parsers[0].field_12.to_i).to eql(log.age1) + expect(service.row_parsers[0].field_12.to_i).to eql(35) end end context "when parsing with BOM aka byte order mark" do - let(:file) { Tempfile.new } - let(:path) { file.path } - let(:log) { build(:lettings_log, :completed) } let(:bom) { "\uFEFF" } before do file.write(bom) file.write(BulkUpload::LogToCsv.new(log:, col_offset: 0).to_2022_csv_row) - file.close + file.rewind end it "parses csv correctly" do - expect(service.row_parsers[0].field_12.to_i).to eql(log.age1) + expect(service.row_parsers[0].field_12.to_i).to eql(35) end end context "when an invalid byte sequence" do - let(:file) { Tempfile.new } - let(:path) { file.path } - let(:log) { build(:lettings_log, :completed) } let(:invalid_sequence) { "\x81" } before do file.write(invalid_sequence) file.write(BulkUpload::LogToCsv.new(log:, col_offset: 0).to_2022_csv_row) - file.close + file.rewind end it "parses csv correctly" do - expect(service.row_parsers[0].field_12.to_i).to eql(log.age1) + expect(service.row_parsers[0].field_12.to_i).to eql(35) end end + + + + + + + describe "#column_for_field", aggregate_failures: true do - context "when headers present" do + context "when with headers using default ordering" do + before do + file.write(BulkUpload::LogToCsv.new(log:).default_2022_field_numbers_row) + file.write(BulkUpload::LogToCsv.new(log:).to_2022_csv_row) + file.rewind + end + 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) } - + context "when without headers using default ordering" do before do - file.write(BulkUpload::LogToCsv.new(log:, col_offset: 0).to_2022_csv_row) + file.write(BulkUpload::LogToCsv.new(log:).to_2022_csv_row) file.rewind end @@ -93,5 +158,22 @@ RSpec.describe BulkUpload::Lettings::Year2022::CsvParser do expect(service.column_for_field("field_134")).to eql("ED") end end + + context "when with headers using custom ordering" do + let(:seed) { 123 } + + before do + file.write(BulkUpload::LogToCsv.new(log:).default_2022_field_numbers_row(seed:)) + file.write(BulkUpload::LogToCsv.new(log:).to_2022_csv_row(seed:)) + file.rewind + end + + it "returns correct column" do + expect(service.column_for_field("field_1")).to eql("I") + expect(service.column_for_field("field_45")).to eql("BE") + expect(service.column_for_field("field_90")).to eql("AN") + expect(service.column_for_field("field_134")).to eql("BA") + end + end end -end +end \ No newline at end of file diff --git a/spec/support/bulk_upload/log_to_csv.rb b/spec/support/bulk_upload/log_to_csv.rb index 95011c2d8..6064e57e3 100644 --- a/spec/support/bulk_upload/log_to_csv.rb +++ b/spec/support/bulk_upload/log_to_csv.rb @@ -12,8 +12,13 @@ class BulkUpload::LogToCsv [nil] * col_offset end - def to_2022_csv_row - (row_prefix + to_2022_row).flatten.join(",") + line_ending + def to_2022_csv_row(seed: nil) + if seed + row = to_2022_row.shuffle(random: Random.new(seed)) + (row_prefix + row).flatten.join(",") + line_ending + else + (row_prefix + to_2022_row).flatten.join(",") + line_ending + end end def to_2022_sales_csv_row @@ -24,6 +29,14 @@ class BulkUpload::LogToCsv (1..134).to_a end + def default_2022_field_numbers_row(seed: nil) + if seed + ["Bulk upload field number"] + default_2022_field_numbers.shuffle(random: Random.new(seed)) + else + ["Bulk upload field number"] + default_2022_field_numbers + end.flatten.join(",") + line_ending + end + def to_2023_csv_row(seed: nil) if seed row = to_2023_row.shuffle(random: Random.new(seed))