From d361ce2e388dafc36fd7e16bde107033f637440f Mon Sep 17 00:00:00 2001 From: Eric Leroy-Terquem Date: Mon, 2 Sep 2024 17:45:46 +0200 Subject: [PATCH] fix(instructeurs import): send confirmation link if new instructeurs --- .../groupe_instructeurs_controller.rb | 24 +++++-- .../groupe_instructeurs_controller_spec.rb | 62 +++++++++++++++++-- spec/fixtures/files/two-instructeurs-file.csv | 3 + 3 files changed, 77 insertions(+), 12 deletions(-) create mode 100644 spec/fixtures/files/two-instructeurs-file.csv diff --git a/app/controllers/administrateurs/groupe_instructeurs_controller.rb b/app/controllers/administrateurs/groupe_instructeurs_controller.rb index f7bdc59e7..193641eba 100644 --- a/app/controllers/administrateurs/groupe_instructeurs_controller.rb +++ b/app/controllers/administrateurs/groupe_instructeurs_controller.rb @@ -348,9 +348,15 @@ module Administrateurs added_instructeurs_by_group.each do |groupe, added_instructeurs| if added_instructeurs.present? - GroupeInstructeurMailer - .notify_added_instructeurs(groupe, added_instructeurs, current_administrateur.email) - .deliver_later + known_instructeurs, new_instructeurs = added_instructeurs.partition { |instructeur| instructeur.user.email_verified_at } + + new_instructeurs.each { InstructeurMailer.confirm_and_notify_added_instructeur(_1, groupe, current_administrateur.email).deliver_later } + + if known_instructeurs.present? + GroupeInstructeurMailer + .notify_added_instructeurs(groupe, known_instructeurs, current_administrateur.email) + .deliver_later + end end flash_message_for_import(invalid_emails) end @@ -360,9 +366,15 @@ module Administrateurs added_instructeurs, invalid_emails = InstructeursImportService.import_instructeurs(procedure, instructors_emails) if added_instructeurs.present? - GroupeInstructeurMailer - .notify_added_instructeurs(groupe_instructeur, added_instructeurs, current_administrateur.email) - .deliver_later + known_instructeurs, new_instructeurs = added_instructeurs.partition { |instructeur| instructeur.user.email_verified_at } + + new_instructeurs.each { InstructeurMailer.confirm_and_notify_added_instructeur(_1, groupe_instructeur, current_administrateur.email).deliver_later } + + if known_instructeurs.present? + GroupeInstructeurMailer + .notify_added_instructeurs(groupe_instructeur, known_instructeurs, current_administrateur.email) + .deliver_later + end end flash_message_for_import(invalid_emails) else diff --git a/spec/controllers/administrateurs/groupe_instructeurs_controller_spec.rb b/spec/controllers/administrateurs/groupe_instructeurs_controller_spec.rb index 2ab7037b1..451e5da7f 100644 --- a/spec/controllers/administrateurs/groupe_instructeurs_controller_spec.rb +++ b/spec/controllers/administrateurs/groupe_instructeurs_controller_spec.rb @@ -601,6 +601,8 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do before do allow(GroupeInstructeurMailer).to receive(:notify_added_instructeurs) .and_return(double(deliver_later: true)) + allow(InstructeurMailer).to receive(:confirm_and_notify_added_instructeur) + .and_return(double(deliver_later: true)) subject end @@ -608,7 +610,8 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do expect(procedure.groupe_instructeurs.pluck(:label)).to match_array(["Auvergne-Rhône-Alpes", "Vendée", "défaut", "deuxième groupe"]) expect(flash.notice).to be_present expect(flash.notice).to eq("La liste des instructeurs a été importée avec succès") - expect(GroupeInstructeurMailer).to have_received(:notify_added_instructeurs).twice + expect(GroupeInstructeurMailer).not_to have_received(:notify_added_instructeurs) + expect(InstructeurMailer).to have_received(:confirm_and_notify_added_instructeur).exactly(4).times end end @@ -690,6 +693,8 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do before do allow(GroupeInstructeurMailer).to receive(:notify_added_instructeurs) .and_return(double(deliver_later: true)) + allow(InstructeurMailer).to receive(:confirm_and_notify_added_instructeur) + .and_return(double(deliver_later: true)) subject end @@ -698,11 +703,8 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do expect(procedure_non_routee.instructeurs.pluck(:email)).to match_array(["kara@beta-gouv.fr", "philippe@mail.com", "lisa@gouv.fr"]) expect(flash.alert).to be_present expect(flash.alert).to eq("Import terminé. Cependant les emails suivants ne sont pas pris en compte: eric") - expect(GroupeInstructeurMailer).to have_received(:notify_added_instructeurs).with( - procedure_non_routee.defaut_groupe_instructeur, - any_args, - admin.email - ) + expect(InstructeurMailer).to have_received(:confirm_and_notify_added_instructeur).exactly(3).times + expect(GroupeInstructeurMailer).not_to have_received(:notify_added_instructeurs) end end @@ -770,6 +772,54 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do expect(GroupeInstructeurMailer).not_to have_received(:notify_added_instructeurs) end end + + context 'when instructeurs accounts exist' do + let(:csv_file) { fixture_file_upload('spec/fixtures/files/two-instructeurs-file.csv', 'text/csv') } + let(:user_1) { create(:user, :with_email_verified, email: 'instructeur1@gouv.fr') } + let(:user_2) { create(:user, :with_email_verified, email: 'instructeur2@gouv.fr') } + let!(:instructeur_1) { create(:instructeur, user: user_1) } + let!(:instructeur_2) { create(:instructeur, user: user_2) } + + before do + allow(GroupeInstructeurMailer).to receive(:notify_added_instructeurs) + .and_return(double(deliver_later: true)) + allow(InstructeurMailer).to receive(:confirm_and_notify_added_instructeur) + .and_return(double(deliver_later: true)) + subject + end + + it 'sends notification without confirmation link' do + expect(procedure_non_routee.instructeurs.pluck(:email)).to match_array(["instructeur1@gouv.fr", "instructeur2@gouv.fr"]) + expect(flash.notice).to be_present + expect(flash.notice).to eq("La liste des instructeurs a été importée avec succès") + expect(GroupeInstructeurMailer).to have_received(:notify_added_instructeurs) + expect(InstructeurMailer).not_to have_received(:confirm_and_notify_added_instructeur) + end + end + + context 'when instructeurs accounts do not exist' do + let(:csv_file) { fixture_file_upload('spec/fixtures/files/two-instructeurs-file.csv', 'text/csv') } + let(:user_1) { create(:user, email: 'instructeur1@gouv.fr') } + let(:user_2) { create(:user, email: 'instructeur2@gouv.fr') } + let!(:instructeur_1) { create(:instructeur, user: user_1) } + let!(:instructeur_2) { create(:instructeur, user: user_2) } + + before do + allow(GroupeInstructeurMailer).to receive(:notify_added_instructeurs) + .and_return(double(deliver_later: true)) + allow(InstructeurMailer).to receive(:confirm_and_notify_added_instructeur) + .and_return(double(deliver_later: true)) + subject + end + + it 'sends notification without confirmation link' do + expect(procedure_non_routee.instructeurs.pluck(:email)).to match_array(["instructeur1@gouv.fr", "instructeur2@gouv.fr"]) + expect(flash.notice).to be_present + expect(flash.notice).to eq("La liste des instructeurs a été importée avec succès") + expect(GroupeInstructeurMailer).not_to have_received(:notify_added_instructeurs) + expect(InstructeurMailer).to have_received(:confirm_and_notify_added_instructeur).twice + end + end end end diff --git a/spec/fixtures/files/two-instructeurs-file.csv b/spec/fixtures/files/two-instructeurs-file.csv new file mode 100644 index 000000000..2c7e471c5 --- /dev/null +++ b/spec/fixtures/files/two-instructeurs-file.csv @@ -0,0 +1,3 @@ +Email +instructeur1@gouv.fr +instructeur2@gouv.fr