From d2d046a39df3e456d06e8a242229e921082f6db7 Mon Sep 17 00:00:00 2001 From: kara Diaby Date: Mon, 12 Jul 2021 14:00:26 +0200 Subject: [PATCH] fix encoding problems with cherlock Holmes gem --- Gemfile | 1 + Gemfile.lock | 2 ++ .../groupe_instructeurs_controller.rb | 5 ++++- .../groupe_instructeurs_controller_spec.rb | 10 ++++++++++ .../fixtures/files/groupe_avec_caracteres_speciaux.csv | 5 +++++ 5 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 spec/fixtures/files/groupe_avec_caracteres_speciaux.csv diff --git a/Gemfile b/Gemfile index 3c7f41916..2e10ff81d 100644 --- a/Gemfile +++ b/Gemfile @@ -12,6 +12,7 @@ gem 'anchored' gem 'bcrypt' gem 'bootsnap', '>= 1.4.4', require: false # Reduces boot times through caching; required in config/boot.rb gem 'browser' +gem 'charlock_holmes' gem 'chartkick' gem 'chunky_png' gem 'clamav-client', require: 'clamav/client' diff --git a/Gemfile.lock b/Gemfile.lock index eb21c74b0..5a1f455c1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -155,6 +155,7 @@ GEM marcel (~> 1.0) nokogiri (~> 1.10, >= 1.10.4) rubyzip (>= 1.3.0, < 3) + charlock_holmes (0.7.7) chartkick (3.4.2) childprocess (3.0.0) choice (0.2.0) @@ -793,6 +794,7 @@ DEPENDENCIES capybara-email capybara-screenshot capybara-selenium + charlock_holmes chartkick chunky_png clamav-client diff --git a/app/controllers/new_administrateur/groupe_instructeurs_controller.rb b/app/controllers/new_administrateur/groupe_instructeurs_controller.rb index ce51452e9..23086104f 100644 --- a/app/controllers/new_administrateur/groupe_instructeurs_controller.rb +++ b/app/controllers/new_administrateur/groupe_instructeurs_controller.rb @@ -170,7 +170,10 @@ module NewAdministrateur redirect_to admin_procedure_groupe_instructeurs_path(procedure) else - groupes_emails = CSV.new(group_csv_file.read.force_encoding("UTF-8"), headers: true, header_converters: :downcase) + file = group_csv_file.read + # find the original encoding to avoid encoding errors + base_encoding = CharlockHolmes::EncodingDetector.detect(file) + groupes_emails = CSV.new(file.encode("UTF-8", base_encoding[:encoding], invalid: :replace, replace: ""), headers: true, header_converters: :downcase) .map { |r| r.to_h.slice('groupe', 'email') } groupes_emails_has_keys = groupes_emails.first.has_key?("groupe") && groupes_emails.first.has_key?("email") diff --git a/spec/controllers/new_administrateur/groupe_instructeurs_controller_spec.rb b/spec/controllers/new_administrateur/groupe_instructeurs_controller_spec.rb index d3308a54d..bc1bcf04e 100644 --- a/spec/controllers/new_administrateur/groupe_instructeurs_controller_spec.rb +++ b/spec/controllers/new_administrateur/groupe_instructeurs_controller_spec.rb @@ -365,6 +365,16 @@ describe NewAdministrateur::GroupeInstructeursController, type: :controller do it { expect(flash.alert).to eq("Import terminé. Cependant les emails suivants ne sont pas pris en compte: kara") } end + context 'when the content of csv contains special characters' do + let(:csv_file) { fixture_file_upload('spec/fixtures/files/groupe_avec_caracteres_speciaux.csv', 'text/csv') } + + before { subject } + + it { expect(procedure.groupe_instructeurs.pluck(:label)).to eq(["défaut", "Auvergne-Rhône-Alpes", "Vendée"]) } + it { expect(flash.notice).to be_present } + it { expect(flash.notice).to eq("La liste des instructeurs a été importée avec succès") } + end + context 'when the csv file length is more than 1 mo' do let(:csv_file) { fixture_file_upload('spec/fixtures/files/groupe-instructeur.csv', 'text/csv') } diff --git a/spec/fixtures/files/groupe_avec_caracteres_speciaux.csv b/spec/fixtures/files/groupe_avec_caracteres_speciaux.csv new file mode 100644 index 000000000..376e358f0 --- /dev/null +++ b/spec/fixtures/files/groupe_avec_caracteres_speciaux.csv @@ -0,0 +1,5 @@ +Email,Groupe +kara@beta.gouv.fr,Auvergne-Rhône-Alpes +camilya@beta.gouv.fr,Vendée +philippe@beta.gouv.fr,Auvergne-Rhône-Alpes +sim@beta.gouv.fr,Vendée \ No newline at end of file