tests pour l'application des règles

This commit is contained in:
Jérémy Lecour 2021-01-24 17:49:35 +01:00 committed by Jérémy Lecour
parent dabf9ea36e
commit 5a89cf1692
6 changed files with 113 additions and 19 deletions

View file

@ -6,7 +6,7 @@ class InMailbox < ApplicationMailbox
email = email_importer.import(mail)
email = rules_evaluator.evaluate(email)
email = rules_evaluator.evaluate(email, RuleSet.enabled)
repository.save(email)
end

View file

@ -1,20 +1,19 @@
class RulesEvaluator
def evaluate(email)
RuleSet.enabled.each do |rule_set|
if evaluate_rule_set(email, rule_set)
rule_set.actions.enabled.each do |action|
klass = action.class_name.constantize
email = klass.new.process(email)
# rescue NameError => ex
# # TODO: log a warning
end
def evaluate(email, rule_set_or_sets)
if rule_set_or_sets.respond_to? :each
rule_set_or_sets.each do |rule_set|
email = evaluate_rule_set(email, rule_set)
end
else
email = evaluate_rule_set(email, rule_set_or_sets)
end
email
end
private
def evaluate_rule_set(email, rule_set)
rules_state = true
@ -27,10 +26,17 @@ class RulesEvaluator
break unless rules_state
end
rules_state
end
if rules_state
rule_set.actions.enabled.each do |action|
klass = action.class_name.constantize
email = klass.new.process(email)
# rescue NameError => ex
# # TODO: log a warning
end
end
private
email
end
def prepare_subjects(email, rule)
case rule.subject_type.downcase
@ -83,7 +89,7 @@ class RulesEvaluator
# subject.empty?
# }
else
true
raise ArgumentError, "Unrecognized condition type '#{rule. condition_type}'"
end
def apply_operator(state, operator, result)
@ -95,7 +101,7 @@ class RulesEvaluator
when "XOR"
(state or result) and !(rules_state and result)
else
raise ArgumentError, "Unrecognized logic '#{rule_set.operator}'"
raise ArgumentError, "Unrecognized operator '#{operator}'"
end
end

View file

@ -1,19 +1,44 @@
# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
one:
name: Default RuleSet
description: MyText
enabled: true
operator: "AND"
inverted: false
and_rules:
name: Rules with AND
description: MyText
enabled: true
operator: "AND"
inverted: false
two:
or_rules:
name: Rules with OR
description: MyText
enabled: true
operator: "OR"
inverted: false
invalid_subject:
name: Rules with an invalid rule subject
enabled: false
operator: "AND"
inverted: false
invalid_condition_type:
name: Rules with an invalid rule condition type
enabled: false
operator: "AND"
inverted: false
invalid_operator:
name: Rules with an invalid rule operator
enabled: false
operator: "FOO"
inverted: false
metadata:
name: Metadata
description: Add metadata to mail (servers, clients…)

View file

@ -13,9 +13,39 @@ one:
two:
rule_set: two
name: Subject doesn't contain MyString
enabled: false
enabled: true
subject_type: Header
subject_value: Subject
condition_type: contain
condition_value: MyString
inverted: true
invalid_subject:
rule_set: invalid_subject
name: Rule with invalid subject type
enabled: true
subject_type: Invalid
subject_value: Subject
condition_type: contain
condition_value: MyString
inverted: false
invalid_condition_type:
rule_set: invalid_condition_type
name: Rule with invalid condition type
enabled: true
subject_type: Header
subject_value: Subject
condition_type: invalid
condition_value: MyString
inverted: false
invalid_operator:
rule_set: invalid_operator
name: Rule with valid arguments
enabled: true
subject_type: Header
subject_value: Subject
condition_type: contain
condition_value: MyString
inverted: false

View file

@ -56,4 +56,34 @@ class RulesEvaluatorTest < ActiveSupport::TestCase
assert_equal expected, actual
end
test "invalid subject type" do
rules_evaluator = RulesEvaluator.new
email = Email.new
exception = assert_raise ArgumentError do
rules_evaluator.evaluate(email, rule_sets(:invalid_subject))
end
assert_match(/^Unrecognized subject type/, exception.message)
end
test "invalid condition type" do
rules_evaluator = RulesEvaluator.new
email = Email.new
exception = assert_raise ArgumentError do
rules_evaluator.evaluate(email, rule_sets(:invalid_condition_type))
end
assert_match(/^Unrecognized condition type/, exception.message)
end
test "invalid operator" do
rules_evaluator = RulesEvaluator.new
email = Email.new
exception = assert_raise ArgumentError do
rules_evaluator.evaluate(email, rule_sets(:invalid_operator))
end
assert_match(/^Unrecognized operator/, exception.message)
end
end

View file

@ -15,13 +15,16 @@ class ActiveSupport::TestCase
eml = file_fixture(file_fixture_name).read
mail = Mail.from_source(eml)
email_importer = EmailImporter.new
email = email_importer.import(mail)
email_importer.import(mail)
email
end
def email_from_eml_with_rules(file_fixture_name)
email = email_from_eml(file_fixture_name)
rules_evaluator = RulesEvaluator.new
email = rules_evaluator.evaluate(email, RuleSet.enabled)
RulesEvaluator.new.evaluate(email)
email
end
def assert_no_html(text)