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);
+ }
+}