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 27b86f9
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 26 deletions.
35 changes: 19 additions & 16 deletions app/validators/types_de_champ/condition_validator.rb
Original file line number Diff line number Diff line change
@@ -1,21 +1,24 @@
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
.map.with_index
.filter_map { |tdc, i| tdc.condition? ? [tdc, i] : nil }
.map do |tdc, i|
[tdc, tdc.condition.errors(public_tdcs.take(i))]
end
.filter { |_tdc, errors| errors.present? }
.each do |tdc, _error_hash|
procedure.errors.add(
attribute,
procedure.errors.generate_message(attribute, :invalid_condition, { value: tdc.libelle }),
type_de_champ: tdc
)
end
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.each_with_index do |tdc, i|
next unless tdc.condition?

errors = tdc.condition.errors(tdcs.take(i))
next if errors.blank?

procedure.errors.add(
attribute,
procedure.errors.generate_message(attribute, :invalid_condition, { value: tdc.libelle }),
type_de_champ: tdc
)
end
end
end
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 27b86f9

Please sign in to comment.