test: merge similar examples

This commit is contained in:
Colin Darie 2024-06-03 11:53:03 +02:00
parent 9e80962ea5
commit 2041623ded
No known key found for this signature in database
GPG key ID: 4FB865FDBCA4BCC4
5 changed files with 293 additions and 199 deletions

View file

@ -19,11 +19,10 @@ describe Administrateurs::ExportsController, type: :controller do
context 'when the export is does not exist' do context 'when the export is does not exist' do
it 'displays an notice' 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 expect(flash.notice).to be_present
end end
it { expect { subject }.to change(Export, :count).by(1) }
end end
context 'when the export is not ready' do context 'when the export is not ready' do

View file

@ -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] } 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 } } 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 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(: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']) expect(assigns(:available_instructeur_emails)).to match_array(['instructeur_3@ministere-a.gouv.fr', 'instructeur_4@ministere-b.gouv.fr'])
end end
@ -104,17 +103,21 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
context 'with a valid name' do context 'with a valid name' do
let(:label) { "nouveau_groupe" } let(:label) { "nouveau_groupe" }
it { expect(flash.notice).to be_present } it do
it { expect(response).to redirect_to(admin_procedure_groupe_instructeur_path(procedure, procedure.groupe_instructeurs.last)) } expect(flash.notice).to be_present
it { expect(procedure.groupe_instructeurs.count).to eq(3) } 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 end
context 'with an invalid group name' do context 'with an invalid group name' do
let(:label) { gi_1_1.label } let(:label) { gi_1_1.label }
it { expect(response).to render_template(:index) } it do
it { expect(procedure.groupe_instructeurs.count).to eq(2) } expect(response).to render_template(:index)
it { expect(flash.alert).to be_present } expect(procedure.groupe_instructeurs.count).to eq(2)
expect(flash.alert).to be_present
end
end end
end end
@ -132,28 +135,35 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
delete_group gi_1_1 delete_group gi_1_1
end end
it { expect(flash.alert).to be_present } it 'verifies flash alerts and redirections' do
it { expect(flash.alert).to eq "Suppression impossible : le groupe « défaut » est le groupe par défaut." } expect(flash.alert).to be_present
it { expect(response).to redirect_to(admin_procedure_groupe_instructeurs_path(procedure)) } expect(flash.alert).to eq "Suppression impossible : le groupe « défaut » est le groupe par défaut."
it { expect(procedure.groupe_instructeurs.count).to eq(2) } expect(response).to redirect_to(admin_procedure_groupe_instructeurs_path(procedure))
expect(procedure.groupe_instructeurs.count).to eq(2)
end
end end
context 'with many groups' do context 'with many groups' do
context 'of a group that can be deleted' do context 'of a group that can be deleted' do
before { delete_group gi_1_2 } 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 'deletes the group and updates routing' do
it { expect(procedure.reload.routing_enabled?).to eq(false) } expect(flash.notice).to eq "le groupe « deuxième groupe » a été supprimé et le routage a été désactivé."
it { expect(response).to redirect_to(admin_procedure_groupe_instructeurs_path(procedure)) } 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 end
context 'of a group with dossiers, that cannot be deleted' do 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) } let!(:dossier12) { create(:dossier, procedure: procedure, state: Dossier.states.fetch(:en_construction), groupe_instructeur: gi_1_2) }
before { delete_group gi_1_2 } before { delete_group gi_1_2 }
it { expect(flash.alert).to be_present } it 'attempts to delete a group with active dossiers and fails' do
it { expect(procedure.groupe_instructeurs.count).to eq(2) } expect(flash.alert).to be_present
it { expect(response).to redirect_to(admin_procedure_groupe_instructeurs_path(procedure)) } expect(procedure.groupe_instructeurs.count).to eq(2)
expect(response).to redirect_to(admin_procedure_groupe_instructeurs_path(procedure))
end
end end
end end
end end
@ -173,10 +183,12 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
:target_group => group) :target_group => group)
end end
it { expect(response).to have_http_status(:ok) } it 'checks response and body content for specific conditions' do
it { expect(response.body).to include(reaffecter_url(procedure.defaut_groupe_instructeur)) } expect(response).to have_http_status(:ok)
it { expect(response.body).not_to include(reaffecter_url(gi_1_2)) } expect(response.body).to include(reaffecter_url(procedure.defaut_groupe_instructeur))
it { expect(response.body).to include(reaffecter_url(gi_1_3)) } expect(response.body).not_to include(reaffecter_url(gi_1_2))
expect(response.body).to include(reaffecter_url(gi_1_3))
end
end end
describe '#reaffecter' do 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 } } 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 context 'when all emails are valid' do
let(:emails) { ['test@b.gouv.fr', 'test2@b.gouv.fr'].to_json } let(:emails) { ['test@b.gouv.fr', 'test2@b.gouv.fr'].to_json }
it { expect(response.status).to eq(200) } it do
it { expect(subject.request.flash[:alert]).to be_nil } expect(subject).to redirect_to admin_procedure_groupe_instructeurs_path(procedure_non_routee)
it { expect(subject.request.flash[:notice]).to be_present } expect(subject.request.flash[:alert]).to be_nil
it { expect(subject).to redirect_to admin_procedure_groupe_instructeurs_path(procedure_non_routee) } expect(subject.request.flash[:notice]).to be_present
end
end end
context 'when there is at least one bad email' do context 'when there is at least one bad email' do
let(:emails) { ['badmail', 'instructeur2@gmail.com'].to_json } let(:emails) { ['badmail', 'instructeur2@gmail.com'].to_json }
it { expect(response.status).to eq(200) } it do
it { expect(subject.request.flash[:alert]).to be_present } expect(subject).to redirect_to admin_procedure_groupe_instructeurs_path(procedure_non_routee)
it { expect(subject.request.flash[:notice]).to be_present } expect(subject.request.flash[:alert]).to be_present
it { expect(subject).to redirect_to admin_procedure_groupe_instructeurs_path(procedure_non_routee) } expect(subject.request.flash[:notice]).to be_present
end
end end
context 'when the admin wants to assign an instructor who is already assigned on this procedure' do 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)) .and_return(double(deliver_later: true))
do_request do_request
end end
it { expect(gi_1_2.instructeurs.pluck(:email)).to include(*new_instructeur_emails) } it 'validates changes and responses' do
it { expect(flash.notice).to be_present } expect(gi_1_2.instructeurs.pluck(:email)).to include(*new_instructeur_emails)
it { expect(response).to redirect_to(admin_procedure_groupe_instructeur_path(procedure, gi_1_2)) } expect(flash.notice).to be_present
it { expect(procedure.routing_enabled?).to be_truthy } expect(response).to redirect_to(admin_procedure_groupe_instructeur_path(procedure, gi_1_2))
it "calls GroupeInstructeurMailer with the right params" do expect(procedure.routing_enabled?).to be_truthy
expect(GroupeInstructeurMailer).to have_received(:notify_added_instructeurs).with( expect(GroupeInstructeurMailer).to have_received(:notify_added_instructeurs).with(
gi_1_2, gi_1_2,
gi_1_2.instructeurs.last(2), gi_1_2.instructeurs.last(2),
@ -397,8 +411,10 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
context 'of badly formed email' do context 'of badly formed email' do
let(:new_instructeur_emails) { ['badly_formed_email'] } let(:new_instructeur_emails) { ['badly_formed_email'] }
before { do_request } before { do_request }
it { expect(flash.alert).to be_present } it do
it { expect(response).to redirect_to(admin_procedure_groupe_instructeur_path(procedure, gi_1_2)) } expect(flash.alert).to be_present
expect(response).to redirect_to(admin_procedure_groupe_instructeur_path(procedure, gi_1_2))
end
end end
context 'of an empty string' do context 'of an empty string' do
@ -442,10 +458,10 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
remove_instructeur(admin.instructeur) remove_instructeur(admin.instructeur)
end end
it { expect(gi_1_1.instructeurs).to include(instructeur) } it 'verifies instructeurs and sends notifications' do
it { expect(gi_1_1.reload.instructeurs.count).to eq(1) } expect(gi_1_1.instructeurs).to include(instructeur)
it { expect(response).to redirect_to(admin_procedure_groupe_instructeur_path(procedure, gi_1_1)) } expect(gi_1_1.reload.instructeurs.count).to eq(1)
it "calls GroupeInstructeurMailer with the right groupe and instructeur" do expect(response).to redirect_to(admin_procedure_groupe_instructeur_path(procedure, gi_1_1))
expect(GroupeInstructeurMailer).to have_received(:notify_removed_instructeur).with( expect(GroupeInstructeurMailer).to have_received(:notify_removed_instructeur).with(
gi_1_1, gi_1_1,
admin.instructeur, admin.instructeur,
@ -460,10 +476,12 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
remove_instructeur(instructeur) remove_instructeur(instructeur)
end end
it { expect(gi_1_1.instructeurs).to include(instructeur) } it 'validates remaining instructeur and checks alert message' do
it { expect(gi_1_1.instructeurs.count).to eq(1) } expect(gi_1_1.instructeurs).to include(instructeur)
it { expect(flash.alert).to eq('Suppression impossible : il doit y avoir au moins un instructeur dans le groupe') } expect(gi_1_1.instructeurs.count).to eq(1)
it { expect(response).to redirect_to(admin_procedure_groupe_instructeur_path(procedure, gi_1_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
end end
@ -478,19 +496,37 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
end end
context 'when the instructor is assigned to the procedure' do 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 } } subject do
it { expect(subject.request.flash[:notice]).to be_present } delete :remove_instructeur, params: {
it { expect(subject.request.flash[:alert]).to be_nil } instructeur: { id: instructeur_assigned_1.id },
it { expect(response.status).to eq(302) } procedure_id: procedure_non_routee.id,
it { expect(subject).to redirect_to admin_procedure_groupe_instructeurs_path(procedure_non_routee) } 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 end
context 'when the instructor is not assigned to the procedure' do 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 } } subject do
it { expect(subject.request.flash[:alert]).to be_present } delete :remove_instructeur, params: {
it { expect(subject.request.flash[:notice]).to be_nil } instructeur: { id: instructeur_assigned_3.id },
it { expect(response.status).to eq(302) } procedure_id: procedure_non_routee.id,
it { expect(subject).to redirect_to admin_procedure_groupe_instructeurs_path(procedure_non_routee) } 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
end end
@ -505,10 +541,12 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
before { subject } before { subject }
it { expect(response.status).to eq(302) } it 'checks multiple response aspects after CSV upload' do
it { expect(procedure.groupe_instructeurs.first.label).to eq("Afrique") } expect(response.status).to eq(302)
it { expect(flash.alert).to be_present } 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") } 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 end
context 'when the csv file has only one column' do context 'when the csv file has only one column' do
@ -516,10 +554,12 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
before { subject } before { subject }
it { expect { subject }.not_to raise_error } it 'handles one column CSV file gracefully' do
it { expect(response.status).to eq(302) } expect { subject }.not_to raise_error
it { expect(flash.alert).to be_present } expect(response.status).to eq(302)
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 sans routage ou <a href=\"/csv/fr/import-groupe-test.csv\">celui-ci</a> pour une procédure routée") } expect(flash.alert).to be_present
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 sans routage ou <a href=\"/csv/fr/import-groupe-test.csv\">celui-ci</a> pour une procédure routée")
end
end end
context 'when the file content type is application/vnd.ms-excel' do context 'when the file content type is application/vnd.ms-excel' do
@ -527,8 +567,10 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
before { subject } before { subject }
it { expect(flash.notice).to be_present } it 'imports excel file with success notice' do
it { expect(flash.notice).to eq("La liste des instructeurs a été importée avec succès") } expect(flash.notice).to be_present
expect(flash.notice).to eq("La liste des instructeurs a été importée avec succès")
end
end end
context 'when the content of csv contains special characters' do context 'when the content of csv contains special characters' do
@ -540,10 +582,12 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
subject subject
end end
it { expect(procedure.groupe_instructeurs.pluck(:label)).to match_array(["Auvergne-Rhône-Alpes", "Vendée", "défaut", "deuxième groupe"]) } it 'processes CSV with special characters and sends notifications' do
it { expect(flash.notice).to be_present } 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 eq("La liste des instructeurs a été importée avec succès") } expect(flash.notice).to be_present
it { expect(GroupeInstructeurMailer).to have_received(:notify_added_instructeurs).twice } 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 end
context 'when the csv file length is more than 1 mo' do context 'when the csv file length is more than 1 mo' do
@ -554,8 +598,10 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
subject subject
end end
it { expect(flash.alert).to be_present } it 'verifies the file size limitation' do
it { expect(flash.alert).to eq("Importation impossible : le poids du fichier est supérieur à 1 Mo") } expect(flash.alert).to be_present
expect(flash.alert).to eq("Importation impossible : le poids du fichier est supérieur à 1 Mo")
end
end end
context 'when the file content type is not accepted' do context 'when the file content type is not accepted' do
@ -563,8 +609,10 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
before { subject } before { subject }
it { expect(flash.alert).to be_present } it 'checks file format acceptance' do
it { expect(flash.alert).to eq("Importation impossible : veuillez importer un fichier CSV") } expect(flash.alert).to be_present
expect(flash.alert).to eq("Importation impossible : veuillez importer un fichier CSV")
end
end end
context 'when the headers are wrong' do context 'when the headers are wrong' do
@ -572,8 +620,10 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
before { subject } before { subject }
it { expect(flash.alert).to be_present } it 'validates the header format of CSV' do
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 sans routage ou <a href=\"/csv/fr/import-groupe-test.csv\">celui-ci</a> pour une procédure routée") } expect(flash.alert).to be_present
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 sans routage ou <a href=\"/csv/fr/import-groupe-test.csv\">celui-ci</a> pour une procédure routée")
end
end end
context 'when procedure is closed' do context 'when procedure is closed' do
@ -582,8 +632,10 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
before { subject } before { subject }
it { expect(procedure.groupe_instructeurs.first.label).to eq("Afrique") } it 'handles imports with closed procedures' do
it { expect(flash.alert).to eq("Import terminé. Cependant les emails suivants ne sont pas pris en compte: kara") } 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 end
context 'when emails are invalid' do context 'when emails are invalid' do
@ -596,8 +648,10 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
subject subject
end end
it { expect(flash.alert).to include("Import terminé. Cependant les emails suivants ne sont pas pris en compte:") } it 'manages CSV with invalid emails and checks for mailer action' do
it { expect(GroupeInstructeurMailer).not_to have_received(:notify_added_instructeurs) } 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 end
@ -617,11 +671,11 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
subject subject
end end
it { expect(response.status).to eq(302) } it 'verifies response status, updates instructors, and sends alerts with email issues' do
it { expect(procedure_non_routee.instructeurs.pluck(:email)).to match_array(["kara@beta-gouv.fr", "philippe@mail.com", "lisa@gouv.fr"]) } expect(response.status).to eq(302)
it { expect(flash.alert).to be_present } 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 eq("Import terminé. Cependant les emails suivants ne sont pas pris en compte: eric") } expect(flash.alert).to be_present
it "calls GroupeInstructeurMailer" do 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( expect(GroupeInstructeurMailer).to have_received(:notify_added_instructeurs).with(
procedure_non_routee.defaut_groupe_instructeur, procedure_non_routee.defaut_groupe_instructeur,
any_args, any_args,
@ -635,19 +689,24 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
before { subject } before { subject }
it { expect(response.status).to eq(302) } it 'confirms multiple column CSV import, response, and routing changes' do
it { expect(flash.alert).to be_present } expect(response.status).to eq(302)
it { expect(flash.alert).to eq("Import terminé. Cependant les emails suivants ne sont pas pris en compte: kara") } expect(flash.alert).to be_present
it { expect(procedure_non_routee.reload.routing_enabled?).to be_truthy } 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 end
context 'when the file content type is application/vnd.ms-excel' do 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") } let(:csv_file) { fixture_file_upload('spec/fixtures/files/valid-instructeurs-file.csv', "application/vnd.ms-excel") }
before { subject } 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 'handles excel file upload and verifies imported instructor emails' do
it { expect(flash.notice).to eq("La liste des instructeurs a été importée avec succès") } 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 end
context 'when the csv file length is more than 1 mo' do context 'when the csv file length is more than 1 mo' do
@ -658,8 +717,10 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
subject subject
end end
it { expect(flash.alert).to be_present } it 'checks for file size limit and displays appropriate flash alert' do
it { expect(flash.alert).to eq("Importation impossible : le poids du fichier est supérieur à 1 Mo") } expect(flash.alert).to be_present
expect(flash.alert).to eq("Importation impossible : le poids du fichier est supérieur à 1 Mo")
end
end end
context 'when the file content type is not accepted' do context 'when the file content type is not accepted' do
@ -667,8 +728,10 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
before { subject } before { subject }
it { expect(flash.alert).to be_present } it 'validates file format and displays a flash alert' do
it { expect(flash.alert).to eq("Importation impossible : veuillez importer un fichier CSV") } expect(flash.alert).to be_present
expect(flash.alert).to eq("Importation impossible : veuillez importer un fichier CSV")
end
end end
context 'when emails are invalid' do context 'when emails are invalid' do
@ -680,8 +743,10 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
subject subject
end end
it { expect(flash.alert).to include("Import terminé. Cependant les emails suivants ne sont pas pris en compte:") } it 'verifies email validity in CSV imports and checks for mailer not being called' do
it { expect(GroupeInstructeurMailer).not_to have_received(:notify_added_instructeurs) } 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 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 do
it { expect(gi_1_1.signature).to be_attached } 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
end end

View file

@ -384,16 +384,15 @@ describe Administrateurs::ProceduresController, type: :controller do
let!(:large_closed_procedure) { create(:procedure_with_dossiers, :closed, dossiers_count: 2) } let!(:large_closed_procedure) { create(:procedure_with_dossiers, :closed, dossiers_count: 2) }
let!(:small_closed_procedure) { create(:procedure_with_dossiers, :closed, dossiers_count: 1) } 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_published_procedure)
expect(response_procedures).to include(large_closed_procedure) expect(response_procedures).to include(large_closed_procedure)
end
it 'doesnt display procedures without a significant number of dossiers' do # doesnt display procedures without a significant number of dossiers'
expect(response_procedures).not_to include(small_closed_procedure) expect(response_procedures).not_to include(small_closed_procedure)
end
it 'doesnt display draft procedures' do # doesnt display draft procedures'
expect(response_procedures).not_to include(large_draft_procedure) expect(response_procedures).not_to include(large_draft_procedure)
end end
end end
@ -486,19 +485,19 @@ describe Administrateurs::ProceduresController, type: :controller do
post :create, params: { procedure: procedure_params } post :create, params: { procedure: procedure_params }
end end
describe 'procedure attributs in database' do
subject { Procedure.last } subject { Procedure.last }
it { expect(subject.libelle).to eq(libelle) } it "create attributes" do
it { expect(subject.description).to eq(description) } expect(subject.libelle).to eq(libelle)
it { expect(subject.organisation).to eq(organisation) } expect(subject.description).to eq(description)
it { expect(subject.administrateurs).to eq([admin]) } expect(subject.organisation).to eq(organisation)
it { expect(subject.duree_conservation_dossiers_dans_ds).to eq(duree_conservation_dossiers_dans_ds) } expect(subject.administrateurs).to eq([admin])
it { expect(subject.tags).to eq(["planete", "environnement"]) } expect(subject.duree_conservation_dossiers_dans_ds).to eq(duree_conservation_dossiers_dans_ds)
end expect(subject.tags).to eq(["planete", "environnement"])
it { is_expected.to redirect_to(champs_admin_procedure_path(Procedure.last)) } expect(response).to redirect_to(champs_admin_procedure_path(Procedure.last))
it { expect(flash[:notice]).to be_present } expect(flash[:notice]).to be_present
end
end end
describe "procedure is saved with custom retention period" do 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 } } 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 it "must save retention period and max retention period" do
subject expect { subject }.to change { Procedure.count }.by(1)
last_procedure = Procedure.last last_procedure = Procedure.last
expect(last_procedure.duree_conservation_dossiers_dans_ds).to eq(duree_conservation_dossiers_dans_ds) 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) 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 describe 'procedure attributs in database' do
subject { procedure } subject { procedure }
it { expect(subject.libelle).to eq(libelle) } it "update attributes" do
it { expect(subject.description).to eq(description) } expect(subject.libelle).to eq(libelle)
it { expect(subject.organisation).to eq(organisation) } expect(subject.description).to eq(description)
it { expect(subject.duree_conservation_dossiers_dans_ds).to eq(duree_conservation_dossiers_dans_ds) } expect(subject.organisation).to eq(organisation)
it { expect(subject.procedure_expires_when_termine_enabled).to eq(true) } 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 end
it { is_expected.to redirect_to(admin_procedure_path id: procedure.id) } it do
it { expect(flash[:notice]).to be_present } is_expected.to redirect_to(admin_procedure_path id: procedure.id)
expect(flash[:notice]).to be_present
end
end end
context 'when many attributs are not valid' do context 'when many attributs are not valid' do
@ -629,11 +631,11 @@ describe Administrateurs::ProceduresController, type: :controller do
subject { update_procedure } subject { update_procedure }
describe 'only some properties can be updated' do it 'only some properties can be updated' do
it { expect(subject.libelle).to eq procedure_params[:libelle] } expect(subject.libelle).to eq procedure_params[:libelle]
it { expect(subject.description).to eq procedure_params[:description] } expect(subject.description).to eq procedure_params[:description]
it { expect(subject.organisation).to eq procedure_params[:organisation] } expect(subject.organisation).to eq procedure_params[:organisation]
it { expect(subject.for_individual).not_to eq procedure_params[:for_individual] } expect(subject.for_individual).not_to eq procedure_params[:for_individual]
end end
end end
end end
@ -955,30 +957,26 @@ describe Administrateurs::ProceduresController, type: :controller do
context 'when all attributes are present' do context 'when all attributes are present' do
render_views render_views
before { update_monavis } subject { update_monavis }
context 'when the embed code is valid' do context 'when the embed code is valid' do
describe 'the monavis field is updated' do it 'the monavis field is updated' do
subject { procedure } 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 end
it { expect(flash[:notice]).to be_present }
it { expect(response).to redirect_to(admin_procedure_path(procedure.id)) }
end end
context 'when the embed code is not valid' do context 'when the embed code is not valid' do
let(:monavis_embed) { 'invalid embed code' } let(:monavis_embed) { 'invalid embed code' }
describe 'the monavis field is not updated' do it 'the monavis field is not updated' do
subject { procedure } expect(subject.monavis_embed).to eq(nil)
expect(flash[:alert]).to be_present
it { expect(subject.monavis_embed).to eq(nil) } expect(response.body).to include "MonAvis"
end end
it { expect(flash[:alert]).to be_present }
it { expect(response.body).to include "MonAvis" }
end end
end end
@ -1016,26 +1014,32 @@ describe Administrateurs::ProceduresController, type: :controller do
context 'when jeton is valid' do context 'when jeton is valid' do
let(:token_is_valid) { true } let(:token_is_valid) { true }
it { expect(flash.alert).to be_nil } it do
it { expect(flash.notice).to eq('Le jeton a bien été mis à jour') } expect(flash.alert).to be_nil
it { expect(procedure.reload.api_entreprise_token).to eq(token) } expect(flash.notice).to eq('Le jeton a bien été mis à jour')
expect(procedure.reload.api_entreprise_token).to eq(token)
end
end end
context 'when jeton is invalid' do context 'when jeton is invalid' do
let(:token_is_valid) { false } let(:token_is_valid) { false }
it { expect(flash.alert).to eq("Mise à jour impossible : le jeton nest pas valide") } it do
it { expect(flash.notice).to be_nil } expect(flash.alert).to eq("Mise à jour impossible : le jeton nest pas valide")
it { expect(procedure.reload.api_entreprise_token).not_to eq(token) } expect(flash.notice).to be_nil
expect(procedure.reload.api_entreprise_token).not_to eq(token)
end
end end
context 'when jeton is not a jwt' do context 'when jeton is not a jwt' do
let(:token) { "invalid" } let(:token) { "invalid" }
let(:token_is_valid) { true } # just to check jwt format by procedure model let(:token_is_valid) { true } # just to check jwt format by procedure model
it { expect(flash.alert).to eq("Mise à jour impossible : le jeton nest pas valide") } it do
it { expect(flash.notice).to be_nil } expect(flash.alert).to eq("Mise à jour impossible : le jeton nest pas valide")
it { expect(procedure.reload.api_entreprise_token).not_to eq(token) } expect(flash.notice).to be_nil
expect(procedure.reload.api_entreprise_token).not_to eq(token)
end
end end
end end
@ -1221,10 +1225,12 @@ describe Administrateurs::ProceduresController, type: :controller do
context 'when admin is unknow' do context 'when admin is unknow' do
let(:email_admin) { 'plop' } let(:email_admin) { 'plop' }
it { expect(subject.status).to eq 302 } it do
it { expect(response.body).to include(admin_procedure_transfert_path(procedure.id)) } expect(subject.status).to eq 302
it { expect(flash[:alert]).to be_present } expect(response.body).to include(admin_procedure_transfert_path(procedure.id))
it { expect(flash[:alert]).to eq("Envoi vers #{email_admin} impossible : cet administrateur nexiste pas") } expect(flash[:alert]).to be_present
expect(flash[:alert]).to eq("Envoi vers #{email_admin} impossible : cet administrateur nexiste pas")
end
end end
context 'when admin is known' do context 'when admin is known' do
@ -1233,8 +1239,10 @@ describe Administrateurs::ProceduresController, type: :controller do
context "and its email address is correct" do context "and its email address is correct" do
let(:email_admin) { 'new_admin@admin.com' } let(:email_admin) { 'new_admin@admin.com' }
it { expect(subject.status).to eq 302 } it do
it { expect { subject }.to change(new_admin.procedures, :count).by(1) } expect { subject }.to change(new_admin.procedures, :count).by(1)
expect(subject.status).to eq 302
end
it "should create a new service" do it "should create a new service" do
subject subject
@ -1245,8 +1253,10 @@ describe Administrateurs::ProceduresController, type: :controller do
context 'when admin is know but its email was not downcased' do context 'when admin is know but its email was not downcased' do
let(:email_admin) { "NEW_admin@adMIN.com" } let(:email_admin) { "NEW_admin@adMIN.com" }
it { expect(subject.status).to eq 302 } it do
it { expect { subject }.to change(Procedure, :count).by(1) } expect { subject }.to change(Procedure, :count).by(1)
expect(subject.status).to eq 302
end
end end
describe "correctly assigns the new admin" do describe "correctly assigns the new admin" do
@ -1308,8 +1318,10 @@ describe Administrateurs::ProceduresController, type: :controller do
procedure.reload procedure.reload
end end
it { expect(procedure.discarded?).to be_falsy } it do
it { expect(procedure.dossiers.first.hidden_by_administration_at).to be_nil } expect(procedure.discarded?).to be_falsy
expect(procedure.dossiers.first.hidden_by_administration_at).to be_nil
end
end end
end end
end end

