From e778f41b442f3640693ea7059060771da1e9f45e Mon Sep 17 00:00:00 2001 From: Sam Seed Date: Tue, 18 Apr 2023 16:55:20 +0100 Subject: [PATCH] feat: add validation that max col count not exceeded when no headers --- app/services/bulk_upload/lettings/validator.rb | 9 +++++++++ app/services/bulk_upload/lettings/year2023/csv_parser.rb | 9 +++++---- config/locales/en.yml | 1 + 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/app/services/bulk_upload/lettings/validator.rb b/app/services/bulk_upload/lettings/validator.rb index f74a108a1..aba32fd0e 100644 --- a/app/services/bulk_upload/lettings/validator.rb +++ b/app/services/bulk_upload/lettings/validator.rb @@ -10,6 +10,7 @@ class BulkUpload::Lettings::Validator validate :validate_file_not_empty validate :validate_field_numbers_count + validate :validate_max_columns_count_if_no_headers def initialize(bulk_upload:, path:) @bulk_upload = bulk_upload @@ -134,6 +135,14 @@ private errors.add(:base, :wrong_field_numbers_count) if csv_parser.valid_field_numbers_count != csv_parser.class::FIELDS end + def validate_max_columns_count_if_no_headers + return if halt_validations? || csv_parser.with_headers? + + max_columns_count = body_rows.map(&:size).max - col_offset + + errors.add(:base, :over_max_column_count) if max_columns_count > csv_parser.class::MAX_COLUMNS + end + def halt_validations! @halt_validations = true end diff --git a/app/services/bulk_upload/lettings/year2023/csv_parser.rb b/app/services/bulk_upload/lettings/year2023/csv_parser.rb index 073b0f74d..1a48abad7 100644 --- a/app/services/bulk_upload/lettings/year2023/csv_parser.rb +++ b/app/services/bulk_upload/lettings/year2023/csv_parser.rb @@ -2,6 +2,7 @@ require "csv" class BulkUpload::Lettings::Year2023::CsvParser FIELDS = 134 + MAX_COLUMNS = 141 attr_reader :path @@ -50,6 +51,10 @@ class BulkUpload::Lettings::Year2023::CsvParser field_numbers.count { |f| f != "field_blank" } end + def with_headers? + rows.map { |r| r[0] }.any? { |cell| cell&.match?(/field number/i) } + end + private def default_field_numbers @@ -64,10 +69,6 @@ private end end - def with_headers? - rows.map { |r| r[0] }.any? { |cell| cell&.match?(/field number/i) } - end - def row_sep "\n" end diff --git a/config/locales/en.yml b/config/locales/en.yml index 670a6df9a..7bf8839a9 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -45,6 +45,7 @@ en: attributes: base: wrong_field_numbers_count: "incorrect number of fields, please ensure you have used the correct template" + over_max_column_count: "too many columns, please ensure you have used the correct template" forms/bulk_upload_lettings/year: attributes: year: