diff --git a/app/validators/types_de_champ/condition_validator.rb b/app/validators/types_de_champ/condition_validator.rb index 74b57c3d549..07a2dfa8ced 100644 --- a/app/validators/types_de_champ/condition_validator.rb +++ b/app/validators/types_de_champ/condition_validator.rb @@ -1,13 +1,16 @@ class TypesDeChamp::ConditionValidator < ActiveModel::EachValidator def validate_each(procedure, attribute, types_de_champ) - public_tdcs = types_de_champ.to_a - .flat_map { _1.repetition? ? procedure.draft_revision.children_of(_1) : _1 } + tdcs = if attribute == :draft_types_de_champ_private + procedure.draft_revision.types_de_champ_for + else + procedure.draft_revision.types_de_champ_for(scope: :public) + end - public_tdcs + tdcs .map.with_index .filter_map { |tdc, i| tdc.condition? ? [tdc, i] : nil } .map do |tdc, i| - [tdc, tdc.condition.errors(public_tdcs.take(i))] + [tdc, tdc.condition.errors(tdcs.take(i))] end .filter { |_tdc, errors| errors.present? } .each do |tdc, _error_hash| diff --git a/spec/models/procedure_spec.rb b/spec/models/procedure_spec.rb index 08061225393..7c4c8c1e6a0 100644 --- a/spec/models/procedure_spec.rb +++ b/spec/models/procedure_spec.rb @@ -211,7 +211,7 @@ it { is_expected.to allow_value('text').on(:publication).for(:cadre_juridique) } context 'with deliberation' do - let(:procedure) { build(:procedure, cadre_juridique: nil) } + let(:procedure) { build(:procedure, cadre_juridique: nil, revisions: [build(:procedure_revision)]) } it { expect(procedure.valid?(:publication)).to eq(false) } @@ -420,22 +420,37 @@ procedure.validate(:publication) expect(procedure.errors.full_messages_for(:draft_types_de_champ_private)).to include(invalid_drop_down_error_message) end + end - it 'validates that types de champ private condition works types de champ public and private' do + context 'when condition on champ private use public champ' do + include Logic + let(:types_de_champ_public) { [{ type: :decimal_number, stable_id: 1 }] } + let(:types_de_champ_private) { [{ type: :text, condition: ds_eq(champ_value(1), constant(2)), stable_id: 2 }] } + it 'validate without context' do + procedure.validate + expect(procedure.errors.full_messages_for(:draft_types_de_champ_private)).to be_empty + end + + it 'validate allows condition' do + procedure.validate(:types_de_champ_private_editor) + expect(procedure.errors.full_messages_for(:draft_types_de_champ_private)).to be_empty end end - context 'when condition on champ private use public champ' do + context 'when condition on champ public use private champ' do include Logic - let(:types_de_champ_private) { [{ type: :text, condition: ds_eq(champ_value(1), constant(2)) }] } - let(:types_de_champ_public) { [{ type: :number, stable_id: 1 }] } + let(:types_de_champ_public) { [{ type: :text, libelle: 'condition', condition: ds_eq(champ_value(1), constant(2)), stable_id: 2 }] } + let(:types_de_champ_private) { [{ type: :decimal_number, stable_id: 1 }] } + let(:error_on_condition) { "Le champ « condition » a une logique conditionnelle invalide" } it 'validate without context' do - expect(procedure.validate).to be_truthy + procedure.validate + expect(procedure.errors.full_messages_for(:draft_types_de_champ_public)).to be_empty end - it 'validate with types_de_champ_private_editor' do - expect(procedure.validate(:types_de_champ_private_editor)).to be_falsey + it 'validate prevent condition' do + procedure.validate(:types_de_champ_public_editor) + expect(procedure.errors.full_messages_for(:draft_types_de_champ_public)).to include(error_on_condition) end end end diff --git a/spec/services/procedure_export_service_zip_spec.rb b/spec/services/procedure_export_service_zip_spec.rb index 14e5ceaadde..e4daaf3ee44 100644 --- a/spec/services/procedure_export_service_zip_spec.rb +++ b/spec/services/procedure_export_service_zip_spec.rb @@ -39,8 +39,7 @@ def attachments(champ) = champ.piece_justificative_file.attachments ActiveSupport::Notifications.subscribed(callback, "sql.active_record") do subject end - - expect(sql_count <= 58).to be_truthy + expect(sql_count <= 62).to be_truthy dossier = dossiers.first