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 = rules_evaluator.evaluate(email)
|
||||
email = rules_evaluator.evaluate(email, RuleSet.enabled)
|
||||
|
||||
repository.save(email)
|
||||
end
|
||||
|
|
|
@ -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
|
||||
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
|
||||
|
||||
|
|
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
|
||||
|
||||
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…)
|
||||
|
|
32
test/fixtures/rules.yml
vendored
32
test/fixtures/rules.yml
vendored
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue