2024-04-29 00:17:15 +02:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2019-10-09 18:05:43 +02:00
|
|
|
describe GroupeInstructeur, type: :model do
|
2021-12-21 19:06:38 +01:00
|
|
|
let(:admin) { create :administrateur }
|
|
|
|
let(:procedure) { create :procedure, :published, administrateur: admin }
|
|
|
|
let(:procedure_2) { create :procedure, :published, administrateur: admin }
|
|
|
|
let(:procedure_3) { create :procedure, :published, administrateur: admin }
|
|
|
|
let(:instructeur) { create :instructeur, administrateurs: [admin] }
|
|
|
|
let(:procedure_assign) { assign(procedure) }
|
|
|
|
|
|
|
|
before do
|
|
|
|
procedure_assign
|
|
|
|
assign(procedure_2)
|
|
|
|
procedure_3
|
|
|
|
end
|
|
|
|
|
2019-10-09 18:05:43 +02:00
|
|
|
subject { GroupeInstructeur.new(label: label, procedure: procedure) }
|
|
|
|
|
|
|
|
context 'with no label provided' do
|
|
|
|
let(:label) { '' }
|
|
|
|
|
|
|
|
it { is_expected.to be_invalid }
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with a valid label' do
|
|
|
|
let(:label) { 'Préfecture de la Marne' }
|
|
|
|
|
|
|
|
it { is_expected.to be_valid }
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with a label with extra spaces' do
|
|
|
|
let(:label) { 'Préfecture de la Marne ' }
|
|
|
|
before do
|
|
|
|
subject.save
|
|
|
|
subject.reload
|
|
|
|
end
|
|
|
|
|
|
|
|
it { is_expected.to be_valid }
|
|
|
|
it { expect(subject.label).to eq("Préfecture de la Marne") }
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with a label already used for this procedure' do
|
|
|
|
let(:label) { 'Préfecture de la Marne' }
|
|
|
|
before do
|
|
|
|
GroupeInstructeur.create!(label: label, procedure: procedure)
|
|
|
|
end
|
|
|
|
|
|
|
|
it { is_expected.to be_invalid }
|
|
|
|
end
|
2021-12-21 19:06:38 +01:00
|
|
|
|
|
|
|
describe "#add" do
|
|
|
|
let(:another_groupe_instructeur) { create(:groupe_instructeur, procedure: procedure) }
|
|
|
|
|
|
|
|
subject { another_groupe_instructeur.add(instructeur) }
|
|
|
|
|
|
|
|
it 'adds the instructeur to the groupe instructeur' do
|
|
|
|
subject
|
|
|
|
expect(another_groupe_instructeur.reload.instructeurs).to include(instructeur)
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when joining another groupe instructeur on the same procedure' do
|
|
|
|
before do
|
|
|
|
procedure_assign.update(daily_email_notifications_enabled: true)
|
|
|
|
subject
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'copies notifications settings from a previous group' do
|
|
|
|
expect(instructeur.assign_to.last.daily_email_notifications_enabled).to be_truthy
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "#remove" do
|
|
|
|
subject { procedure_to_remove.defaut_groupe_instructeur.remove(instructeur) }
|
|
|
|
|
|
|
|
context "with an assigned procedure" do
|
|
|
|
let(:procedure_to_remove) { procedure }
|
|
|
|
let!(:procedure_presentation) { procedure_assign.procedure_presentation }
|
|
|
|
|
|
|
|
it { is_expected.to be_truthy }
|
|
|
|
|
|
|
|
describe "consequences" do
|
|
|
|
before do
|
|
|
|
procedure_assign.build_procedure_presentation
|
|
|
|
procedure_assign.save
|
|
|
|
subject
|
|
|
|
end
|
|
|
|
|
|
|
|
it "removes the assign_to and procedure_presentation" do
|
|
|
|
expect(AssignTo.where(id: procedure_assign).count).to eq(0)
|
|
|
|
expect(ProcedurePresentation.where(assign_to_id: procedure_assign.id).count).to eq(0)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "with an already unassigned procedure" do
|
|
|
|
let(:procedure_to_remove) { procedure_3 }
|
|
|
|
|
|
|
|
it { is_expected.to be_falsey }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2023-03-02 15:52:50 +01:00
|
|
|
describe "active group validations" do
|
2023-08-04 14:47:40 +02:00
|
|
|
let(:gi_active) { procedure.defaut_groupe_instructeur }
|
|
|
|
let(:gi_closed) { create(:groupe_instructeur, procedure:) }
|
|
|
|
|
|
|
|
before do
|
|
|
|
gi_active
|
|
|
|
gi_closed.update(closed: true)
|
|
|
|
end
|
2023-03-02 15:52:50 +01:00
|
|
|
|
2023-08-04 14:47:40 +02:00
|
|
|
context "there is one active groupe instructeur" do
|
2023-03-02 15:52:50 +01:00
|
|
|
it "closed is valid when there is one other active groupe" do
|
|
|
|
expect(gi_active).to be_valid
|
|
|
|
expect(gi_closed).to be_valid
|
|
|
|
end
|
|
|
|
|
|
|
|
it "closed is invalid when there is no active groupe" do
|
|
|
|
gi_active.closed = true
|
|
|
|
expect(gi_active).not_to be_valid
|
|
|
|
end
|
|
|
|
end
|
2023-08-04 14:47:40 +02:00
|
|
|
|
|
|
|
context "there are many active groupes instructeurs" do
|
|
|
|
let!(:second_gi_active) { create(:groupe_instructeur, procedure:) }
|
|
|
|
|
|
|
|
it "closed is invalid for defaut groupe instructeur even if many active groupes" do
|
|
|
|
gi_active.update(closed: true)
|
|
|
|
expect(gi_active).not_to be_valid
|
|
|
|
end
|
|
|
|
end
|
2023-03-02 15:52:50 +01:00
|
|
|
end
|
|
|
|
|
2024-03-07 16:33:17 +01:00
|
|
|
describe 'destroy' do
|
|
|
|
context 'with contact information' do
|
|
|
|
let(:defaut_group) { procedure.defaut_groupe_instructeur }
|
|
|
|
let(:second_group) { create(:groupe_instructeur, procedure:) }
|
|
|
|
|
|
|
|
before do
|
|
|
|
second_group.update(contact_information: create(:contact_information))
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'works' do
|
|
|
|
expect { second_group.destroy! }.not_to raise_error
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-12-21 19:06:38 +01:00
|
|
|
private
|
|
|
|
|
|
|
|
def assign(procedure_to_assign, instructeur_assigne: instructeur)
|
|
|
|
create :assign_to, instructeur: instructeur_assigne, procedure: procedure_to_assign, groupe_instructeur: procedure_to_assign.defaut_groupe_instructeur
|
|
|
|
end
|
2019-10-09 18:05:43 +02:00
|
|
|
end
|