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
@groupe_instructeur = procedure.groupe_instructeurs.find(params[:groupe_instructeur_id])
if closed_params? && @groupe_instructeur.id == procedure.defaut_groupe_instructeur.id
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])
if @groupe_instructeur.update(closed: params[:closed])
state_for_notice = @groupe_instructeur.closed ? 'désactivé' : 'activé'
redirect_to admin_procedure_groupe_instructeur_path(procedure, @groupe_instructeur),
notice: "Le groupe #{@groupe_instructeur.label} est #{state_for_notice}."
else
@procedure = procedure
@instructeurs = paginated_instructeurs
@available_instructeur_emails = available_instructeur_emails
flash.now[:alert] = @groupe_instructeur.errors.full_messages
render :show
redirect_to admin_procedure_groupe_instructeur_path(procedure, @groupe_instructeur),
alert: @groupe_instructeur.errors.messages_for(:closed).to_sentence
end
end

View file

@ -16,7 +16,8 @@ class GroupeInstructeur < ApplicationRecord
validates :label, presence: true, allow_nil: false
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
(other_groupe_instructeurs.map(&:closed) + [closed]).all?
else

View file

@ -15,4 +15,4 @@ fr:
format: "Le libellé %{message}"
closed:
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 } } }
context 'with multiple groupes' do
before do
create(:groupe_instructeur, procedure: procedure)
end
let!(:defaut_groupe_instructeur) { create(:groupe_instructeur, procedure: procedure) }
before { procedure.update(defaut_groupe_instructeur_id: defaut_groupe_instructeur.id) }
it {
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(:groupe_instructeur) { procedure.groupe_instructeurs.first }
let(:routing_champ) { procedure.active_revision.types_de_champ.first }
let!(:defaut_groupe_instructeur) { create(:groupe_instructeur, procedure: procedure) }
before do
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)
end
@ -675,7 +676,7 @@ describe API::V2::GraphqlController do
context 'validation error' do
it {
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

View file

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