diff --git a/src/ProcessMaker/Nayra/Bpmn/Models/EventDefinitionBus.php b/src/ProcessMaker/Nayra/Bpmn/Models/EventDefinitionBus.php index 0da6076..831158e 100644 --- a/src/ProcessMaker/Nayra/Bpmn/Models/EventDefinitionBus.php +++ b/src/ProcessMaker/Nayra/Bpmn/Models/EventDefinitionBus.php @@ -65,7 +65,7 @@ public function registerCatchEvent(CatchEventInterface $catchEvent, EventDefinit $instances = $this->getInstancesFor($catchEvent); foreach ($instances as $instance) { $targetInstance = $sourceEventDefinition->getProperty('target_instance_id'); - if ($targetInstance && $instance->getKey() !== $targetInstance) { + if ($targetInstance && $instance->getId() !== $targetInstance) { continue; } $callable($eventDefinition, $instance, $token); diff --git a/src/ProcessMaker/Nayra/Bpmn/Models/MessageEventDefinition.php b/src/ProcessMaker/Nayra/Bpmn/Models/MessageEventDefinition.php index b85cff9..0bd387a 100644 --- a/src/ProcessMaker/Nayra/Bpmn/Models/MessageEventDefinition.php +++ b/src/ProcessMaker/Nayra/Bpmn/Models/MessageEventDefinition.php @@ -92,8 +92,13 @@ public function assertsRule(EventDefinitionInterface $event, FlowNodeInterface $ */ public function execute(EventDefinitionInterface $event, FlowNodeInterface $target, ExecutionInstanceInterface $instance = null, TokenInterface $token = null) { - $throwEvent = $token->getOwnerElement(); - $this->executeMessageMapping($throwEvent, $target, $instance, $token); + if ($token !== null) { + $throwEvent = $token->getOwnerElement(); + if ($throwEvent instanceof ThrowEventInterface && $target instanceof CatchEventInterface) { + $this->executeMessageMapping($throwEvent, $target, $instance, $token); + } + } + return $this; } diff --git a/tests/Feature/Patterns/PatternsTest.php b/tests/Feature/Patterns/PatternsTest.php index 28495a7..5c5efee 100644 --- a/tests/Feature/Patterns/PatternsTest.php +++ b/tests/Feature/Patterns/PatternsTest.php @@ -117,6 +117,7 @@ private function runProcess($filename, $data, $startEvent, $result, $events, $ou $dataStore->setData($data); // set global data storage $this->engine->setDataStore($dataStore); + $this->engine->loadBpmnDocument($bpmnRepository); // create instance with initial data if ($start->getEventDefinitions()->count() > 0) { $start->execute($start->getEventDefinitions()->item(0)); diff --git a/tests/Feature/Patterns/files/Message_target_catch_event_id.bpmn b/tests/Feature/Patterns/files/Message_target_catch_event_id.bpmn new file mode 100644 index 0000000..929c123 --- /dev/null +++ b/tests/Feature/Patterns/files/Message_target_catch_event_id.bpmn @@ -0,0 +1,121 @@ + + + + + node_34 + + + node_63 + + + node_34 + node_66 + + + + + + node_67 + node_63 + + + + + node_66 + node_67 + + + + + + + + + + + + + + node_19 + node_28 + + + node_19 + + + + node_28 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/Feature/Patterns/files/Message_target_catch_event_id.json b/tests/Feature/Patterns/files/Message_target_catch_event_id.json new file mode 100644 index 0000000..4972adb --- /dev/null +++ b/tests/Feature/Patterns/files/Message_target_catch_event_id.json @@ -0,0 +1,12 @@ +[ + { + "comment": "Message with target_catch_event_id", + "startEvent": "node_3", + "data": { + }, + "result": [ + ], + "output": { + } + } +] diff --git a/tests/Feature/Patterns/files/Message_target_instance_id.bpmn b/tests/Feature/Patterns/files/Message_target_instance_id.bpmn new file mode 100644 index 0000000..343bb9f --- /dev/null +++ b/tests/Feature/Patterns/files/Message_target_instance_id.bpmn @@ -0,0 +1,121 @@ + + + + + node_34 + + + node_63 + + + node_34 + node_66 + + + + + + node_67 + node_63 + + + + + node_66 + node_67 + + + + + + + + + + + + + + node_19 + node_28 + + + node_19 + + + + node_28 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/Feature/Patterns/files/Message_target_instance_id.json b/tests/Feature/Patterns/files/Message_target_instance_id.json new file mode 100644 index 0000000..d0d1f31 --- /dev/null +++ b/tests/Feature/Patterns/files/Message_target_instance_id.json @@ -0,0 +1,13 @@ +[ + { + "comment": "Message with matched target_instance_id but that does not matches the target instance id", + "startEvent": "node_3", + "data": { + }, + "result": [ + "node_8" + ], + "output": { + } + } +] diff --git a/tests/unit/ProcessMaker/Nayra/Bpmn/MessageEventDefinitionTest.php b/tests/unit/ProcessMaker/Nayra/Bpmn/MessageEventDefinitionTest.php new file mode 100644 index 0000000..e1ac734 --- /dev/null +++ b/tests/unit/ProcessMaker/Nayra/Bpmn/MessageEventDefinitionTest.php @@ -0,0 +1,112 @@ +setPayload($message); + + // Create a mock event definition + $event = $this->createMock(EventDefinitionInterface::class); + + // Create a mock target (catch event) + $target = $this->createMock(FlowNodeInterface::class); + + // Create a mock instance + $instance = $this->createMock(ExecutionInstanceInterface::class); + + // Execute with null token - should not throw an error + $result = $messageEventDef->execute($event, $target, $instance, null); + + // Assert that the method returns the instance + $this->assertSame($messageEventDef, $result); + } + + /** + * Test that execute method works correctly with a valid token + */ + public function testExecuteWithValidToken() + { + $messageEventDef = new MessageEventDefinition(); + $message = new Message(); + $messageEventDef->setPayload($message); + + // Create a mock event definition + $event = $this->createMock(EventDefinitionInterface::class); + + // Create a mock instance + $instance = $this->createMock(ExecutionInstanceInterface::class); + + // Create a mock token + $token = $this->createMock(\ProcessMaker\Nayra\Contracts\Bpmn\TokenInterface::class); + + // Mock getOwnerElement to return a throw event + $throwEvent = $this->createMock(\ProcessMaker\Nayra\Contracts\Bpmn\ThrowEventInterface::class); + $token->expects($this->once()) + ->method('getOwnerElement') + ->willReturn($throwEvent); + + // Mock getInstance to return an instance + $tokenInstance = $this->createMock(ExecutionInstanceInterface::class); + $token->expects($this->any()) + ->method('getInstance') + ->willReturn($tokenInstance); + + // Mock throw event methods + $throwEvent->expects($this->once()) + ->method('getDataInputAssociations') + ->willReturn(new Collection()); + + // Mock target as catch event + $catchEvent = $this->createMock(\ProcessMaker\Nayra\Contracts\Bpmn\CatchEventInterface::class); + $catchEvent->expects($this->once()) + ->method('getDataOutputAssociations') + ->willReturn(new Collection()); + + // Mock instance data store + $dataStore = $this->createMock(\ProcessMaker\Nayra\Contracts\Bpmn\DataStoreInterface::class); + $dataStore->expects($this->any()) + ->method('getData') + ->willReturn([]); + $instance->expects($this->any()) + ->method('getDataStore') + ->willReturn($dataStore); + + // Mock token instance data store + $tokenDataStore = $this->createMock(\ProcessMaker\Nayra\Contracts\Bpmn\DataStoreInterface::class); + $tokenDataStore->expects($this->any()) + ->method('getData') + ->willReturn([]); + $tokenInstance->expects($this->any()) + ->method('getDataStore') + ->willReturn($tokenDataStore); + + // Execute with valid token + $result = $messageEventDef->execute($event, $catchEvent, $instance, $token); + + // Assert that the method returns the instance + $this->assertSame($messageEventDef, $result); + } +}