From a3e8bcbd655cd3a3f57d9996b6894a23c2d00202 Mon Sep 17 00:00:00 2001 From: Dan Date: Fri, 25 Nov 2022 11:07:31 -0500 Subject: [PATCH] Squashed 'SpiffWorkflow/' changes from 46f410a28..46d3de27f 46d3de27f Merge pull request #267 from sartography/feature/dmn_collect_policy 2d5ca32d5 Support for the "COLLECT" hit policy. * DecisionTable constructor now expects a third argument (the HitPolicy) * DMNParser now checks for a hitPolicy attribute, but defaults ot "UNIQUE" as Camunda doesn't put another in there if Unique is selected. * DecisionTable deserializer will default to a hitPolicy of "UNIQUE" if not value is in the Json. git-subtree-dir: SpiffWorkflow git-subtree-split: 46d3de27ffbcaf60025f09d1cf04fcc7ee98658a --- tests/SpiffWorkflow/dmn/DecisionRunner.py | 12 ++- tests/SpiffWorkflow/dmn/HitPolicyTest.py | 37 ++++++++++ tests/SpiffWorkflow/dmn/data/collect_hit.dmn | 78 ++++++++++++++++++++ tests/SpiffWorkflow/dmn/data/unique_hit.dmn | 54 ++++++++++++++ 4 files changed, 178 insertions(+), 3 deletions(-) create mode 100644 tests/SpiffWorkflow/dmn/HitPolicyTest.py create mode 100644 tests/SpiffWorkflow/dmn/data/collect_hit.dmn create mode 100644 tests/SpiffWorkflow/dmn/data/unique_hit.dmn diff --git a/tests/SpiffWorkflow/dmn/DecisionRunner.py b/tests/SpiffWorkflow/dmn/DecisionRunner.py index e69c5db8b..133f12922 100644 --- a/tests/SpiffWorkflow/dmn/DecisionRunner.py +++ b/tests/SpiffWorkflow/dmn/DecisionRunner.py @@ -41,11 +41,17 @@ class DecisionRunner: 'Exactly one decision table should exist! (%s)' \ % (len(decision.decisionTables)) - self.dmnEngine = DMNEngine(decision.decisionTables[0]) + self.decision_table = decision.decisionTables[0] + self.dmnEngine = DMNEngine(self.decision_table) def decide(self, context): - + """Makes the rather ugly assumption that there is only one + rule match for a decision - which was previously the case""" if not isinstance(context, dict): context = {'input': context} task = Task(self.script_engine, context) - return self.dmnEngine.decide(task) + return self.dmnEngine.decide(task)[0] + + def result(self, context): + task = Task(self.script_engine, context) + return self.dmnEngine.result(task) diff --git a/tests/SpiffWorkflow/dmn/HitPolicyTest.py b/tests/SpiffWorkflow/dmn/HitPolicyTest.py new file mode 100644 index 000000000..a7503732a --- /dev/null +++ b/tests/SpiffWorkflow/dmn/HitPolicyTest.py @@ -0,0 +1,37 @@ +import os +import unittest + +from SpiffWorkflow.dmn.engine.DMNEngine import DMNEngine +from SpiffWorkflow.dmn.parser.BpmnDmnParser import BpmnDmnParser +from tests.SpiffWorkflow.bpmn.BpmnWorkflowTestCase import BpmnWorkflowTestCase +from tests.SpiffWorkflow.dmn.DecisionRunner import DecisionRunner +from tests.SpiffWorkflow.dmn.python_engine.PythonDecisionRunner import \ + PythonDecisionRunner + + +class HitPolicyTest(BpmnWorkflowTestCase): + PARSER_CLASS = BpmnDmnParser + + def testHitPolicyUnique(self): + file_name = os.path.join(os.path.dirname(__file__), 'data', 'unique_hit.dmn') + runner = PythonDecisionRunner(file_name) + decision_table = runner.decision_table + self.assertEqual('UNIQUE', decision_table.hit_policy) + res = runner.result({'name': 'Larry'}) + self.assertEqual(1, res['result']) + + def testHitPolicyCollect(self): + file_name = os.path.join(os.path.dirname(__file__), 'data', 'collect_hit.dmn') + runner = PythonDecisionRunner(file_name) + decision_table = runner.decision_table + self.assertEqual('COLLECT', decision_table.hit_policy) + res = runner.result({'type': 'stooge'}) + self.assertEqual(4, len(res['name'])) + + +def suite(): + return unittest.TestLoader().loadTestsFromTestCase(HitPolicyTest) + + +if __name__ == '__main__': + unittest.TextTestRunner(verbosity=2).run(suite()) diff --git a/tests/SpiffWorkflow/dmn/data/collect_hit.dmn b/tests/SpiffWorkflow/dmn/data/collect_hit.dmn new file mode 100644 index 000000000..b918c3e52 --- /dev/null +++ b/tests/SpiffWorkflow/dmn/data/collect_hit.dmn @@ -0,0 +1,78 @@ + + + + + + + type + + + + + + + + "stooge" + + + 1 + + + "Larry" + + + + + + "stooge" + + + 2 + + + "Mo" + + + + + "stooge" + + + 3 + + + "Curly" + + + + + "stooge" + + + 4 + + + "Shemp" + + + + + "farmer" + + + 5 + + + "Elmer Fudd" + + + + + + + + + + + + diff --git a/tests/SpiffWorkflow/dmn/data/unique_hit.dmn b/tests/SpiffWorkflow/dmn/data/unique_hit.dmn new file mode 100644 index 000000000..f4d862646 --- /dev/null +++ b/tests/SpiffWorkflow/dmn/data/unique_hit.dmn @@ -0,0 +1,54 @@ + + + + + + + name + + + + + + + "Larry" + + + 1 + + + + + + "Mo" + + + 2 + + + + + "Curly" + + + 3 + + + + + "Shemp" + + + 4 + + + + + + + + + + + +