From 5a89cf1692673dfabad69bc5382020c6489df012 Mon Sep 17 00:00:00 2001 From: Jeremy Lecour Date: Sun, 24 Jan 2021 17:49:35 +0100 Subject: [PATCH] =?UTF-8?q?tests=20pour=20l'application=20des=20r=C3=A8gle?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/mailboxes/in_mailbox.rb | 2 +- app/services/rules_evaluator.rb | 34 ++++++++++++++++----------- test/fixtures/rule_sets.yml | 27 ++++++++++++++++++++- test/fixtures/rules.yml | 32 ++++++++++++++++++++++++- test/services/rules_evaluator_test.rb | 30 +++++++++++++++++++++++ test/test_helper.rb | 7 ++++-- 6 files changed, 113 insertions(+), 19 deletions(-) diff --git a/app/mailboxes/in_mailbox.rb b/app/mailboxes/in_mailbox.rb index 5447a66..5d1558e 100644 --- a/app/mailboxes/in_mailbox.rb +++ b/app/mailboxes/in_mailbox.rb @@ -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 diff --git a/app/services/rules_evaluator.rb b/app/services/rules_evaluator.rb index e76019a..f39a21a 100644 --- a/app/services/rules_evaluator.rb +++ b/app/services/rules_evaluator.rb @@ -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 diff --git a/test/fixtures/rule_sets.yml b/test/fixtures/rule_sets.yml index 4418651..f113155 100644 --- a/test/fixtures/rule_sets.yml +++ b/test/fixtures/rule_sets.yml @@ -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…) diff --git a/test/fixtures/rules.yml b/test/fixtures/rules.yml index d39873e..920f8f8 100644 --- a/test/fixtures/rules.yml +++ b/test/fixtures/rules.yml @@ -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 diff --git a/test/services/rules_evaluator_test.rb b/test/services/rules_evaluator_test.rb index 3ded80d..8cad1f8 100644 --- a/test/services/rules_evaluator_test.rb +++ b/test/services/rules_evaluator_test.rb @@ -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 diff --git a/test/test_helper.rb b/test/test_helper.rb index efa589b..5a19009 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -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)