From e7e03cacd5dbd73b2b6e2c8792c6b661f340f594 Mon Sep 17 00:00:00 2001 From: Phil Lee Date: Thu, 19 Jan 2023 17:09:15 +0000 Subject: [PATCH] fix bulk upload line ending parsing --- .../bulk_upload/lettings/log_creator.rb | 6 +--- .../bulk_upload/lettings/validator.rb | 6 +--- .../bulk_upload/lettings/validator_spec.rb | 33 +++++++++++++++++++ spec/support/bulk_upload/log_to_csv.rb | 7 ++-- 4 files changed, 39 insertions(+), 13 deletions(-) diff --git a/app/services/bulk_upload/lettings/log_creator.rb b/app/services/bulk_upload/lettings/log_creator.rb index 6d6b7a27d..d278cbe52 100644 --- a/app/services/bulk_upload/lettings/log_creator.rb +++ b/app/services/bulk_upload/lettings/log_creator.rb @@ -56,14 +56,10 @@ private contents = "" File.open(path, "r") do |f| - f.seek(9900) contents = f.read end - rn_count = contents.scan("\r\n").count - n_count = contents.scan(/[^\r]\n/).count - - if rn_count > n_count + if contents[-2..] == "\r\n" "\r\n" else "\n" diff --git a/app/services/bulk_upload/lettings/validator.rb b/app/services/bulk_upload/lettings/validator.rb index 69857707d..221819637 100644 --- a/app/services/bulk_upload/lettings/validator.rb +++ b/app/services/bulk_upload/lettings/validator.rb @@ -212,14 +212,10 @@ private contents = "" File.open(path, "r") do |f| - f.seek(9900) contents = f.read end - rn_count = contents.scan("\r\n").count - n_count = contents.scan(/[^\r]\n/).count - - if rn_count > n_count + if contents[-2..] == "\r\n" "\r\n" else "\n" diff --git a/spec/services/bulk_upload/lettings/validator_spec.rb b/spec/services/bulk_upload/lettings/validator_spec.rb index 27d52b214..624345aac 100644 --- a/spec/services/bulk_upload/lettings/validator_spec.rb +++ b/spec/services/bulk_upload/lettings/validator_spec.rb @@ -46,6 +46,39 @@ RSpec.describe BulkUpload::Lettings::Validator do expect(error.row).to eq("7") end end + + context "with unix line endings" do + let(:fixture_path) { file_fixture("2022_23_lettings_bulk_upload.csv") } + let(:file) { Tempfile.new } + let(:path) { file.path } + + before do + string = File.read(fixture_path) + string.gsub!("\r\n", "\n") + file.write(string) + file.rewind + end + + it "creates validation errors" do + expect { validator.call }.to change(BulkUploadError, :count) + end + end + + context "without headers" do + let(:log) { build(:lettings_log, :completed) } + let(:file) { Tempfile.new } + let(:path) { file.path } + + before do + file.write("\r\n" * 5) + file.write(BulkUpload::LogToCsv.new(log:, line_ending: "\r\n").to_csv_row) + file.rewind + end + + it "creates validation errors" do + expect { validator.call }.to change(BulkUploadError, :count) + end + end end describe "#should_create_logs?" do diff --git a/spec/support/bulk_upload/log_to_csv.rb b/spec/support/bulk_upload/log_to_csv.rb index 4bca53358..e7d1273d8 100644 --- a/spec/support/bulk_upload/log_to_csv.rb +++ b/spec/support/bulk_upload/log_to_csv.rb @@ -1,8 +1,9 @@ class BulkUpload::LogToCsv - attr_reader :log + attr_reader :log, :line_ending - def initialize(log:) + def initialize(log:, line_ending: "\n") @log = log + @line_ending = line_ending end def to_csv_row @@ -152,7 +153,7 @@ class BulkUpload::LogToCsv log.declaration, log.joint, renewal, - "\n", + line_ending, ].join(",") end