Skip to content

Commit

Permalink
fix(TypesDeChamp::ConditionValidator): allow to use types_de_champ_pu…
Browse files Browse the repository at this point in the history
…blic on condition for types_de_champ_private
  • Loading branch information
mfo committed Jun 10, 2024
1 parent d2ccea7 commit 86bb346
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 14 deletions.
13 changes: 9 additions & 4 deletions app/validators/types_de_champ/condition_validator.rb
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
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 }
return if types_de_champ.empty?

public_tdcs
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

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|
Expand Down
31 changes: 23 additions & 8 deletions spec/models/procedure_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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) }

Expand Down Expand Up @@ -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
Expand Down
3 changes: 1 addition & 2 deletions spec/services/procedure_export_service_zip_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down

0 comments on commit 86bb346

Please sign in to comment.