Added first version of DebugManager. Implemented draft of the rule engine
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
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_format_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
|
||||
)
|
||||
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, r1, r2, r3, r4, r5, r6, r7, r8, r9 = self.init_format_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
|
||||
concepts=[Concept("x equals y", body="x == y").def_var("x").def_var("y")],
|
||||
)
|
||||
|
||||
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]
|
||||
}
|
||||
Reference in New Issue
Block a user