From 2041623ded331cfe437f43e18b4ec6398a918ce9 Mon Sep 17 00:00:00 2001 From: Colin Darie Date: Mon, 3 Jun 2024 11:53:03 +0200 Subject: [PATCH] test: merge similar examples --- .../exports_controller_spec.rb | 5 +- .../groupe_instructeurs_controller_spec.rb | 267 +++++++++++------- .../procedures_controller_spec.rb | 140 ++++----- .../groupe_instructeurs_controller_spec.rb | 68 +++-- spec/models/administrateur_spec.rb | 12 +- 5 files changed, 293 insertions(+), 199 deletions(-) diff --git a/spec/controllers/administrateurs/exports_controller_spec.rb b/spec/controllers/administrateurs/exports_controller_spec.rb index 43751a0eb..39ee2815a 100644 --- a/spec/controllers/administrateurs/exports_controller_spec.rb +++ b/spec/controllers/administrateurs/exports_controller_spec.rb @@ -19,11 +19,10 @@ describe Administrateurs::ExportsController, type: :controller do context 'when the export is does not exist' do it 'displays an notice' do - is_expected.to redirect_to(admin_procedure_archives_url(procedure)) + expect { subject }.to change(Export, :count).by(1) + expect(subject).to redirect_to(admin_procedure_archives_url(procedure)) expect(flash.notice).to be_present end - - it { expect { subject }.to change(Export, :count).by(1) } end context 'when the export is not ready' do diff --git a/spec/controllers/administrateurs/groupe_instructeurs_controller_spec.rb b/spec/controllers/administrateurs/groupe_instructeurs_controller_spec.rb index d020c6b3f..2d3cb0174 100644 --- a/spec/controllers/administrateurs/groupe_instructeurs_controller_spec.rb +++ b/spec/controllers/administrateurs/groupe_instructeurs_controller_spec.rb @@ -52,9 +52,8 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do let!(:instructeur_not_assigned_2) { create :instructeur, email: 'instructeur_4@ministere-b.gouv.fr', administrateurs: [admin] } subject! { get :show, params: { procedure_id: procedure.id, id: gi_1_1.id } } - it { expect(response.status).to eq(200) } - it 'sets the assigned and not assigned instructeurs' do + expect(response.status).to eq(200) expect(assigns(:instructeurs)).to match_array([instructeur_assigned_1, instructeur_assigned_2]) expect(assigns(:available_instructeur_emails)).to match_array(['instructeur_3@ministere-a.gouv.fr', 'instructeur_4@ministere-b.gouv.fr']) end @@ -104,17 +103,21 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do context 'with a valid name' do let(:label) { "nouveau_groupe" } - it { expect(flash.notice).to be_present } - it { expect(response).to redirect_to(admin_procedure_groupe_instructeur_path(procedure, procedure.groupe_instructeurs.last)) } - it { expect(procedure.groupe_instructeurs.count).to eq(3) } + it do + expect(flash.notice).to be_present + expect(response).to redirect_to(admin_procedure_groupe_instructeur_path(procedure, procedure.groupe_instructeurs.last)) + expect(procedure.groupe_instructeurs.count).to eq(3) + end end context 'with an invalid group name' do let(:label) { gi_1_1.label } - it { expect(response).to render_template(:index) } - it { expect(procedure.groupe_instructeurs.count).to eq(2) } - it { expect(flash.alert).to be_present } + it do + expect(response).to render_template(:index) + expect(procedure.groupe_instructeurs.count).to eq(2) + expect(flash.alert).to be_present + end end end @@ -132,28 +135,35 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do delete_group gi_1_1 end - it { expect(flash.alert).to be_present } - it { expect(flash.alert).to eq "Suppression impossible : le groupe « défaut » est le groupe par défaut." } - it { expect(response).to redirect_to(admin_procedure_groupe_instructeurs_path(procedure)) } - it { expect(procedure.groupe_instructeurs.count).to eq(2) } + it 'verifies flash alerts and redirections' do + expect(flash.alert).to be_present + expect(flash.alert).to eq "Suppression impossible : le groupe « défaut » est le groupe par défaut." + expect(response).to redirect_to(admin_procedure_groupe_instructeurs_path(procedure)) + expect(procedure.groupe_instructeurs.count).to eq(2) + end end context 'with many groups' do context 'of a group that can be deleted' do before { delete_group gi_1_2 } - it { expect(flash.notice).to eq "le groupe « deuxième groupe » a été supprimé et le routage a été désactivé." } - it { expect(procedure.groupe_instructeurs.count).to eq(1) } - it { expect(procedure.reload.routing_enabled?).to eq(false) } - it { expect(response).to redirect_to(admin_procedure_groupe_instructeurs_path(procedure)) } + + it 'deletes the group and updates routing' do + expect(flash.notice).to eq "le groupe « deuxième groupe » a été supprimé et le routage a été désactivé." + expect(procedure.groupe_instructeurs.count).to eq(1) + expect(procedure.reload.routing_enabled?).to eq(false) + expect(response).to redirect_to(admin_procedure_groupe_instructeurs_path(procedure)) + end end context 'of a group with dossiers, that cannot be deleted' do let!(:dossier12) { create(:dossier, procedure: procedure, state: Dossier.states.fetch(:en_construction), groupe_instructeur: gi_1_2) } before { delete_group gi_1_2 } - it { expect(flash.alert).to be_present } - it { expect(procedure.groupe_instructeurs.count).to eq(2) } - it { expect(response).to redirect_to(admin_procedure_groupe_instructeurs_path(procedure)) } + it 'attempts to delete a group with active dossiers and fails' do + expect(flash.alert).to be_present + expect(procedure.groupe_instructeurs.count).to eq(2) + expect(response).to redirect_to(admin_procedure_groupe_instructeurs_path(procedure)) + end end end end @@ -173,10 +183,12 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do :target_group => group) end - it { expect(response).to have_http_status(:ok) } - it { expect(response.body).to include(reaffecter_url(procedure.defaut_groupe_instructeur)) } - it { expect(response.body).not_to include(reaffecter_url(gi_1_2)) } - it { expect(response.body).to include(reaffecter_url(gi_1_3)) } + it 'checks response and body content for specific conditions' do + expect(response).to have_http_status(:ok) + expect(response.body).to include(reaffecter_url(procedure.defaut_groupe_instructeur)) + expect(response.body).not_to include(reaffecter_url(gi_1_2)) + expect(response.body).to include(reaffecter_url(gi_1_3)) + end end describe '#reaffecter' do @@ -328,18 +340,20 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do subject { post :add_instructeur, params: { emails: emails, procedure_id: procedure_non_routee.id, id: procedure_non_routee.defaut_groupe_instructeur.id } } context 'when all emails are valid' do let(:emails) { ['test@b.gouv.fr', 'test2@b.gouv.fr'].to_json } - it { expect(response.status).to eq(200) } - it { expect(subject.request.flash[:alert]).to be_nil } - it { expect(subject.request.flash[:notice]).to be_present } - it { expect(subject).to redirect_to admin_procedure_groupe_instructeurs_path(procedure_non_routee) } + it do + expect(subject).to redirect_to admin_procedure_groupe_instructeurs_path(procedure_non_routee) + expect(subject.request.flash[:alert]).to be_nil + expect(subject.request.flash[:notice]).to be_present + end end context 'when there is at least one bad email' do let(:emails) { ['badmail', 'instructeur2@gmail.com'].to_json } - it { expect(response.status).to eq(200) } - it { expect(subject.request.flash[:alert]).to be_present } - it { expect(subject.request.flash[:notice]).to be_present } - it { expect(subject).to redirect_to admin_procedure_groupe_instructeurs_path(procedure_non_routee) } + it do + expect(subject).to redirect_to admin_procedure_groupe_instructeurs_path(procedure_non_routee) + expect(subject.request.flash[:alert]).to be_present + expect(subject.request.flash[:notice]).to be_present + end end context 'when the admin wants to assign an instructor who is already assigned on this procedure' do @@ -375,11 +389,11 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do .and_return(double(deliver_later: true)) do_request end - it { expect(gi_1_2.instructeurs.pluck(:email)).to include(*new_instructeur_emails) } - it { expect(flash.notice).to be_present } - it { expect(response).to redirect_to(admin_procedure_groupe_instructeur_path(procedure, gi_1_2)) } - it { expect(procedure.routing_enabled?).to be_truthy } - it "calls GroupeInstructeurMailer with the right params" do + it 'validates changes and responses' do + expect(gi_1_2.instructeurs.pluck(:email)).to include(*new_instructeur_emails) + expect(flash.notice).to be_present + expect(response).to redirect_to(admin_procedure_groupe_instructeur_path(procedure, gi_1_2)) + expect(procedure.routing_enabled?).to be_truthy expect(GroupeInstructeurMailer).to have_received(:notify_added_instructeurs).with( gi_1_2, gi_1_2.instructeurs.last(2), @@ -397,8 +411,10 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do context 'of badly formed email' do let(:new_instructeur_emails) { ['badly_formed_email'] } before { do_request } - it { expect(flash.alert).to be_present } - it { expect(response).to redirect_to(admin_procedure_groupe_instructeur_path(procedure, gi_1_2)) } + it do + expect(flash.alert).to be_present + expect(response).to redirect_to(admin_procedure_groupe_instructeur_path(procedure, gi_1_2)) + end end context 'of an empty string' do @@ -442,10 +458,10 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do remove_instructeur(admin.instructeur) end - it { expect(gi_1_1.instructeurs).to include(instructeur) } - it { expect(gi_1_1.reload.instructeurs.count).to eq(1) } - it { expect(response).to redirect_to(admin_procedure_groupe_instructeur_path(procedure, gi_1_1)) } - it "calls GroupeInstructeurMailer with the right groupe and instructeur" do + it 'verifies instructeurs and sends notifications' do + expect(gi_1_1.instructeurs).to include(instructeur) + expect(gi_1_1.reload.instructeurs.count).to eq(1) + expect(response).to redirect_to(admin_procedure_groupe_instructeur_path(procedure, gi_1_1)) expect(GroupeInstructeurMailer).to have_received(:notify_removed_instructeur).with( gi_1_1, admin.instructeur, @@ -460,10 +476,12 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do remove_instructeur(instructeur) end - it { expect(gi_1_1.instructeurs).to include(instructeur) } - it { expect(gi_1_1.instructeurs.count).to eq(1) } - it { expect(flash.alert).to eq('Suppression impossible : il doit y avoir au moins un instructeur dans le groupe') } - it { expect(response).to redirect_to(admin_procedure_groupe_instructeur_path(procedure, gi_1_1)) } + it 'validates remaining instructeur and checks alert message' do + expect(gi_1_1.instructeurs).to include(instructeur) + expect(gi_1_1.instructeurs.count).to eq(1) + expect(flash.alert).to eq('Suppression impossible : il doit y avoir au moins un instructeur dans le groupe') + expect(response).to redirect_to(admin_procedure_groupe_instructeur_path(procedure, gi_1_1)) + end end end @@ -478,19 +496,37 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do end context 'when the instructor is assigned to the procedure' do - subject { delete :remove_instructeur, params: { instructeur: { id: instructeur_assigned_1.id }, procedure_id: procedure_non_routee.id, id: procedure_non_routee.defaut_groupe_instructeur.id } } - it { expect(subject.request.flash[:notice]).to be_present } - it { expect(subject.request.flash[:alert]).to be_nil } - it { expect(response.status).to eq(302) } - it { expect(subject).to redirect_to admin_procedure_groupe_instructeurs_path(procedure_non_routee) } + subject do + delete :remove_instructeur, params: { + instructeur: { id: instructeur_assigned_1.id }, + procedure_id: procedure_non_routee.id, + id: procedure_non_routee.defaut_groupe_instructeur.id + } + end + + it 'processes the removal of an assigned instructeur and checks response' do + expect(subject.request.flash[:notice]).to be_present + expect(subject.request.flash[:alert]).to be_nil + expect(response.status).to eq(302) + expect(subject).to redirect_to admin_procedure_groupe_instructeurs_path(procedure_non_routee) + end end context 'when the instructor is not assigned to the procedure' do - subject { delete :remove_instructeur, params: { instructeur: { id: instructeur_assigned_3.id }, procedure_id: procedure_non_routee.id, id: procedure_non_routee.defaut_groupe_instructeur.id } } - it { expect(subject.request.flash[:alert]).to be_present } - it { expect(subject.request.flash[:notice]).to be_nil } - it { expect(response.status).to eq(302) } - it { expect(subject).to redirect_to admin_procedure_groupe_instructeurs_path(procedure_non_routee) } + subject do + delete :remove_instructeur, params: { + instructeur: { id: instructeur_assigned_3.id }, + procedure_id: procedure_non_routee.id, + id: procedure_non_routee.defaut_groupe_instructeur.id + } + end + + it 'attempts to remove an unassigned instructeur and validates alerts' do + expect(subject.request.flash[:alert]).to be_present + expect(subject.request.flash[:notice]).to be_nil + expect(response.status).to eq(302) + expect(subject).to redirect_to admin_procedure_groupe_instructeurs_path(procedure_non_routee) + end end end @@ -505,10 +541,12 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do 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") } + it 'checks multiple response aspects after CSV upload' do + expect(response.status).to eq(302) + expect(procedure.groupe_instructeurs.first.label).to eq("Afrique") + expect(flash.alert).to be_present + expect(flash.alert).to eq("Import terminé. Cependant les emails suivants ne sont pas pris en compte: kara") + end end context 'when the csv file has only one column' do @@ -516,10 +554,12 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do 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 suivant ce modèle pour une procédure sans routage ou celui-ci pour une procédure routée") } + it 'handles one column CSV file gracefully' do + expect { subject }.not_to raise_error + expect(response.status).to eq(302) + expect(flash.alert).to be_present + expect(flash.alert).to eq("Importation impossible, veuillez importer un csv suivant ce modèle pour une procédure sans routage ou celui-ci pour une procédure routée") + end end context 'when the file content type is application/vnd.ms-excel' do @@ -527,8 +567,10 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do 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") } + it 'imports excel file with success notice' do + expect(flash.notice).to be_present + expect(flash.notice).to eq("La liste des instructeurs a été importée avec succès") + end end context 'when the content of csv contains special characters' do @@ -540,10 +582,12 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do subject end - it { expect(procedure.groupe_instructeurs.pluck(:label)).to match_array(["Auvergne-Rhône-Alpes", "Vendée", "défaut", "deuxième groupe"]) } - 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 } + it 'processes CSV with special characters and sends notifications' 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 + end end context 'when the csv file length is more than 1 mo' do @@ -554,8 +598,10 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do 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") } + it 'verifies the file size limitation' do + expect(flash.alert).to be_present + expect(flash.alert).to eq("Importation impossible : le poids du fichier est supérieur à 1 Mo") + end end context 'when the file content type is not accepted' do @@ -563,8 +609,10 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do before { subject } - it { expect(flash.alert).to be_present } - it { expect(flash.alert).to eq("Importation impossible : veuillez importer un fichier CSV") } + it 'checks file format acceptance' do + expect(flash.alert).to be_present + expect(flash.alert).to eq("Importation impossible : veuillez importer un fichier CSV") + end end context 'when the headers are wrong' do @@ -572,8 +620,10 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do before { subject } - it { expect(flash.alert).to be_present } - it { expect(flash.alert).to eq("Importation impossible, veuillez importer un csv suivant ce modèle pour une procédure sans routage ou celui-ci pour une procédure routée") } + it 'validates the header format of CSV' do + expect(flash.alert).to be_present + expect(flash.alert).to eq("Importation impossible, veuillez importer un csv suivant ce modèle pour une procédure sans routage ou celui-ci pour une procédure routée") + end end context 'when procedure is closed' do @@ -582,8 +632,10 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do 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") } + it 'handles imports with closed procedures' do + expect(procedure.groupe_instructeurs.first.label).to eq("Afrique") + expect(flash.alert).to eq("Import terminé. Cependant les emails suivants ne sont pas pris en compte: kara") + end end context 'when emails are invalid' do @@ -596,8 +648,10 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do subject end - it { expect(flash.alert).to include("Import terminé. Cependant les emails suivants ne sont pas pris en compte:") } - it { expect(GroupeInstructeurMailer).not_to have_received(:notify_added_instructeurs) } + it 'manages CSV with invalid emails and checks for mailer action' do + expect(flash.alert).to include("Import terminé. Cependant les emails suivants ne sont pas pris en compte:") + expect(GroupeInstructeurMailer).not_to have_received(:notify_added_instructeurs) + end end end @@ -617,11 +671,11 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do subject end - 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 + it 'verifies response status, updates instructors, and sends alerts with email issues' do + expect(response.status).to eq(302) + 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, @@ -635,19 +689,24 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do 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") } - it { expect(procedure_non_routee.reload.routing_enabled?).to be_truthy } + it 'confirms multiple column CSV import, response, and routing changes' do + expect(response.status).to eq(302) + expect(flash.alert).to be_present + expect(flash.alert).to eq("Import terminé. Cependant les emails suivants ne sont pas pris en compte: kara") + expect(procedure_non_routee.reload.routing_enabled?).to be_truthy + end 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") } + + it 'handles excel file upload and verifies imported instructor emails' do + expect(procedure_non_routee.instructeurs.pluck(:email)).to match_array(["kara@beta-gouv.fr", "philippe@mail.com", "lisa@gouv.fr"]) + expect(flash.notice).to be_present + expect(flash.notice).to eq("La liste des instructeurs a été importée avec succès") + end end context 'when the csv file length is more than 1 mo' do @@ -658,8 +717,10 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do 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") } + it 'checks for file size limit and displays appropriate flash alert' do + expect(flash.alert).to be_present + expect(flash.alert).to eq("Importation impossible : le poids du fichier est supérieur à 1 Mo") + end end context 'when the file content type is not accepted' do @@ -667,8 +728,10 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do before { subject } - it { expect(flash.alert).to be_present } - it { expect(flash.alert).to eq("Importation impossible : veuillez importer un fichier CSV") } + it 'validates file format and displays a flash alert' do + expect(flash.alert).to be_present + expect(flash.alert).to eq("Importation impossible : veuillez importer un fichier CSV") + end end context 'when emails are invalid' do @@ -680,8 +743,10 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do subject end - it { expect(flash.alert).to include("Import terminé. Cependant les emails suivants ne sont pas pris en compte:") } - it { expect(GroupeInstructeurMailer).not_to have_received(:notify_added_instructeurs) } + it 'verifies email validity in CSV imports and checks for mailer not being called' do + expect(flash.alert).to include("Import terminé. Cependant les emails suivants ne sont pas pris en compte:") + expect(GroupeInstructeurMailer).not_to have_received(:notify_added_instructeurs) + end end end end @@ -848,7 +913,9 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do } } - it { expect(response).to redirect_to(admin_procedure_groupe_instructeur_path(procedure, gi_1_1)) } - it { expect(gi_1_1.signature).to be_attached } + it do + expect(response).to redirect_to(admin_procedure_groupe_instructeur_path(procedure, gi_1_1)) + expect(gi_1_1.signature).to be_attached + end end end diff --git a/spec/controllers/administrateurs/procedures_controller_spec.rb b/spec/controllers/administrateurs/procedures_controller_spec.rb index afeabd712..d5198d952 100644 --- a/spec/controllers/administrateurs/procedures_controller_spec.rb +++ b/spec/controllers/administrateurs/procedures_controller_spec.rb @@ -384,16 +384,15 @@ describe Administrateurs::ProceduresController, type: :controller do let!(:large_closed_procedure) { create(:procedure_with_dossiers, :closed, dossiers_count: 2) } let!(:small_closed_procedure) { create(:procedure_with_dossiers, :closed, dossiers_count: 1) } - it 'displays published and closed procedures' do + it 'displays expected procedures' do + # published and closed procedures' do expect(response_procedures).to include(large_published_procedure) expect(response_procedures).to include(large_closed_procedure) - end - it 'doesn’t display procedures without a significant number of dossiers' do + # doesn’t display procedures without a significant number of dossiers' expect(response_procedures).not_to include(small_closed_procedure) - end - it 'doesn’t display draft procedures' do + # doesn’t display draft procedures' expect(response_procedures).not_to include(large_draft_procedure) end end @@ -486,19 +485,19 @@ describe Administrateurs::ProceduresController, type: :controller do post :create, params: { procedure: procedure_params } end - describe 'procedure attributs in database' do - subject { Procedure.last } + subject { Procedure.last } - it { expect(subject.libelle).to eq(libelle) } - it { expect(subject.description).to eq(description) } - it { expect(subject.organisation).to eq(organisation) } - it { expect(subject.administrateurs).to eq([admin]) } - it { expect(subject.duree_conservation_dossiers_dans_ds).to eq(duree_conservation_dossiers_dans_ds) } - it { expect(subject.tags).to eq(["planete", "environnement"]) } + it "create attributes" do + expect(subject.libelle).to eq(libelle) + expect(subject.description).to eq(description) + expect(subject.organisation).to eq(organisation) + expect(subject.administrateurs).to eq([admin]) + expect(subject.duree_conservation_dossiers_dans_ds).to eq(duree_conservation_dossiers_dans_ds) + expect(subject.tags).to eq(["planete", "environnement"]) + + expect(response).to redirect_to(champs_admin_procedure_path(Procedure.last)) + expect(flash[:notice]).to be_present end - - it { is_expected.to redirect_to(champs_admin_procedure_path(Procedure.last)) } - it { expect(flash[:notice]).to be_present } end describe "procedure is saved with custom retention period" do @@ -510,10 +509,9 @@ describe Administrateurs::ProceduresController, type: :controller do subject { post :create, params: { procedure: procedure_params } } - it { expect { subject }.to change { Procedure.count }.by(1) } - it "must save retention period and max retention period" do - subject + expect { subject }.to change { Procedure.count }.by(1) + last_procedure = Procedure.last expect(last_procedure.duree_conservation_dossiers_dans_ds).to eq(duree_conservation_dossiers_dans_ds) expect(last_procedure.max_duree_conservation_dossiers_dans_ds).to eq(Expired::DEFAULT_DOSSIER_RENTENTION_IN_MONTH) @@ -589,15 +587,19 @@ describe Administrateurs::ProceduresController, type: :controller do describe 'procedure attributs in database' do subject { procedure } - it { expect(subject.libelle).to eq(libelle) } - it { expect(subject.description).to eq(description) } - it { expect(subject.organisation).to eq(organisation) } - it { expect(subject.duree_conservation_dossiers_dans_ds).to eq(duree_conservation_dossiers_dans_ds) } - it { expect(subject.procedure_expires_when_termine_enabled).to eq(true) } + it "update attributes" do + expect(subject.libelle).to eq(libelle) + expect(subject.description).to eq(description) + expect(subject.organisation).to eq(organisation) + expect(subject.duree_conservation_dossiers_dans_ds).to eq(duree_conservation_dossiers_dans_ds) + expect(subject.procedure_expires_when_termine_enabled).to eq(true) + end end - it { is_expected.to redirect_to(admin_procedure_path id: procedure.id) } - it { expect(flash[:notice]).to be_present } + it do + is_expected.to redirect_to(admin_procedure_path id: procedure.id) + expect(flash[:notice]).to be_present + end end context 'when many attributs are not valid' do @@ -629,11 +631,11 @@ describe Administrateurs::ProceduresController, type: :controller do subject { update_procedure } - describe 'only some properties can be updated' do - it { expect(subject.libelle).to eq procedure_params[:libelle] } - it { expect(subject.description).to eq procedure_params[:description] } - it { expect(subject.organisation).to eq procedure_params[:organisation] } - it { expect(subject.for_individual).not_to eq procedure_params[:for_individual] } + it 'only some properties can be updated' do + expect(subject.libelle).to eq procedure_params[:libelle] + expect(subject.description).to eq procedure_params[:description] + expect(subject.organisation).to eq procedure_params[:organisation] + expect(subject.for_individual).not_to eq procedure_params[:for_individual] end end end @@ -955,30 +957,26 @@ describe Administrateurs::ProceduresController, type: :controller do context 'when all attributes are present' do render_views - before { update_monavis } + subject { update_monavis } context 'when the embed code is valid' do - describe 'the monavis field is updated' do - subject { procedure } + it 'the monavis field is updated' do + subject - it { expect(subject.monavis_embed).to eq(monavis_embed) } + expect(procedure.monavis_embed).to eq(monavis_embed) + expect(flash[:notice]).to be_present + expect(response).to redirect_to(admin_procedure_path(procedure.id)) end - - it { expect(flash[:notice]).to be_present } - it { expect(response).to redirect_to(admin_procedure_path(procedure.id)) } end context 'when the embed code is not valid' do let(:monavis_embed) { 'invalid embed code' } - describe 'the monavis field is not updated' do - subject { procedure } - - it { expect(subject.monavis_embed).to eq(nil) } + it 'the monavis field is not updated' do + expect(subject.monavis_embed).to eq(nil) + expect(flash[:alert]).to be_present + expect(response.body).to include "MonAvis" end - - it { expect(flash[:alert]).to be_present } - it { expect(response.body).to include "MonAvis" } end end @@ -1016,26 +1014,32 @@ describe Administrateurs::ProceduresController, type: :controller do context 'when jeton is valid' do let(:token_is_valid) { true } - it { expect(flash.alert).to be_nil } - it { expect(flash.notice).to eq('Le jeton a bien été mis à jour') } - it { expect(procedure.reload.api_entreprise_token).to eq(token) } + it do + expect(flash.alert).to be_nil + expect(flash.notice).to eq('Le jeton a bien été mis à jour') + expect(procedure.reload.api_entreprise_token).to eq(token) + end end context 'when jeton is invalid' do let(:token_is_valid) { false } - it { expect(flash.alert).to eq("Mise à jour impossible : le jeton n’est pas valide") } - it { expect(flash.notice).to be_nil } - it { expect(procedure.reload.api_entreprise_token).not_to eq(token) } + it do + expect(flash.alert).to eq("Mise à jour impossible : le jeton n’est pas valide") + expect(flash.notice).to be_nil + expect(procedure.reload.api_entreprise_token).not_to eq(token) + end end context 'when jeton is not a jwt' do let(:token) { "invalid" } let(:token_is_valid) { true } # just to check jwt format by procedure model - it { expect(flash.alert).to eq("Mise à jour impossible : le jeton n’est pas valide") } - it { expect(flash.notice).to be_nil } - it { expect(procedure.reload.api_entreprise_token).not_to eq(token) } + it do + expect(flash.alert).to eq("Mise à jour impossible : le jeton n’est pas valide") + expect(flash.notice).to be_nil + expect(procedure.reload.api_entreprise_token).not_to eq(token) + end end end @@ -1221,10 +1225,12 @@ describe Administrateurs::ProceduresController, type: :controller do context 'when admin is unknow' do let(:email_admin) { 'plop' } - it { expect(subject.status).to eq 302 } - it { expect(response.body).to include(admin_procedure_transfert_path(procedure.id)) } - it { expect(flash[:alert]).to be_present } - it { expect(flash[:alert]).to eq("Envoi vers #{email_admin} impossible : cet administrateur n’existe pas") } + it do + expect(subject.status).to eq 302 + expect(response.body).to include(admin_procedure_transfert_path(procedure.id)) + expect(flash[:alert]).to be_present + expect(flash[:alert]).to eq("Envoi vers #{email_admin} impossible : cet administrateur n’existe pas") + end end context 'when admin is known' do @@ -1233,8 +1239,10 @@ describe Administrateurs::ProceduresController, type: :controller do context "and its email address is correct" do let(:email_admin) { 'new_admin@admin.com' } - it { expect(subject.status).to eq 302 } - it { expect { subject }.to change(new_admin.procedures, :count).by(1) } + it do + expect { subject }.to change(new_admin.procedures, :count).by(1) + expect(subject.status).to eq 302 + end it "should create a new service" do subject @@ -1245,8 +1253,10 @@ describe Administrateurs::ProceduresController, type: :controller do context 'when admin is know but its email was not downcased' do let(:email_admin) { "NEW_admin@adMIN.com" } - it { expect(subject.status).to eq 302 } - it { expect { subject }.to change(Procedure, :count).by(1) } + it do + expect { subject }.to change(Procedure, :count).by(1) + expect(subject.status).to eq 302 + end end describe "correctly assigns the new admin" do @@ -1308,8 +1318,10 @@ describe Administrateurs::ProceduresController, type: :controller do procedure.reload end - it { expect(procedure.discarded?).to be_falsy } - it { expect(procedure.dossiers.first.hidden_by_administration_at).to be_nil } + it do + expect(procedure.discarded?).to be_falsy + expect(procedure.dossiers.first.hidden_by_administration_at).to be_nil + end end end end diff --git a/spec/controllers/instructeurs/groupe_instructeurs_controller_spec.rb b/spec/controllers/instructeurs/groupe_instructeurs_controller_spec.rb index 702a966b1..bc5bf8e2b 100644 --- a/spec/controllers/instructeurs/groupe_instructeurs_controller_spec.rb +++ b/spec/controllers/instructeurs/groupe_instructeurs_controller_spec.rb @@ -35,11 +35,11 @@ describe Instructeurs::GroupeInstructeursController, type: :controller do let(:procedure) { create(:procedure, :published, instructeurs_self_management_enabled: true) } before { get :index, params: { procedure_id: procedure.id } } - context 'when a procedure has multiple groups' do - it { expect(response).to have_http_status(:ok) } - it { expect(response.body).to include(gi_1_2.label) } - it { expect(response.body).not_to include(gi_1_1.label) } - it { expect(response.body).not_to include(gi_2_2.label) } + it 'when a procedure has multiple groups' do + expect(response).to have_http_status(:ok) + expect(response.body).to include(gi_1_2.label) + expect(response.body).not_to include(gi_1_1.label) + expect(response.body).not_to include(gi_2_2.label) end end @@ -47,8 +47,10 @@ describe Instructeurs::GroupeInstructeursController, type: :controller do let(:procedure) { create(:procedure, :published, :new_administrateur, instructeurs_self_management_enabled: false) } before { get :index, params: { procedure_id: procedure.id } } - it { expect(response).to have_http_status(:redirect) } - it { expect(flash.alert).to eq("Vous n’avez pas le droit de gérer les instructeurs de cette démarche") } + it "works" do + expect(response).to have_http_status(:redirect) + expect(flash.alert).to eq("Vous n’avez pas le droit de gérer les instructeurs de cette démarche") + end end context 'i am an instructor, not on the procedure' do @@ -58,8 +60,10 @@ describe Instructeurs::GroupeInstructeursController, type: :controller do get :index, params: { procedure_id: procedure.id } end - it { expect(response).to have_http_status(:redirect) } - it { expect(flash.alert).to eq("Vous n’avez pas accès à cette démarche") } + it "works" do + expect(response).to have_http_status(:redirect) + expect(flash.alert).to eq("Vous n’avez pas accès à cette démarche") + end end end @@ -85,24 +89,30 @@ describe Instructeurs::GroupeInstructeursController, type: :controller do let(:new_instructeur_email) { 'new_instructeur@mail.com' } before { subject } - it { expect(gi_1_2.instructeurs.map(&:email)).to include(new_instructeur_email) } - it { expect(flash.notice).to be_present } - it { expect(response).to redirect_to(instructeur_groupe_path(procedure, gi_1_2)) } + it "works" do + expect(gi_1_2.instructeurs.map(&:email)).to include(new_instructeur_email) + expect(flash.notice).to be_present + expect(response).to redirect_to(instructeur_groupe_path(procedure, gi_1_2)) + end end context 'of an instructeur already in the group' do let(:new_instructeur_email) { instructeur.email } before { subject } - it { expect(flash.alert).to be_present } - it { expect(response).to redirect_to(instructeur_groupe_path(procedure, gi_1_2)) } + it "works" do + expect(flash.alert).to be_present + expect(response).to redirect_to(instructeur_groupe_path(procedure, gi_1_2)) + end end context 'invalid email' do let(:new_instructeur_email) { 'invalid' } - it { subject; expect(flash.alert).to include(new_instructeur_email) } - it { expect { subject }.not_to enqueue_email } + it "works" do + expect { subject }.not_to enqueue_email + expect(flash.alert).to include(new_instructeur_email) + end end end @@ -128,10 +138,12 @@ describe Instructeurs::GroupeInstructeursController, type: :controller do context 'when there are many instructeurs' do before { remove_instructeur(new_instructeur) } - it { expect(gi_1_1.instructeurs).to include(instructeur) } - it { expect(gi_1_1.reload.instructeurs.count).to eq(1) } - it { expect(new_instructeur.reload.follows.count).to eq(0) } - it { expect(response).to redirect_to(instructeur_groupe_path(procedure, gi_1_1)) } + it "works" do + expect(gi_1_1.instructeurs).to include(instructeur) + expect(gi_1_1.reload.instructeurs.count).to eq(1) + expect(new_instructeur.reload.follows.count).to eq(0) + expect(response).to redirect_to(instructeur_groupe_path(procedure, gi_1_1)) + end end context 'when there is only one instructeur' do @@ -140,10 +152,12 @@ describe Instructeurs::GroupeInstructeursController, type: :controller do remove_instructeur(instructeur) end - it { expect(gi_1_1.instructeurs).to include(instructeur) } - it { expect(gi_1_1.instructeurs.count).to eq(1) } - it { expect(flash.alert).to eq('Suppression impossible : il doit y avoir au moins un instructeur dans le groupe') } - it { expect(response).to redirect_to(instructeur_groupe_path(procedure, gi_1_1)) } + it "works" do + expect(gi_1_1.instructeurs).to include(instructeur) + expect(gi_1_1.instructeurs.count).to eq(1) + expect(flash.alert).to eq('Suppression impossible : il doit y avoir au moins un instructeur dans le groupe') + expect(response).to redirect_to(instructeur_groupe_path(procedure, gi_1_1)) + end end end @@ -161,7 +175,9 @@ describe Instructeurs::GroupeInstructeursController, type: :controller do } end - it { expect(response).to redirect_to(instructeur_groupe_path(procedure, gi_1_2)) } - it { expect(gi_1_2.reload.signature).to be_attached } + it "works" do + expect(response).to redirect_to(instructeur_groupe_path(procedure, gi_1_2)) + expect(gi_1_2.reload.signature).to be_attached + end end end diff --git a/spec/models/administrateur_spec.rb b/spec/models/administrateur_spec.rb index abbe1e6d6..84c33fb4a 100644 --- a/spec/models/administrateur_spec.rb +++ b/spec/models/administrateur_spec.rb @@ -1,12 +1,12 @@ describe Administrateur, type: :model do let(:administration) { create(:administration) } - describe 'associations' do - it { is_expected.to have_many(:commentaire_groupe_gestionnaires) } - it { is_expected.to have_many(:archives) } - it { is_expected.to have_many(:exports) } - it { is_expected.to have_and_belong_to_many(:instructeurs) } - it { is_expected.to belong_to(:groupe_gestionnaire).optional } + it 'define associations' do + is_expected.to have_many(:commentaire_groupe_gestionnaires) + is_expected.to have_many(:archives) + is_expected.to have_many(:exports) + is_expected.to have_and_belong_to_many(:instructeurs) + is_expected.to belong_to(:groupe_gestionnaire).optional end describe "#can_be_deleted?" do