Merge pull request #9392 from demarches-simplifiees/move-groupe-instructeur-validation-to-model

Tech : déplace une validation sur le groupe d'instructeurs défaut du controleur au modèle
This commit is contained in:
LeSim 2023-08-31 09:45:03 +00:00 committed by GitHub
commit 3e193675aa
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 28 additions and 30 deletions

View file

@ -159,20 +159,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,13 +16,7 @@ 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] }, if: -> { (self == procedure.defaut_groupe_instructeur) }
if closed
(other_groupe_instructeurs.map(&:closed) + [closed]).all?
else
false
end
end
before_validation -> { label&.strip! } before_validation -> { label&.strip! }

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
gi_active
gi_closed.update(closed: true)
end
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 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