From bdcb451d3c8bf8bb4b2d0efa62a5ddde0ad8464d Mon Sep 17 00:00:00 2001 From: Christophe Robillard Date: Tue, 27 Sep 2022 19:22:42 +0200 Subject: [PATCH] procedure publiee must have one zone at least --- .../administrateurs/procedures_controller.rb | 6 +++++- app/models/procedure.rb | 1 + .../administrateurs/procedures_controller_spec.rb | 13 +++++++++++++ spec/factories/procedure.rb | 2 +- spec/models/dossier_spec.rb | 2 +- spec/models/procedure_spec.rb | 14 +++++++------- 6 files changed, 28 insertions(+), 10 deletions(-) diff --git a/app/controllers/administrateurs/procedures_controller.rb b/app/controllers/administrateurs/procedures_controller.rb index f1038842a..fc6692944 100644 --- a/app/controllers/administrateurs/procedures_controller.rb +++ b/app/controllers/administrateurs/procedures_controller.rb @@ -131,7 +131,11 @@ module Administrateurs if !@procedure.update(procedure_params) flash.now.alert = @procedure.errors.full_messages - render 'edit' + if @procedure.errors[:zones].present? + render 'zones' + else + render 'edit' + end elsif @procedure.brouillon? reset_procedure flash.notice = 'Démarche modifiée. Tous les dossiers de cette démarche ont été supprimés.' diff --git a/app/models/procedure.rb b/app/models/procedure.rb index 9e8881e83..f93f02614 100644 --- a/app/models/procedure.rb +++ b/app/models/procedure.rb @@ -289,6 +289,7 @@ class Procedure < ApplicationRecord validates :lien_dpo, email_or_link: true, allow_nil: true validates_with MonAvisEmbedValidator + validates :zones, presence: true, if: -> record { record.publiee? && Flipper.enabled?(:zonage) } FILE_MAX_SIZE = 20.megabytes validates :notice, content_type: [ diff --git a/spec/controllers/administrateurs/procedures_controller_spec.rb b/spec/controllers/administrateurs/procedures_controller_spec.rb index 7530ea0d0..4fb4c7160 100644 --- a/spec/controllers/administrateurs/procedures_controller_spec.rb +++ b/spec/controllers/administrateurs/procedures_controller_spec.rb @@ -334,6 +334,19 @@ describe Administrateurs::ProceduresController, type: :controller do it { expect(subject.for_individual).not_to eq procedure_params[:for_individual] } end + + context 'when zones are empty' do + before do + Flipper.enable(:zonage) + end + + after do + Flipper.disable(:zonage) + end + + let(:zone_ids) { [""] } + it { is_expected.to render_template :zones } + end end end end diff --git a/spec/factories/procedure.rb b/spec/factories/procedure.rb index 755c70abd..04acc4316 100644 --- a/spec/factories/procedure.rb +++ b/spec/factories/procedure.rb @@ -13,7 +13,6 @@ FactoryBot.define do ask_birthday { false } lien_site_web { "https://mon-site.gouv" } path { SecureRandom.uuid } - association :zone groupe_instructeurs { [association(:groupe_instructeur, :default, procedure: instance, strategy: :build)] } administrateurs { administrateur.present? ? [administrateur] : [association(:administrateur)] } @@ -282,6 +281,7 @@ FactoryBot.define do published_at { Time.zone.now } unpublished_at { nil } closed_at { nil } + zones { [association(:zone, strategy: :build)] } end trait :closed do diff --git a/spec/models/dossier_spec.rb b/spec/models/dossier_spec.rb index 03f73d39b..06a48df62 100644 --- a/spec/models/dossier_spec.rb +++ b/spec/models/dossier_spec.rb @@ -1484,7 +1484,7 @@ describe Dossier do end describe "champs_for_export" do - let(:procedure) { create(:procedure, :with_type_de_champ, :with_datetime, :with_yes_no, :with_explication, :with_commune, :with_repetition) } + let(:procedure) { create(:procedure, :with_type_de_champ, :with_datetime, :with_yes_no, :with_explication, :with_commune, :with_repetition, zones: [create(:zone)]) } let(:text_type_de_champ) { procedure.types_de_champ.find { |type_de_champ| type_de_champ.type_champ == TypeDeChamp.type_champs.fetch(:text) } } let(:yes_no_type_de_champ) { procedure.types_de_champ.find { |type_de_champ| type_de_champ.type_champ == TypeDeChamp.type_champs.fetch(:yes_no) } } let(:datetime_type_de_champ) { procedure.types_de_champ.find { |type_de_champ| type_de_champ.type_champ == TypeDeChamp.type_champs.fetch(:datetime) } } diff --git a/spec/models/procedure_spec.rb b/spec/models/procedure_spec.rb index 5b1924c31..156ebb53b 100644 --- a/spec/models/procedure_spec.rb +++ b/spec/models/procedure_spec.rb @@ -704,7 +704,7 @@ describe Procedure do end describe '#publish!' do - let(:procedure) { create(:procedure, path: 'example-path') } + let(:procedure) { create(:procedure, path: 'example-path', zones: [create(:zone)]) } let(:now) { Time.zone.now.beginning_of_minute } context 'when publishing a new procedure' do @@ -757,7 +757,7 @@ describe Procedure do let(:canonical_procedure) { create(:procedure, :published) } let(:administrateur) { canonical_procedure.administrateurs.first } - let(:procedure) { create(:procedure, administrateurs: [administrateur]) } + let(:procedure) { create(:procedure, administrateurs: [administrateur], zones: [create(:zone)]) } let(:now) { Time.zone.now.beginning_of_minute } context 'when publishing over a previous canonical procedure' do @@ -1063,7 +1063,7 @@ describe Procedure do end describe 'suggested_path' do - let(:procedure) { create(:procedure, aasm_state: :publiee, libelle: 'Inscription au Collège') } + let(:procedure) { create(:procedure, aasm_state: :publiee, libelle: 'Inscription au Collège', zones: [create(:zone)]) } subject { procedure.suggested_path(procedure.administrateurs.first) } @@ -1079,7 +1079,7 @@ describe Procedure do context 'when the suggestion conflicts with one procedure' do before do - create(:procedure, aasm_state: :publiee, path: 'inscription-au-college') + create(:procedure, aasm_state: :publiee, path: 'inscription-au-college', zones: [create(:zone)]) end it { is_expected.to eq 'inscription-au-college-2' } @@ -1087,8 +1087,8 @@ describe Procedure do context 'when the suggestion conflicts with several procedures' do before do - create(:procedure, aasm_state: :publiee, path: 'inscription-au-college') - create(:procedure, aasm_state: :publiee, path: 'inscription-au-college-2') + create(:procedure, aasm_state: :publiee, path: 'inscription-au-college', zones: [create(:zone)]) + create(:procedure, aasm_state: :publiee, path: 'inscription-au-college-2', zones: [create(:zone)]) end it { is_expected.to eq 'inscription-au-college-3' } @@ -1096,7 +1096,7 @@ describe Procedure do context 'when the suggestion conflicts with another procedure of the same admin' do before do - create(:procedure, aasm_state: :publiee, path: 'inscription-au-college', administrateurs: procedure.administrateurs) + create(:procedure, aasm_state: :publiee, path: 'inscription-au-college', administrateurs: procedure.administrateurs, zones: [create(:zone)]) end it { is_expected.to eq 'inscription-au-college' }