View file

@ -35,11 +35,11 @@ describe Instructeurs::GroupeInstructeursController, type: :controller do
let(:procedure) { create(:procedure, :published, instructeurs_self_management_enabled: true) } let(:procedure) { create(:procedure, :published, instructeurs_self_management_enabled: true) }
before { get :index, params: { procedure_id: procedure.id } } before { get :index, params: { procedure_id: procedure.id } }
context 'when a procedure has multiple groups' do it 'when a procedure has multiple groups' do
it { expect(response).to have_http_status(:ok) } expect(response).to have_http_status(:ok)
it { expect(response.body).to include(gi_1_2.label) } expect(response.body).to include(gi_1_2.label)
it { expect(response.body).not_to include(gi_1_1.label) } expect(response.body).not_to include(gi_1_1.label)
it { expect(response.body).not_to include(gi_2_2.label) } expect(response.body).not_to include(gi_2_2.label)
end end
end end
@ -47,8 +47,10 @@ describe Instructeurs::GroupeInstructeursController, type: :controller do
let(:procedure) { create(:procedure, :published, :new_administrateur, instructeurs_self_management_enabled: false) } let(:procedure) { create(:procedure, :published, :new_administrateur, instructeurs_self_management_enabled: false) }
before { get :index, params: { procedure_id: procedure.id } } before { get :index, params: { procedure_id: procedure.id } }
it { expect(response).to have_http_status(:redirect) } it "works" do
it { expect(flash.alert).to eq("Vous navez pas le droit de gérer les instructeurs de cette démarche") } expect(response).to have_http_status(:redirect)
expect(flash.alert).to eq("Vous navez pas le droit de gérer les instructeurs de cette démarche")
end
end end
context 'i am an instructor, not on the procedure' do 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 } get :index, params: { procedure_id: procedure.id }
end end
it { expect(response).to have_http_status(:redirect) } it "works" do
it { expect(flash.alert).to eq("Vous navez pas accès à cette démarche") } expect(response).to have_http_status(:redirect)
expect(flash.alert).to eq("Vous navez pas accès à cette démarche")
end
end end
end end
@ -85,24 +89,30 @@ describe Instructeurs::GroupeInstructeursController, type: :controller do
let(:new_instructeur_email) { 'new_instructeur@mail.com' } let(:new_instructeur_email) { 'new_instructeur@mail.com' }
before { subject } before { subject }
it { expect(gi_1_2.instructeurs.map(&:email)).to include(new_instructeur_email) } it "works" do
it { expect(flash.notice).to be_present } expect(gi_1_2.instructeurs.map(&:email)).to include(new_instructeur_email)
it { expect(response).to redirect_to(instructeur_groupe_path(procedure, gi_1_2)) } expect(flash.notice).to be_present
expect(response).to redirect_to(instructeur_groupe_path(procedure, gi_1_2))
end
end end
context 'of an instructeur already in the group' do context 'of an instructeur already in the group' do
let(:new_instructeur_email) { instructeur.email } let(:new_instructeur_email) { instructeur.email }
before { subject } before { subject }
it { expect(flash.alert).to be_present } it "works" do
it { expect(response).to redirect_to(instructeur_groupe_path(procedure, gi_1_2)) } expect(flash.alert).to be_present
expect(response).to redirect_to(instructeur_groupe_path(procedure, gi_1_2))
end
end end
context 'invalid email' do context 'invalid email' do
let(:new_instructeur_email) { 'invalid' } let(:new_instructeur_email) { 'invalid' }
it { subject; expect(flash.alert).to include(new_instructeur_email) } it "works" do
it { expect { subject }.not_to enqueue_email } expect { subject }.not_to enqueue_email
expect(flash.alert).to include(new_instructeur_email)
end
end end
end end
@ -128,10 +138,12 @@ describe Instructeurs::GroupeInstructeursController, type: :controller do
context 'when there are many instructeurs' do context 'when there are many instructeurs' do
before { remove_instructeur(new_instructeur) } before { remove_instructeur(new_instructeur) }
it { expect(gi_1_1.instructeurs).to include(instructeur) } it "works" do
it { expect(gi_1_1.reload.instructeurs.count).to eq(1) } expect(gi_1_1.instructeurs).to include(instructeur)
it { expect(new_instructeur.reload.follows.count).to eq(0) } expect(gi_1_1.reload.instructeurs.count).to eq(1)
it { expect(response).to redirect_to(instructeur_groupe_path(procedure, gi_1_1)) } expect(new_instructeur.reload.follows.count).to eq(0)
expect(response).to redirect_to(instructeur_groupe_path(procedure, gi_1_1))
end
end end
context 'when there is only one instructeur' do context 'when there is only one instructeur' do
@ -140,10 +152,12 @@ describe Instructeurs::GroupeInstructeursController, type: :controller do
remove_instructeur(instructeur) remove_instructeur(instructeur)
end end
it { expect(gi_1_1.instructeurs).to include(instructeur) } it "works" do
it { expect(gi_1_1.instructeurs.count).to eq(1) } expect(gi_1_1.instructeurs).to include(instructeur)
it { expect(flash.alert).to eq('Suppression impossible : il doit y avoir au moins un instructeur dans le groupe') } expect(gi_1_1.instructeurs.count).to eq(1)
it { expect(response).to redirect_to(instructeur_groupe_path(procedure, gi_1_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
end end
@ -161,7 +175,9 @@ describe Instructeurs::GroupeInstructeursController, type: :controller do
} }
end end
it { expect(response).to redirect_to(instructeur_groupe_path(procedure, gi_1_2)) } it "works" do
it { expect(gi_1_2.reload.signature).to be_attached } expect(response).to redirect_to(instructeur_groupe_path(procedure, gi_1_2))
expect(gi_1_2.reload.signature).to be_attached
end
end end
end end

View file

@ -1,12 +1,12 @@
describe Administrateur, type: :model do describe Administrateur, type: :model do
let(:administration) { create(:administration) } let(:administration) { create(:administration) }
describe 'associations' do it 'define associations' do
it { is_expected.to have_many(:commentaire_groupe_gestionnaires) } is_expected.to have_many(:commentaire_groupe_gestionnaires)
it { is_expected.to have_many(:archives) } is_expected.to have_many(:archives)
it { is_expected.to have_many(:exports) } is_expected.to have_many(:exports)
it { is_expected.to have_and_belong_to_many(:instructeurs) } is_expected.to have_and_belong_to_many(:instructeurs)
it { is_expected.to belong_to(:groupe_gestionnaire).optional } is_expected.to belong_to(:groupe_gestionnaire).optional
end end
describe "#can_be_deleted?" do describe "#can_be_deleted?" do