import operator from core.concept import Concept from core.rule import Rule from core.sheerka.services.SheerkaEvaluateRules import SheerkaEvaluateRules, LOW_PRIORITY_RULES, DISABLED_RULES from tests.TestUsingMemoryBasedSheerka import TestUsingMemoryBasedSheerka class TestSheerkaEvaluateRules(TestUsingMemoryBasedSheerka): def test_i_can_evaluate_python_rules(self): sheerka, context, r1, r2, r3, r4, r5, r6, r7, r8, r9 = self.init_test().with_rules( Rule(predicate="a == 1", action="", priority=1), # r1 Rule(predicate="a == 2", action="", priority=1), # r2 Rule(predicate="a == 3", action="", priority=0), # r3 Rule(predicate="a == 4", action="", priority=0), # r4 Rule(predicate="a == 5", action="", priority=0), # r5 Rule(predicate="a == 1", action="", priority=1), # r6 Rule(predicate="a == 7", action="", priority=1, is_enabled=False), # r7 Rule(predicate="a == 8", action="", priority=1), # r8 Rule(predicate="a == 9", action="", priority=2), # r9 ).unpack() service = sheerka.services[SheerkaEvaluateRules.NAME] rules = sorted([r1, r2, r3, r4, r5, r6, r7, r8, r9], key=operator.attrgetter('priority'), reverse=True) res = service.evaluate_rules(context, rules, {"a": 1}, set()) assert res == { True: [r1, r6], False: [r9, r2, r8], LOW_PRIORITY_RULES: [r3, r4, r5], DISABLED_RULES: [r7] } def test_i_can_evaluate_concept_rules(self): sheerka, context, concept, r1, r2, r3, r4, r5, r6, r7, r8, r9 = self.init_test().with_concepts( Concept("x equals y", body="x == y").def_var("x").def_var("y"), create_new=True).with_rules( Rule(predicate="a equals 1", action="", priority=1), # r1 Rule(predicate="a equals 2", action="", priority=1), # r2 Rule(predicate="a equals 3", action="", priority=0), # r3 Rule(predicate="a equals 4", action="", priority=0), # r4 Rule(predicate="a equals 5", action="", priority=0), # r5 Rule(predicate="a equals 1", action="", priority=1), # r6 Rule(predicate="a equals 7", action="", priority=1, is_enabled=False), # r7 Rule(predicate="a equals 8", action="", priority=1), # r8 Rule(predicate="a equals 9", action="", priority=2), # r9 ).unpack() service = sheerka.services[SheerkaEvaluateRules.NAME] rules = sorted([r1, r2, r3, r4, r5, r6, r7, r8, r9], key=operator.attrgetter('priority'), reverse=True) res = service.evaluate_rules(context, rules, {"a": 1}, set()) assert res == { True: [r1, r6], False: [r9, r2, r8], LOW_PRIORITY_RULES: [r3, r4, r5], DISABLED_RULES: [r7] } def test_i_can_disable_rules_at_runtime(self): sheerka, context, r1, r2, = self.init_format_rules( Rule(predicate="a == 1", action="", priority=2), # r1 Rule(predicate="a == 1", action="", priority=1), # r2 ) service = sheerka.services[SheerkaEvaluateRules.NAME] rules = sorted([r1, r2], key=operator.attrgetter('priority'), reverse=True) res = service.evaluate_rules(context, rules, {"a": 1}, {r1.id}) assert res == { True: [r2], DISABLED_RULES: [r1] }