feat(groupe instructeur): allow import of many groups when procedure is not routed yet
This commit is contained in:
parent
126819939b
commit
9f0f5b0dc5
5 changed files with 178 additions and 189 deletions
|
@ -204,43 +204,33 @@ module Administrateurs
|
||||||
file = csv_file.read
|
file = csv_file.read
|
||||||
base_encoding = CharlockHolmes::EncodingDetector.detect(file)
|
base_encoding = CharlockHolmes::EncodingDetector.detect(file)
|
||||||
|
|
||||||
if params[:group_csv_file]
|
csv_content = ACSV::CSV.new_for_ruby3(file.encode("UTF-8", base_encoding[:encoding], invalid: :replace, replace: ""), headers: true, header_converters: :downcase).map(&:to_h)
|
||||||
groupes_emails = ACSV::CSV.new_for_ruby3(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")
|
if csv_content.first.has_key?("groupe") && csv_content.first.has_key?("email")
|
||||||
|
groupes_emails = csv_content.map { |r| r.to_h.slice('groupe', 'email') }
|
||||||
|
|
||||||
if groupes_emails_has_keys.blank?
|
added_instructeurs_by_group, invalid_emails = InstructeursImportService.import_groupes(procedure, groupes_emails)
|
||||||
flash[:alert] = "Importation impossible, veuillez importer un csv #{view_context.link_to('suivant ce modèle', "/csv/#{I18n.locale}/import-groupe-test.csv")}"
|
|
||||||
else
|
|
||||||
added_instructeurs_by_group, invalid_emails = InstructeursImportService.import_groupes(procedure, groupes_emails)
|
|
||||||
|
|
||||||
added_instructeurs_by_group.each do |groupe, added_instructeurs|
|
|
||||||
GroupeInstructeurMailer
|
|
||||||
.notify_added_instructeurs(groupe, added_instructeurs, current_administrateur.email)
|
|
||||||
.deliver_later
|
|
||||||
end
|
|
||||||
|
|
||||||
flash_message_for_import(invalid_emails)
|
|
||||||
end
|
|
||||||
|
|
||||||
elsif params[:instructeurs_csv_file]
|
|
||||||
instructors_emails = ACSV::CSV.new_for_ruby3(file.encode("UTF-8", base_encoding[:encoding], invalid: :replace, replace: ""), headers: true, header_converters: :downcase)
|
|
||||||
.map(&:to_h)
|
|
||||||
|
|
||||||
instructors_emails_has_key = instructors_emails.first.has_key?("email") && !instructors_emails.first.keys.many?
|
|
||||||
|
|
||||||
if instructors_emails_has_key.blank?
|
|
||||||
flash[:alert] = "Importation impossible, veuillez importer un csv #{view_context.link_to('suivant ce modèle', "/csv/import-instructeurs-test.csv")}"
|
|
||||||
else
|
|
||||||
added_instructeurs, invalid_emails = InstructeursImportService.import_instructeurs(procedure, instructors_emails)
|
|
||||||
|
|
||||||
|
added_instructeurs_by_group.each do |groupe, added_instructeurs|
|
||||||
GroupeInstructeurMailer
|
GroupeInstructeurMailer
|
||||||
.notify_added_instructeurs(groupe_instructeur, added_instructeurs, current_administrateur.email)
|
.notify_added_instructeurs(groupe, added_instructeurs, current_administrateur.email)
|
||||||
.deliver_later
|
.deliver_later
|
||||||
|
|
||||||
flash_message_for_import(invalid_emails)
|
flash_message_for_import(invalid_emails)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
elsif csv_content.first.has_key?("email") && !csv_content.map(&:to_h).first.keys.many? && procedure.groupe_instructeurs.one?
|
||||||
|
instructors_emails = csv_content.map(&:to_h)
|
||||||
|
|
||||||
|
added_instructeurs, invalid_emails = InstructeursImportService.import_instructeurs(procedure, instructors_emails)
|
||||||
|
|
||||||
|
GroupeInstructeurMailer
|
||||||
|
.notify_added_instructeurs(groupe_instructeur, added_instructeurs, current_administrateur.email)
|
||||||
|
.deliver_later
|
||||||
|
|
||||||
|
flash_message_for_import(invalid_emails)
|
||||||
|
else
|
||||||
|
flash_message_for_invalid_csv
|
||||||
end
|
end
|
||||||
redirect_to admin_procedure_groupe_instructeurs_path(procedure)
|
redirect_to admin_procedure_groupe_instructeurs_path(procedure)
|
||||||
end
|
end
|
||||||
|
@ -316,7 +306,7 @@ module Administrateurs
|
||||||
end
|
end
|
||||||
|
|
||||||
def csv_file
|
def csv_file
|
||||||
params[:group_csv_file] || params[:instructeurs_csv_file]
|
params[:csv_file]
|
||||||
end
|
end
|
||||||
|
|
||||||
def marcel_content_type
|
def marcel_content_type
|
||||||
|
@ -338,5 +328,9 @@ module Administrateurs
|
||||||
flash[:alert] = "Import terminé. Cependant les emails suivants ne sont pas pris en compte: #{result.join(', ')}"
|
flash[:alert] = "Import terminé. Cependant les emails suivants ne sont pas pris en compte: #{result.join(', ')}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def flash_message_for_invalid_csv
|
||||||
|
flash[:alert] = "Importation impossible, veuillez importer un csv suivant #{view_context.link_to('ce modèle', "/csv/import-instructeurs-test.csv")} pour une procédure sans routage ou #{view_context.link_to('celui-ci', "/csv/#{I18n.locale}/import-groupe-test.csv")} pour une procédure routée"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -28,13 +28,10 @@
|
||||||
= form_tag import_admin_procedure_groupe_instructeurs_path(procedure), method: :post, multipart: true, class: "mt-4 form" do
|
= form_tag import_admin_procedure_groupe_instructeurs_path(procedure), method: :post, multipart: true, class: "mt-4 form" do
|
||||||
= label_tag t('.csv_import.title')
|
= label_tag t('.csv_import.title')
|
||||||
%p.notice
|
%p.notice
|
||||||
= procedure.routing_enabled? ? t('.csv_import.routing_enabled.notice_1') : t('.csv_import.routing_disabled.notice_1')
|
= t('.csv_import.notice_1_html')
|
||||||
%p.notice
|
%p.notice
|
||||||
= t('.csv_import.notice_2', csv_max_size: number_to_human_size(csv_max_size))
|
= t('.csv_import.notice_2', csv_max_size: number_to_human_size(csv_max_size))
|
||||||
- sample_file_path = procedure.routing_enabled? ? "/csv/#{I18n.locale}/import-groupe-test.csv" : "/csv/import-instructeurs-test.csv"
|
= file_field_tag :csv_file, required: true, accept: 'text/csv', size: "1"
|
||||||
%p.mt-2.mb-2= link_to t('.csv_import.download_exemple'), sample_file_path
|
|
||||||
- csv_params = procedure.routing_enabled? ? :group_csv_file : :instructeurs_csv_file
|
|
||||||
= file_field_tag csv_params, required: true, accept: 'text/csv', size: "1"
|
|
||||||
= submit_tag t('.csv_import.import_file'), class: 'button primary send', data: { disable_with: "Envoi...", confirm: t('.csv_import.import_file_alert') }
|
= submit_tag t('.csv_import.import_file'), class: 'button primary send', data: { disable_with: "Envoi...", confirm: t('.csv_import.import_file_alert') }
|
||||||
- else
|
- else
|
||||||
%p.mt-4.form.font-weight-bold.mb-2.text-lg
|
%p.mt-4.form.font-weight-bold.mb-2.text-lg
|
||||||
|
|
|
@ -41,12 +41,8 @@ en:
|
||||||
notice: This group will be a choice from the list "%{routing_criteria_name}"
|
notice: This group will be a choice from the list "%{routing_criteria_name}"
|
||||||
csv_import:
|
csv_import:
|
||||||
title: CSV Import
|
title: CSV Import
|
||||||
routing_enabled:
|
notice_1_html: The csv file must have 1 column with instructors emails. For routed procedures, the csv file must have 2 columns (Group, Email) and be separated by commas. The import does not overwrite existing groups and instructors.
|
||||||
notice_1: The csv file must have 2 columns (Group, Email) and be separated by commas. The import does not overwrite existing groups and instructors.
|
|
||||||
routing_disabled:
|
|
||||||
notice_1: The csv file must have 1 column with instructors emails.
|
|
||||||
notice_2: The size of the file must be less than %{csv_max_size}.
|
notice_2: The size of the file must be less than %{csv_max_size}.
|
||||||
download_exemple: Download sample CSV file
|
|
||||||
import_file: Import file
|
import_file: Import file
|
||||||
import_file_procedure_not_published: The import of instructors by CSV file is available once the process has been published
|
import_file_procedure_not_published: The import of instructors by CSV file is available once the process has been published
|
||||||
import_file_alert: Instructors added to the procedure will receive an email. Are you sure you want to continue ?"
|
import_file_alert: Instructors added to the procedure will receive an email. Are you sure you want to continue ?"
|
||||||
|
|
|
@ -47,12 +47,10 @@ fr:
|
||||||
notice: Ce groupe sera un choix de la liste "%{routing_criteria_name}"
|
notice: Ce groupe sera un choix de la liste "%{routing_criteria_name}"
|
||||||
csv_import:
|
csv_import:
|
||||||
title: Importer par CSV
|
title: Importer par CSV
|
||||||
routing_enabled:
|
notice_1_html: |
|
||||||
notice_1: Le fichier csv doit comporter 2 colonnes (Groupe, Email) et être séparé par des virgules.
|
Pour une procédure standard, le fichier csv doit comporter 1 seule colonne (Email) avec une adresse email d'instructeur par ligne (<a href=\"/csv/import-instructeurs-test.csv\">exemple de fichier</a>).
|
||||||
routing_disabled:
|
Pour une procédure routée, le fichier doit comporter 2 colonnes (Groupe, Email) et être séparé par des virgules (<a href=\"/csv/fr/import-groupe-test.csv\">exemple de fichier</a>).
|
||||||
notice_1: Le fichier csv doit comporter 1 seule colonne (Email) avec une adresse email d'instructeur par ligne.
|
notice_2: L’import n’écrase pas les instructeurs existants. Il permet uniquement d'en ajouter. Pour supprimer un instructeur, cliquez sur le bouton « retirer ». Le poids du fichier doit être inférieur %{csv_max_size}.
|
||||||
notice_2: L’import n’écrase pas les groupes et les instructeurs existants. La modification du fichier csv ne s’opère que pour l’ajout de nouveaux instructeurs. La suppression d’un instructeur s’opère manuellement en cliquant sur le bouton « retirer ». Le poids du fichier doit être inférieur à %{csv_max_size}.
|
|
||||||
download_exemple: Télécharger l’exemple de fichier CSV
|
|
||||||
import_file: Importer le fichier
|
import_file: Importer le fichier
|
||||||
import_file_procedure_not_published: L’import d’instructeurs par fichier CSV est disponible une fois la démarche publiée
|
import_file_procedure_not_published: L’import d’instructeurs par fichier CSV est disponible une fois la démarche publiée
|
||||||
import_file_alert: Tous les instructeurs ajoutés à la procédure vont être notifiés par email. Voulez-vous continuer ?
|
import_file_alert: Tous les instructeurs ajoutés à la procédure vont être notifiés par email. Voulez-vous continuer ?
|
||||||
|
|
|
@ -389,165 +389,169 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#add_groupe_instructeurs_via_csv_file' do
|
describe '#import' do
|
||||||
subject do
|
let!(:gi_1_2) { procedure.groupe_instructeurs.create(label: 'groupe instructeur 2') }
|
||||||
post :import, params: { procedure_id: procedure.id, group_csv_file: csv_file }
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when the csv file is less than 1 mo and content type text/csv' do
|
|
||||||
let(:csv_file) { fixture_file_upload('spec/fixtures/files/groupe-instructeur.csv', 'text/csv') }
|
|
||||||
|
|
||||||
before { subject }
|
|
||||||
|
|
||||||
it { expect(response.status).to eq(302) }
|
|
||||||
it { expect(procedure.groupe_instructeurs.first.label).to eq("Afrique") }
|
|
||||||
it { expect(flash.alert).to be_present }
|
|
||||||
it { expect(flash.alert).to eq("Import terminé. Cependant les emails suivants ne sont pas pris en compte: kara") }
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when the csv file has only one column' do
|
|
||||||
let(:csv_file) { fixture_file_upload('spec/fixtures/files/valid-instructeurs-file.csv', 'text/csv') }
|
|
||||||
|
|
||||||
before { subject }
|
|
||||||
|
|
||||||
it { expect { subject }.not_to raise_error }
|
|
||||||
it { expect(response.status).to eq(302) }
|
|
||||||
it { expect(flash.alert).to be_present }
|
|
||||||
it { expect(flash.alert).to eq("Importation impossible, veuillez importer un csv <a href=\"/csv/#{I18n.locale}/import-groupe-test.csv\">suivant ce modèle</a>") }
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when the file content type is application/vnd.ms-excel' do
|
|
||||||
let(:csv_file) { fixture_file_upload('spec/fixtures/files/groupe_avec_caracteres_speciaux.csv', "application/vnd.ms-excel") }
|
|
||||||
|
|
||||||
before { subject }
|
|
||||||
|
|
||||||
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 content of csv contains special characters' do
|
|
||||||
let(:csv_file) { fixture_file_upload('spec/fixtures/files/groupe_avec_caracteres_speciaux.csv', 'text/csv') }
|
|
||||||
|
|
||||||
before do
|
|
||||||
allow(GroupeInstructeurMailer).to receive(:notify_added_instructeurs)
|
|
||||||
.and_return(double(deliver_later: true))
|
|
||||||
subject
|
|
||||||
end
|
|
||||||
|
|
||||||
it { expect(procedure.groupe_instructeurs.pluck(:label)).to match_array(["Auvergne-Rhône-Alpes", "Vendée", "défaut"]) }
|
|
||||||
it { expect(flash.notice).to be_present }
|
|
||||||
it { expect(flash.notice).to eq("La liste des instructeurs a été importée avec succès") }
|
|
||||||
it { expect(GroupeInstructeurMailer).to have_received(:notify_added_instructeurs).twice }
|
|
||||||
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') }
|
|
||||||
|
|
||||||
before do
|
|
||||||
allow_any_instance_of(ActionDispatch::Http::UploadedFile).to receive(:size).and_return(3.megabytes)
|
|
||||||
subject
|
|
||||||
end
|
|
||||||
|
|
||||||
it { expect(flash.alert).to be_present }
|
|
||||||
it { expect(flash.alert).to eq("Importation impossible : le poids du fichier est supérieur à 1 Mo") }
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when the file content type is not accepted' do
|
|
||||||
let(:csv_file) { fixture_file_upload('spec/fixtures/files/french-flag.gif', 'image/gif') }
|
|
||||||
|
|
||||||
before { subject }
|
|
||||||
|
|
||||||
it { expect(flash.alert).to be_present }
|
|
||||||
it { expect(flash.alert).to eq("Importation impossible : veuillez importer un fichier CSV") }
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when the headers are wrong' do
|
|
||||||
let(:csv_file) { fixture_file_upload('spec/fixtures/files/invalid-group-file.csv', 'text/csv') }
|
|
||||||
|
|
||||||
before { subject }
|
|
||||||
|
|
||||||
it { expect(flash.alert).to be_present }
|
|
||||||
it { expect(flash.alert).to eq("Importation impossible, veuillez importer un csv <a href=\"/csv/#{I18n.locale}/import-groupe-test.csv\">suivant ce modèle</a>") }
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when procedure is closed' do
|
|
||||||
let(:procedure) { create(:procedure, :closed, administrateurs: [admin]) }
|
|
||||||
let(:csv_file) { fixture_file_upload('spec/fixtures/files/groupe-instructeur.csv', 'text/csv') }
|
|
||||||
|
|
||||||
before { subject }
|
|
||||||
|
|
||||||
it { expect(procedure.groupe_instructeurs.first.label).to eq("Afrique") }
|
|
||||||
it { expect(flash.alert).to eq("Import terminé. Cependant les emails suivants ne sont pas pris en compte: kara") }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe '#add_instructeurs_via_csv_file' do
|
|
||||||
let(:procedure_non_routee) { create(:procedure, :published, :for_individual, administrateurs: [admin]) }
|
|
||||||
|
|
||||||
subject do
|
subject do
|
||||||
post :import, params: { procedure_id: procedure_non_routee.id, instructeurs_csv_file: csv_file }
|
post :import, params: { procedure_id: procedure.id, csv_file: csv_file }
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when the csv file is less than 1 mo and content type text/csv' do
|
context 'routed procedures' do
|
||||||
let(:csv_file) { fixture_file_upload('spec/fixtures/files/instructeurs-file.csv', 'text/csv') }
|
context 'when the csv file is less than 1 mo and content type text/csv' do
|
||||||
|
let(:csv_file) { fixture_file_upload('spec/fixtures/files/groupe-instructeur.csv', 'text/csv') }
|
||||||
|
|
||||||
before do
|
before { subject }
|
||||||
allow(GroupeInstructeurMailer).to receive(:notify_added_instructeurs)
|
|
||||||
.and_return(double(deliver_later: true))
|
it { expect(response.status).to eq(302) }
|
||||||
subject
|
it { expect(procedure.groupe_instructeurs.first.label).to eq("Afrique") }
|
||||||
|
it { expect(flash.alert).to be_present }
|
||||||
|
it { expect(flash.alert).to eq("Import terminé. Cependant les emails suivants ne sont pas pris en compte: kara") }
|
||||||
end
|
end
|
||||||
|
|
||||||
it { expect(response.status).to eq(302) }
|
context 'when the csv file has only one column' do
|
||||||
it { expect(procedure_non_routee.instructeurs.pluck(:email)).to match_array(["kara@beta-gouv.fr", "philippe@mail.com", "lisa@gouv.fr"]) }
|
let(:csv_file) { fixture_file_upload('spec/fixtures/files/valid-instructeurs-file.csv', 'text/csv') }
|
||||||
it { expect(flash.alert).to be_present }
|
|
||||||
it { expect(flash.alert).to eq("Import terminé. Cependant les emails suivants ne sont pas pris en compte: eric") }
|
before { subject }
|
||||||
it "calls GroupeInstructeurMailer" do
|
|
||||||
expect(GroupeInstructeurMailer).to have_received(:notify_added_instructeurs).with(
|
it { expect { subject }.not_to raise_error }
|
||||||
procedure_non_routee.defaut_groupe_instructeur,
|
it { expect(response.status).to eq(302) }
|
||||||
any_args,
|
it { expect(flash.alert).to be_present }
|
||||||
admin.email
|
it { expect(flash.alert).to eq("Importation impossible, veuillez importer un csv suivant <a href=\"/csv/import-instructeurs-test.csv\">ce modèle</a> pour une procédure classique ou <a href=\"/csv/fr/import-groupe-test.csv\">celui-ci</a> pour une procédure routée") }
|
||||||
)
|
end
|
||||||
|
|
||||||
|
context 'when the file content type is application/vnd.ms-excel' do
|
||||||
|
let(:csv_file) { fixture_file_upload('spec/fixtures/files/groupe_avec_caracteres_speciaux.csv', "application/vnd.ms-excel") }
|
||||||
|
|
||||||
|
before { subject }
|
||||||
|
|
||||||
|
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 content of csv contains special characters' do
|
||||||
|
let(:csv_file) { fixture_file_upload('spec/fixtures/files/groupe_avec_caracteres_speciaux.csv', 'text/csv') }
|
||||||
|
|
||||||
|
before do
|
||||||
|
allow(GroupeInstructeurMailer).to receive(:notify_added_instructeurs)
|
||||||
|
.and_return(double(deliver_later: true))
|
||||||
|
subject
|
||||||
|
end
|
||||||
|
|
||||||
|
it { expect(procedure.groupe_instructeurs.pluck(:label)).to match_array(["Auvergne-Rhône-Alpes", "Vendée", "défaut", "groupe instructeur 2"]) }
|
||||||
|
it { expect(flash.notice).to be_present }
|
||||||
|
it { expect(flash.notice).to eq("La liste des instructeurs a été importée avec succès") }
|
||||||
|
it { expect(GroupeInstructeurMailer).to have_received(:notify_added_instructeurs).twice }
|
||||||
|
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') }
|
||||||
|
|
||||||
|
before do
|
||||||
|
allow_any_instance_of(ActionDispatch::Http::UploadedFile).to receive(:size).and_return(3.megabytes)
|
||||||
|
subject
|
||||||
|
end
|
||||||
|
|
||||||
|
it { expect(flash.alert).to be_present }
|
||||||
|
it { expect(flash.alert).to eq("Importation impossible : le poids du fichier est supérieur à 1 Mo") }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when the file content type is not accepted' do
|
||||||
|
let(:csv_file) { fixture_file_upload('spec/fixtures/files/french-flag.gif', 'image/gif') }
|
||||||
|
|
||||||
|
before { subject }
|
||||||
|
|
||||||
|
it { expect(flash.alert).to be_present }
|
||||||
|
it { expect(flash.alert).to eq("Importation impossible : veuillez importer un fichier CSV") }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when the headers are wrong' do
|
||||||
|
let(:csv_file) { fixture_file_upload('spec/fixtures/files/invalid-group-file.csv', 'text/csv') }
|
||||||
|
|
||||||
|
before { subject }
|
||||||
|
|
||||||
|
it { expect(flash.alert).to be_present }
|
||||||
|
it { expect(flash.alert).to eq("Importation impossible, veuillez importer un csv suivant <a href=\"/csv/import-instructeurs-test.csv\">ce modèle</a> pour une procédure classique ou <a href=\"/csv/fr/import-groupe-test.csv\">celui-ci</a> pour une procédure routée") }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when procedure is closed' do
|
||||||
|
let(:procedure) { create(:procedure, :closed, administrateurs: [admin]) }
|
||||||
|
let(:csv_file) { fixture_file_upload('spec/fixtures/files/groupe-instructeur.csv', 'text/csv') }
|
||||||
|
|
||||||
|
before { subject }
|
||||||
|
|
||||||
|
it { expect(procedure.groupe_instructeurs.first.label).to eq("Afrique") }
|
||||||
|
it { expect(flash.alert).to eq("Import terminé. Cependant les emails suivants ne sont pas pris en compte: kara") }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when the csv file has more than one column' do
|
context 'unrouted procedures' do
|
||||||
let(:csv_file) { fixture_file_upload('spec/fixtures/files/groupe-instructeur.csv', 'text/csv') }
|
let(:procedure_non_routee) { create(:procedure, :published, :for_individual, administrateurs: [admin]) }
|
||||||
|
|
||||||
before { subject }
|
subject do
|
||||||
|
post :import, params: { procedure_id: procedure_non_routee.id, csv_file: csv_file }
|
||||||
it { expect(response.status).to eq(302) }
|
|
||||||
it { expect(flash.alert).to be_present }
|
|
||||||
it { expect(flash.alert).to eq("Importation impossible, veuillez importer un csv <a href=\"/csv/import-instructeurs-test.csv\">suivant ce modèle</a>") }
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when the file content type is application/vnd.ms-excel' do
|
|
||||||
let(:csv_file) { fixture_file_upload('spec/fixtures/files/valid-instructeurs-file.csv', "application/vnd.ms-excel") }
|
|
||||||
|
|
||||||
before { subject }
|
|
||||||
it { expect(procedure_non_routee.instructeurs.pluck(:email)).to match_array(["kara@beta-gouv.fr", "philippe@mail.com", "lisa@gouv.fr"]) }
|
|
||||||
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') }
|
|
||||||
|
|
||||||
before do
|
|
||||||
allow_any_instance_of(ActionDispatch::Http::UploadedFile).to receive(:size).and_return(3.megabytes)
|
|
||||||
subject
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it { expect(flash.alert).to be_present }
|
context 'when the csv file is less than 1 mo and content type text/csv' do
|
||||||
it { expect(flash.alert).to eq("Importation impossible : le poids du fichier est supérieur à 1 Mo") }
|
let(:csv_file) { fixture_file_upload('spec/fixtures/files/instructeurs-file.csv', 'text/csv') }
|
||||||
end
|
|
||||||
|
|
||||||
context 'when the file content type is not accepted' do
|
before do
|
||||||
let(:csv_file) { fixture_file_upload('spec/fixtures/files/french-flag.gif', 'image/gif') }
|
allow(GroupeInstructeurMailer).to receive(:notify_added_instructeurs)
|
||||||
|
.and_return(double(deliver_later: true))
|
||||||
|
subject
|
||||||
|
end
|
||||||
|
|
||||||
before { subject }
|
it { expect(response.status).to eq(302) }
|
||||||
|
it { expect(procedure_non_routee.instructeurs.pluck(:email)).to match_array(["kara@beta-gouv.fr", "philippe@mail.com", "lisa@gouv.fr"]) }
|
||||||
|
it { expect(flash.alert).to be_present }
|
||||||
|
it { expect(flash.alert).to eq("Import terminé. Cependant les emails suivants ne sont pas pris en compte: eric") }
|
||||||
|
it "calls GroupeInstructeurMailer" do
|
||||||
|
expect(GroupeInstructeurMailer).to have_received(:notify_added_instructeurs).with(
|
||||||
|
procedure_non_routee.defaut_groupe_instructeur,
|
||||||
|
any_args,
|
||||||
|
admin.email
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
it { expect(flash.alert).to be_present }
|
context 'when the csv file has more than one column' do
|
||||||
it { expect(flash.alert).to eq("Importation impossible : veuillez importer un fichier CSV") }
|
let(:csv_file) { fixture_file_upload('spec/fixtures/files/groupe-instructeur.csv', 'text/csv') }
|
||||||
|
|
||||||
|
before { subject }
|
||||||
|
|
||||||
|
it { expect(response.status).to eq(302) }
|
||||||
|
it { expect(flash.alert).to be_present }
|
||||||
|
it { expect(flash.alert).to eq("Import terminé. Cependant les emails suivants ne sont pas pris en compte: kara") }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when the file content type is application/vnd.ms-excel' do
|
||||||
|
let(:csv_file) { fixture_file_upload('spec/fixtures/files/valid-instructeurs-file.csv', "application/vnd.ms-excel") }
|
||||||
|
|
||||||
|
before { subject }
|
||||||
|
it { expect(procedure_non_routee.instructeurs.pluck(:email)).to match_array(["kara@beta-gouv.fr", "philippe@mail.com", "lisa@gouv.fr"]) }
|
||||||
|
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') }
|
||||||
|
|
||||||
|
before do
|
||||||
|
allow_any_instance_of(ActionDispatch::Http::UploadedFile).to receive(:size).and_return(3.megabytes)
|
||||||
|
subject
|
||||||
|
end
|
||||||
|
|
||||||
|
it { expect(flash.alert).to be_present }
|
||||||
|
it { expect(flash.alert).to eq("Importation impossible : le poids du fichier est supérieur à 1 Mo") }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when the file content type is not accepted' do
|
||||||
|
let(:csv_file) { fixture_file_upload('spec/fixtures/files/french-flag.gif', 'image/gif') }
|
||||||
|
|
||||||
|
before { subject }
|
||||||
|
|
||||||
|
it { expect(flash.alert).to be_present }
|
||||||
|
it { expect(flash.alert).to eq("Importation impossible : veuillez importer un fichier CSV") }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue