From 3c69614978f04efccb1e4e6704c618ddea95330d Mon Sep 17 00:00:00 2001 From: Steve Laing Date: Mon, 24 Jul 2023 11:59:11 +0100 Subject: [PATCH] Handle non-CSV file upload errors --- app/forms/support_interface/upload_form.rb | 3 +++ .../create_childrens_barred_list_entries.rb | 4 +++- app/views/support_interface/uploads/new.html.erb | 1 + config/locales/en.yml | 1 + spec/forms/support_interface/upload_form_spec.rb | 13 +++++++++++++ 5 files changed, 21 insertions(+), 1 deletion(-) diff --git a/app/forms/support_interface/upload_form.rb b/app/forms/support_interface/upload_form.rb index dde637bd..21d616c5 100644 --- a/app/forms/support_interface/upload_form.rb +++ b/app/forms/support_interface/upload_form.rb @@ -10,6 +10,9 @@ def save return false unless valid? CreateChildrensBarredListEntries.new(file.read).call + rescue CSV::MalformedCSVError + errors.add(:file, :invalid_csv) + false end end end diff --git a/app/services/create_childrens_barred_list_entries.rb b/app/services/create_childrens_barred_list_entries.rb index 48e83db0..b685a86b 100644 --- a/app/services/create_childrens_barred_list_entries.rb +++ b/app/services/create_childrens_barred_list_entries.rb @@ -1,6 +1,8 @@ require "csv" class CreateChildrensBarredListEntries + TITLES_REGEX = /^(mr|mrs|miss|ms|dr|prof)\.? /i + def initialize(raw_data) @raw_data = raw_data end @@ -30,7 +32,7 @@ def pad_trn(trn) end def format_names(names) - names.gsub!(/^(mr|mrs|miss|ms|dr|prof)\.? /i, "") + names.gsub!(TITLES_REGEX, "") names.split(" ").map(&:capitalize).join(" ") end end diff --git a/app/views/support_interface/uploads/new.html.erb b/app/views/support_interface/uploads/new.html.erb index 7a542605..f598dd48 100644 --- a/app/views/support_interface/uploads/new.html.erb +++ b/app/views/support_interface/uploads/new.html.erb @@ -8,6 +8,7 @@ <%= f.govuk_error_summary %> <%= f.govuk_file_field :file, + accept: "text/csv", label: { text: "Select a file to upload", class: "govuk-heading-m" }, hint: { text: "You should upload your files in CSV format." } %> diff --git a/config/locales/en.yml b/config/locales/en.yml index 33ab5e0a..1f691b96 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -17,3 +17,4 @@ en: attributes: file: blank: Please select a CSV file to upload + invalid_csv: Please ensure file is in CSV format and try again diff --git a/spec/forms/support_interface/upload_form_spec.rb b/spec/forms/support_interface/upload_form_spec.rb index 7411607f..41c6aae1 100644 --- a/spec/forms/support_interface/upload_form_spec.rb +++ b/spec/forms/support_interface/upload_form_spec.rb @@ -28,5 +28,18 @@ expect { form.save }.to change { ChildrensBarredListEntry.count }.by(2) end end + + context "when the file contents are invalid" do + let(:invalid_csv_data) { %(1, "foo", 3) } + + subject(:form) do + described_class.new(file: StringIO.new(invalid_csv_data)) + end + + it "adds an error to the file attribute" do + expect(form.save).to eq(false) + expect(form.errors[:file]).to include("Please ensure file is in CSV format and try again") + end + end end end