diff --git a/SpiffWorkflow/spiff/parser/task_spec.py b/SpiffWorkflow/spiff/parser/task_spec.py index d023a5353..6cc2ad750 100644 --- a/SpiffWorkflow/spiff/parser/task_spec.py +++ b/SpiffWorkflow/spiff/parser/task_spec.py @@ -41,12 +41,16 @@ def _parse_servicetask_operator(self, node): extra_ns = {'spiffworkflow': SPIFFWORKFLOW_MODEL_NS} xpath = xpath_eval(node, extra_ns) parameter_nodes = xpath('.//spiffworkflow:parameter') + operator = {'name': name} parameters = {} for param_node in parameter_nodes: - # TODO not handling type currently and check if required if 'value' in param_node.attrib: - parameters[param_node.attrib['id']] = param_node.attrib['value'] - return (name, parameters) + parameters[param_node.attrib['id']] = { + 'value': param_node.attrib['value'], + 'type': param_node.attrib['type'] + } + operator['parameters'] = parameters + return operator def create_task(self): # The main task parser already calls this, and even sets an attribute, but @@ -96,9 +100,10 @@ def create_task(self): class ServiceTaskParser(SpiffTaskParser): def create_task(self): extensions = self.parse_extensions() - (name, params) = extensions.get('serviceTaskOperator') + operator = extensions.get('serviceTaskOperator') return self.spec_class( - self.spec, self.get_task_spec_name(), name, params, + self.spec, self.get_task_spec_name(), + operator['name'], operator['parameters'], lane=self.lane, position=self.position) class BusinessRuleTaskParser(SpiffTaskParser): diff --git a/tests/SpiffWorkflow/spiff/BaseTestCase.py b/tests/SpiffWorkflow/spiff/BaseTestCase.py index 5a6876ec5..92c23eb17 100644 --- a/tests/SpiffWorkflow/spiff/BaseTestCase.py +++ b/tests/SpiffWorkflow/spiff/BaseTestCase.py @@ -2,10 +2,14 @@ import os from SpiffWorkflow.spiff.parser import SpiffBpmnParser -from SpiffWorkflow.spiff.serializer import NoneTaskConverter, ManualTaskConverter, UserTaskConverter, \ - SubWorkflowTaskConverter, TransactionSubprocessConverter, CallActivityTaskConverter, \ - StartEventConverter, EndEventConverter, BoundaryEventConverter, SendTaskConverter, ReceiveTaskConverter, \ - IntermediateCatchEventConverter, IntermediateThrowEventConverter +from SpiffWorkflow.spiff.serializer import NoneTaskConverter, \ + ManualTaskConverter, UserTaskConverter, \ + SubWorkflowTaskConverter, TransactionSubprocessConverter, \ + CallActivityTaskConverter, \ + StartEventConverter, EndEventConverter, BoundaryEventConverter, \ + SendTaskConverter, ReceiveTaskConverter, \ + IntermediateCatchEventConverter, IntermediateThrowEventConverter, \ + ServiceTaskConverter from SpiffWorkflow.dmn.serializer.task_spec_converters import BusinessRuleTaskConverter from SpiffWorkflow.bpmn.serializer import BpmnWorkflowSerializer @@ -15,7 +19,8 @@ NoneTaskConverter, ManualTaskConverter, UserTaskConverter, SubWorkflowTaskConverter, TransactionSubprocessConverter, CallActivityTaskConverter, StartEventConverter, EndEventConverter, BoundaryEventConverter, SendTaskConverter, ReceiveTaskConverter, - IntermediateCatchEventConverter, IntermediateThrowEventConverter, BusinessRuleTaskConverter + IntermediateCatchEventConverter, IntermediateThrowEventConverter, BusinessRuleTaskConverter, + ServiceTaskConverter ]) class BaseTestCase(BpmnWorkflowTestCase): diff --git a/tests/SpiffWorkflow/spiff/ServiceTaskTest.py b/tests/SpiffWorkflow/spiff/ServiceTaskTest.py index 1d2a772c7..b72e56dd3 100644 --- a/tests/SpiffWorkflow/spiff/ServiceTaskTest.py +++ b/tests/SpiffWorkflow/spiff/ServiceTaskTest.py @@ -17,9 +17,9 @@ class SlackWebhookOperator(object): def __init__(self, webhook_token="", message="", channel="", **kwargs): - self.channel = channel - self.message = message - self.webhook_token = webhook_token + self.channel = channel['value'] + self.message = message['value'] + self.webhook_token = webhook_token['value'] def execute(self): assertEqual(self.channel, "#") @@ -42,13 +42,22 @@ def setUp(self): spec, subprocesses = self.load_workflow_spec('service_task.bpmn', 'service_task_example1') - script_engine = ExampleCustomScriptEngine() - self.workflow = BpmnWorkflow(spec, subprocesses, script_engine=script_engine) + self.script_engine = ExampleCustomScriptEngine() + self.workflow = BpmnWorkflow(spec, subprocesses, script_engine=self.script_engine) def testRunThroughHappy(self): self.workflow.do_engine_steps() self.assertTrue(operatorExecuted) + def testRunThroughSaveRestore(self): + self.save_restore() + # Engine isn't preserved through save/restore, so we have to reset it. + self.workflow.script_engine = self.script_engine + self.workflow.do_engine_steps() + self.save_restore() + self.assertTrue(operatorExecuted) + + def suite(): return unittest.TestLoader().loadTestsFromTestCase(ServiceTaskTest) if __name__ == '__main__':