diff --git a/src/Middleware/Push/Implementation/IdMiddleware.php b/src/Middleware/Push/Implementation/IdMiddleware.php new file mode 100644 index 00000000..cd086d96 --- /dev/null +++ b/src/Middleware/Push/Implementation/IdMiddleware.php @@ -0,0 +1,26 @@ +getMessage()->getMetadata(); + if (empty($meta[IdEnvelope::MESSAGE_ID_KEY])) { + $request = $request->withMessage(new IdEnvelope($request->getMessage(), uniqid('yii3-message-', true))); + } + + return $handler->handlePush($request); + } +} diff --git a/tests/Unit/Middleware/Push/Implementation/IdMiddlewareTest.php b/tests/Unit/Middleware/Push/Implementation/IdMiddlewareTest.php new file mode 100644 index 00000000..c2f72513 --- /dev/null +++ b/tests/Unit/Middleware/Push/Implementation/IdMiddlewareTest.php @@ -0,0 +1,55 @@ + 'test-id']); + $originalRequest = new PushRequest($message, null); + $handler = $this->createMock(MessageHandlerPushInterface::class); + + $handler->expects($this->once()) + ->method('handlePush') + ->willReturnArgument(0); + + $middleware = new IdMiddleware(); + $finalRequest = $middleware->processPush($originalRequest, $handler); + + $this->assertSame($originalRequest, $finalRequest); + $this->assertNotInstanceOf(IdEnvelope::class, $finalRequest->getMessage()); + $this->assertEquals('test-id', $finalRequest->getMessage()->getMetadata()[IdEnvelope::MESSAGE_ID_KEY]); + $this->assertSame($originalRequest->getMessage()->getData(), $finalRequest->getMessage()->getData()); + $this->assertSame($originalRequest->getMessage()->getHandlerName(), $finalRequest->getMessage()->getHandlerName()); + } + + public function testWithoutId(): void + { + $message = new Message('test', null); + $originalRequest = new PushRequest($message, null); + $handler = $this->createMock(MessageHandlerPushInterface::class); + + $handler->expects($this->once()) + ->method('handlePush') + ->willReturnArgument(0); + + $middleware = new IdMiddleware(); + $finalRequest = $middleware->processPush($originalRequest, $handler); + + $this->assertInstanceOf(IdEnvelope::class, $finalRequest->getMessage()); + $this->assertNotSame($originalRequest, $finalRequest); + $this->assertNotEmpty($finalRequest->getMessage()->getMetadata()[IdEnvelope::MESSAGE_ID_KEY] ?? null); + $this->assertSame($originalRequest->getMessage()->getData(), $finalRequest->getMessage()->getData()); + $this->assertSame($originalRequest->getMessage()->getHandlerName(), $finalRequest->getMessage()->getHandlerName()); + } +}