Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,18 @@ public function testDecode()
$this->assertEquals('AL', $addresses[0]->getRegion()->getRegionCode());
}

public function testEncodeDecodeReadonlyMessage()
{
$message = new ReadonlyMessage(10, 'Test Message');

$encodedMessage = $this->encoder->encode('readonly.message.created', $message);
$decodedMessage = $this->encoder->decode('readonly.message.created', $encodedMessage);

$this->assertInstanceOf(ReadonlyMessage::class, $decodedMessage);
$this->assertSame(10, $decodedMessage->entityId);
$this->assertSame('Test Message', $decodedMessage->name);
}

/**
*/
public function testDecodeInvalidMessageFormat()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php
/**
* Copyright 2025 Adobe
* All Rights Reserved.
*/
declare(strict_types=1);

namespace Magento\Framework\MessageQueue;

/**
* Simple DTO used by message queue integration tests.
*/
class ReadonlyMessage
{
/**
* @param int $entityId
* @param string $name
*/
public function __construct(
public readonly int $entityId,
public readonly string $name
) {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,10 @@
'request' => \Magento\Catalog\Api\Data\ProductInterface::class,
'response' => null,
],
'readonly.message.created' => [
'request_type' => 'object_interface',
'request' => \Magento\Framework\MessageQueue\ReadonlyMessage::class,
'response' => null,
],
],
];
11 changes: 10 additions & 1 deletion lib/internal/Magento/Framework/MessageQueue/README.md
Original file line number Diff line number Diff line change
@@ -1 +1,10 @@
This component is designed to provide Message Queue Framework
This component is designed to provide Message Queue Framework.

## DTO serialization

Message payloads using `object_interface` topics are serialized through the Web API data processors.

- Getter methods define the payload fields; if a getter and a public property map to the same field, the getter wins.
- Public properties without getters are supported, including promoted/readonly properties, and are converted to
snake_case field names.
- Constructor hydration accepts both camelCase and snake_case keys to support promoted/readonly DTOs on decode.
Loading