tests pour l'application des règles
This commit is contained in:
parent
dabf9ea36e
commit
5a89cf1692
|
@ -6,7 +6,7 @@ class InMailbox < ApplicationMailbox
|
||||||
|
|
||||||
email = email_importer.import(mail)
|
email = email_importer.import(mail)
|
||||||
|
|
||||||
email = rules_evaluator.evaluate(email)
|
email = rules_evaluator.evaluate(email, RuleSet.enabled)
|
||||||
|
|
||||||
repository.save(email)
|
repository.save(email)
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,20 +1,19 @@
|
||||||
class RulesEvaluator
|
class RulesEvaluator
|
||||||
|
|
||||||
def evaluate(email)
|
def evaluate(email, rule_set_or_sets)
|
||||||
RuleSet.enabled.each do |rule_set|
|
if rule_set_or_sets.respond_to? :each
|
||||||
if evaluate_rule_set(email, rule_set)
|
rule_set_or_sets.each do |rule_set|
|
||||||
rule_set.actions.enabled.each do |action|
|
email = evaluate_rule_set(email, rule_set)
|
||||||
klass = action.class_name.constantize
|
|
||||||
email = klass.new.process(email)
|
|
||||||
# rescue NameError => ex
|
|
||||||
# # TODO: log a warning
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
else
|
||||||
|
email = evaluate_rule_set(email, rule_set_or_sets)
|
||||||
end
|
end
|
||||||
|
|
||||||
email
|
email
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
def evaluate_rule_set(email, rule_set)
|
def evaluate_rule_set(email, rule_set)
|
||||||
rules_state = true
|
rules_state = true
|
||||||
|
|
||||||
|
@ -27,10 +26,17 @@ class RulesEvaluator
|
||||||
break unless rules_state
|
break unless rules_state
|
||||||
end
|
end
|
||||||
|
|
||||||
rules_state
|
if rules_state
|
||||||
end
|
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)
|
def prepare_subjects(email, rule)
|
||||||
case rule.subject_type.downcase
|
case rule.subject_type.downcase
|
||||||
|
@ -83,7 +89,7 @@ class RulesEvaluator
|
||||||
# subject.empty?
|
# subject.empty?
|
||||||
# }
|
# }
|
||||||
else
|
else
|
||||||
true
|
raise ArgumentError, "Unrecognized condition type '#{rule. condition_type}'"
|
||||||
end
|
end
|
||||||
|
|
||||||
def apply_operator(state, operator, result)
|
def apply_operator(state, operator, result)
|
||||||
|
@ -95,7 +101,7 @@ class RulesEvaluator
|
||||||
when "XOR"
|
when "XOR"
|
||||||
(state or result) and !(rules_state and result)
|
(state or result) and !(rules_state and result)
|
||||||
else
|
else
|
||||||
raise ArgumentError, "Unrecognized logic '#{rule_set.operator}'"
|
raise ArgumentError, "Unrecognized operator '#{operator}'"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
27
test/fixtures/rule_sets.yml
vendored
27
test/fixtures/rule_sets.yml
vendored
|
@ -1,19 +1,44 @@
|
||||||
# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
|
# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
|
||||||
|
|
||||||
one:
|
one:
|
||||||
|
name: Default RuleSet
|
||||||
|
description: MyText
|
||||||
|
enabled: true
|
||||||
|
operator: "AND"
|
||||||
|
inverted: false
|
||||||
|
|
||||||
|
and_rules:
|
||||||
name: Rules with AND
|
name: Rules with AND
|
||||||
description: MyText
|
description: MyText
|
||||||
enabled: true
|
enabled: true
|
||||||
operator: "AND"
|
operator: "AND"
|
||||||
inverted: false
|
inverted: false
|
||||||
|
|
||||||
two:
|
or_rules:
|
||||||
name: Rules with OR
|
name: Rules with OR
|
||||||
description: MyText
|
description: MyText
|
||||||
enabled: true
|
enabled: true
|
||||||
operator: "OR"
|
operator: "OR"
|
||||||
inverted: false
|
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:
|
metadata:
|
||||||
name: Metadata
|
name: Metadata
|
||||||
description: Add metadata to mail (servers, clients…)
|
description: Add metadata to mail (servers, clients…)
|
||||||
|
|
32
test/fixtures/rules.yml
vendored
32
test/fixtures/rules.yml
vendored
|
@ -13,9 +13,39 @@ one:
|
||||||
two:
|
two:
|
||||||
rule_set: two
|
rule_set: two
|
||||||
name: Subject doesn't contain MyString
|
name: Subject doesn't contain MyString
|
||||||
enabled: false
|
enabled: true
|
||||||
subject_type: Header
|
subject_type: Header
|
||||||
subject_value: Subject
|
subject_value: Subject
|
||||||
condition_type: contain
|
condition_type: contain
|
||||||
condition_value: MyString
|
condition_value: MyString
|
||||||
inverted: true
|
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
|
||||||
|
|
|
@ -56,4 +56,34 @@ class RulesEvaluatorTest < ActiveSupport::TestCase
|
||||||
assert_equal expected, actual
|
assert_equal expected, actual
|
||||||
end
|
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
|
end
|
||||||
|
|
|
@ -15,13 +15,16 @@ class ActiveSupport::TestCase
|
||||||
eml = file_fixture(file_fixture_name).read
|
eml = file_fixture(file_fixture_name).read
|
||||||
mail = Mail.from_source(eml)
|
mail = Mail.from_source(eml)
|
||||||
email_importer = EmailImporter.new
|
email_importer = EmailImporter.new
|
||||||
|
email = email_importer.import(mail)
|
||||||
|
|
||||||
email_importer.import(mail)
|
email
|
||||||
end
|
end
|
||||||
def email_from_eml_with_rules(file_fixture_name)
|
def email_from_eml_with_rules(file_fixture_name)
|
||||||
email = email_from_eml(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
|
end
|
||||||
|
|
||||||
def assert_no_html(text)
|
def assert_no_html(text)
|
||||||
|
|
Loading…
Reference in a new issue