chore(groupe instructeur): move closed validation for defaut groupe to model

This commit is contained in:
Eric Leroy-Terquem 2023-08-04 14:47:40 +02:00
parent 43fb0ac338
commit fc2c196cfa
5 changed files with 29 additions and 24 deletions

View file

@ -147,20 +147,13 @@ module Administrateurs
def update_state def update_state
@groupe_instructeur = procedure.groupe_instructeurs.find(params[:groupe_instructeur_id]) @groupe_instructeur = procedure.groupe_instructeurs.find(params[:groupe_instructeur_id])
if closed_params? && @groupe_instructeur.id == procedure.defaut_groupe_instructeur.id if @groupe_instructeur.update(closed: params[:closed])
redirect_to admin_procedure_groupe_instructeur_path(procedure, @groupe_instructeur),
alert: "Il est impossible de désactiver le groupe dinstructeurs par défaut."
elsif @groupe_instructeur.update(closed: params[:closed])
state_for_notice = @groupe_instructeur.closed ? 'désactivé' : 'activé' state_for_notice = @groupe_instructeur.closed ? 'désactivé' : 'activé'
redirect_to admin_procedure_groupe_instructeur_path(procedure, @groupe_instructeur), redirect_to admin_procedure_groupe_instructeur_path(procedure, @groupe_instructeur),
notice: "Le groupe #{@groupe_instructeur.label} est #{state_for_notice}." notice: "Le groupe #{@groupe_instructeur.label} est #{state_for_notice}."
else else
@procedure = procedure redirect_to admin_procedure_groupe_instructeur_path(procedure, @groupe_instructeur),
@instructeurs = paginated_instructeurs alert: @groupe_instructeur.errors.messages_for(:closed).to_sentence
@available_instructeur_emails = available_instructeur_emails
flash.now[:alert] = @groupe_instructeur.errors.full_messages
render :show
end end
end end

View file

@ -16,7 +16,8 @@ class GroupeInstructeur < ApplicationRecord
validates :label, presence: true, allow_nil: false validates :label, presence: true, allow_nil: false
validates :label, uniqueness: { scope: :procedure } validates :label, uniqueness: { scope: :procedure }
validates :closed, acceptance: { accept: [false] }, if: -> do validates :closed, acceptance: { accept: [false], message: I18n.t('.activerecord.errors.models.groupe_instructeur.defaut') }, if: -> { (self == procedure.defaut_groupe_instructeur) }
validates :closed, acceptance: { accept: [false], message: 'Il doit y avoir au moins un groupe dinstructeurs actif sur chaque démarche' }, if: -> do
if closed if closed
(other_groupe_instructeurs.map(&:closed) + [closed]).all? (other_groupe_instructeurs.map(&:closed) + [closed]).all?
else else

View file

@ -15,4 +15,4 @@ fr:
format: "Le libellé %{message}" format: "Le libellé %{message}"
closed: closed:
format: "%{message}" format: "%{message}"
accepted: Il doit y avoir au moins un groupe dinstructeurs actif sur chaque démarche accepted: Il est impossible de désactiver le groupe dinstructeurs par défaut.

View file

@ -639,9 +639,9 @@ describe API::V2::GraphqlController do
let(:variables) { { input: { groupeInstructeurId: dossier.groupe_instructeur.to_typed_id, closed: true } } } let(:variables) { { input: { groupeInstructeurId: dossier.groupe_instructeur.to_typed_id, closed: true } } }
context 'with multiple groupes' do context 'with multiple groupes' do
before do let!(:defaut_groupe_instructeur) { create(:groupe_instructeur, procedure: procedure) }
create(:groupe_instructeur, procedure: procedure)
end before { procedure.update(defaut_groupe_instructeur_id: defaut_groupe_instructeur.id) }
it { it {
expect(gql_errors).to be_nil expect(gql_errors).to be_nil
@ -656,10 +656,11 @@ describe API::V2::GraphqlController do
let(:types_de_champ_public) { [{ type: :drop_down_list }] } let(:types_de_champ_public) { [{ type: :drop_down_list }] }
let(:groupe_instructeur) { procedure.groupe_instructeurs.first } let(:groupe_instructeur) { procedure.groupe_instructeurs.first }
let(:routing_champ) { procedure.active_revision.types_de_champ.first } let(:routing_champ) { procedure.active_revision.types_de_champ.first }
let!(:defaut_groupe_instructeur) { create(:groupe_instructeur, procedure: procedure) }
before do before do
groupe_instructeur.update(routing_rule: ds_eq(champ_value(routing_champ.stable_id), constant(groupe_instructeur.label))) groupe_instructeur.update(routing_rule: ds_eq(champ_value(routing_champ.stable_id), constant(groupe_instructeur.label)))
create(:groupe_instructeur, procedure: procedure) procedure.update(defaut_groupe_instructeur_id: defaut_groupe_instructeur.id)
Flipper.enable(:groupe_instructeur_api_hack, procedure) Flipper.enable(:groupe_instructeur_api_hack, procedure)
end end
@ -675,7 +676,7 @@ describe API::V2::GraphqlController do
context 'validation error' do context 'validation error' do
it { it {
expect(gql_errors).to be_nil expect(gql_errors).to be_nil
expect(gql_data[:groupeInstructeurModifier][:errors].first[:message]).to eq('Il doit y avoir au moins un groupe dinstructeurs actif sur chaque démarche') expect(gql_data[:groupeInstructeurModifier][:errors].first[:message]).to eq('Il est impossible de désactiver le groupe dinstructeurs par défaut.')
} }
end end
end end

View file

@ -99,14 +99,15 @@ describe GroupeInstructeur, type: :model do
end end
describe "active group validations" do describe "active group validations" do
context "there is at least one active groupe instructeur" do
let(:gi_active) { procedure.defaut_groupe_instructeur } let(:gi_active) { procedure.defaut_groupe_instructeur }
let(:gi_closed) { create(:groupe_instructeur, procedure:) } let(:gi_closed) { create(:groupe_instructeur, procedure:) }
before do before do
gi_active gi_active
gi_closed.update(closed: true) gi_closed.update(closed: true)
end end
context "there is one active groupe instructeur" do
it "closed is valid when there is one other active groupe" do it "closed is valid when there is one other active groupe" do
expect(gi_active).to be_valid expect(gi_active).to be_valid
expect(gi_closed).to be_valid expect(gi_closed).to be_valid
@ -117,6 +118,15 @@ describe GroupeInstructeur, type: :model do
expect(gi_active).not_to be_valid expect(gi_active).not_to be_valid
end end
end end
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
end end
private private