diff --git a/app/jobs/data_import_job.rb b/app/jobs/data_import_job.rb index d8bbeb992..4149ee16f 100644 --- a/app/jobs/data_import_job.rb +++ b/app/jobs/data_import_job.rb @@ -106,6 +106,7 @@ class DataImportJob < ApplicationJob raw_data = file.read utf8_data = raw_data.force_encoding('UTF-8') clean_data = utf8_data.valid_encoding? ? utf8_data : utf8_data.encode('UTF-16le', invalid: :replace, replace: '').encode('UTF-8') + clean_data = clean_data.delete_prefix("\xEF\xBB\xBF") CSV.new(StringIO.new(clean_data), headers: true) end diff --git a/spec/fixtures/data_import/with_bom.csv b/spec/fixtures/data_import/with_bom.csv new file mode 100644 index 000000000..8b1850620 --- /dev/null +++ b/spec/fixtures/data_import/with_bom.csv @@ -0,0 +1,2 @@ +name,email,phone_number +Ahmed,ahmed@example.com,+971501234567 diff --git a/spec/jobs/data_import_job_spec.rb b/spec/jobs/data_import_job_spec.rb index 19178b177..88b268ef6 100644 --- a/spec/jobs/data_import_job_spec.rb +++ b/spec/jobs/data_import_job_spec.rb @@ -91,6 +91,20 @@ RSpec.describe DataImportJob do expect(invalid_data_import.account.contacts.first.name).to eq(csv_data[0]['name'].encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '')) end + + it 'will strip UTF-8 BOM and import contacts correctly' do + bom_data_import = create(:data_import, + import_file: Rack::Test::UploadedFile.new(Rails.root.join('spec/fixtures/data_import/with_bom.csv'), + 'text/csv')) + + described_class.perform_now(bom_data_import) + expect(bom_data_import.account.contacts.count).to eq(1) + + contact = bom_data_import.account.contacts.first + expect(contact.name).to eq('Ahmed') + expect(contact.email).to eq('ahmed@example.com') + expect(contact.phone_number).to eq('+971501234567') + end end context 'when the data contains existing records' do