feat(conditional): add exclude operator

This commit is contained in:
Eric Leroy-Terquem 2023-11-15 17:44:46 +01:00
parent ba17f8d8aa
commit f945c02c3c
6 changed files with 39 additions and 3 deletions

View file

@ -99,7 +99,8 @@ class Conditions::ConditionsComponent < ApplicationComponent
] ]
when ChampValue::CHAMP_VALUE_TYPE.fetch(:enums) when ChampValue::CHAMP_VALUE_TYPE.fetch(:enums)
[ [
[t(IncludeOperator.name, scope: 'logic.operators'), IncludeOperator.name] [t(IncludeOperator.name, scope: 'logic.operators'), IncludeOperator.name],
[t(ExcludeOperator.name, scope: 'logic.operators'), ExcludeOperator.name]
] ]
when ChampValue::CHAMP_VALUE_TYPE.fetch(:number) when ChampValue::CHAMP_VALUE_TYPE.fetch(:number)
[Eq, LessThan, GreaterThan, LessThanEq, GreaterThanEq] [Eq, LessThan, GreaterThan, LessThanEq, GreaterThanEq]

View file

@ -92,7 +92,7 @@ class GroupeInstructeur < ApplicationRecord
end end
def valid_rule_line?(rule) def valid_rule_line?(rule)
([rule.left, rule, rule.right] in [ChampValue, (LessThan | LessThanEq | Eq | NotEq | GreaterThanEq | GreaterThan | IncludeOperator), Constant]) && routing_rule_matches_tdc?(rule) ([rule.left, rule, rule.right] in [ChampValue, (LessThan | LessThanEq | Eq | NotEq | GreaterThanEq | GreaterThan | IncludeOperator | ExcludeOperator), Constant]) && routing_rule_matches_tdc?(rule)
end end
def non_unique_rule? def non_unique_rule?

View file

@ -8,7 +8,7 @@ module Logic
end end
def self.class_from_name(name) def self.class_from_name(name)
[ChampValue, Constant, Empty, LessThan, LessThanEq, Eq, NotEq, GreaterThanEq, GreaterThan, EmptyOperator, IncludeOperator, And, Or] [ChampValue, Constant, Empty, LessThan, LessThanEq, Eq, NotEq, GreaterThanEq, GreaterThan, EmptyOperator, IncludeOperator, ExcludeOperator, And, Or]
.find { |c| c.name == name } .find { |c| c.name == name }
end end
@ -88,6 +88,8 @@ module Logic
def ds_include(left, right) = Logic::IncludeOperator.new(left, right) def ds_include(left, right) = Logic::IncludeOperator.new(left, right)
def ds_exclude(left, right) = Logic::ExcludeOperator.new(left, right)
def constant(value) = Logic::Constant.new(value) def constant(value) = Logic::Constant.new(value)
def champ_value(stable_id) = Logic::ChampValue.new(stable_id) def champ_value(stable_id) = Logic::ChampValue.new(stable_id)

View file

@ -0,0 +1,3 @@
class Logic::ExcludeOperator < Logic::IncludeOperator
def operation = :exclude?
end

View file

@ -14,3 +14,4 @@ fr:
'Logic::Or': Ou 'Logic::Or': Ou
'Logic::NotEq': Nest pas 'Logic::NotEq': Nest pas
'Logic::IncludeOperator': Contient 'Logic::IncludeOperator': Contient
'Logic::ExcludeOperator': Ne contient pas

View file

@ -0,0 +1,29 @@
describe Logic::ExcludeOperator do
include Logic
let(:champ) { create(:champ_multiple_drop_down_list, value: '["val1", "val2"]') }
describe '#compute' do
it { expect(ds_exclude(champ_value(champ.stable_id), constant('val1')).compute([champ])).to be(false) }
it { expect(ds_exclude(champ_value(champ.stable_id), constant('something else')).compute([champ])).to be(true) }
end
describe '#errors' do
it { expect(ds_exclude(champ_value(champ.stable_id), constant('val1')).errors([champ.type_de_champ])).to be_empty }
it do
expected = {
right: constant('something else'),
stable_id: champ.stable_id,
type: :not_included
}
expect(ds_exclude(champ_value(champ.stable_id), constant('something else')).errors([champ.type_de_champ])).to eq([expected])
end
it { expect(ds_exclude(constant(1), constant('val1')).errors([])).to eq([{ type: :required_list }]) }
end
describe '#==' do
it { expect(ds_include(champ_value(champ.stable_id), constant('val1'))).to eq(ds_include(champ_value(champ.stable_id), constant('val1'))) }
end
end