From 7975cc32b6fade5243dec24e461f93718c108a36 Mon Sep 17 00:00:00 2001 From: Dmitrii Derepko Date: Fri, 12 Jan 2024 13:01:33 +0700 Subject: [PATCH 01/15] Adjust envelop changes --- src/Adapter.php | 58 +++++++++++++++++++-------------------- src/MessageSerializer.php | 3 +- src/QueueProvider.php | 1 + 3 files changed, 32 insertions(+), 30 deletions(-) diff --git a/src/Adapter.php b/src/Adapter.php index 589f017..c33263c 100644 --- a/src/Adapter.php +++ b/src/Adapter.php @@ -10,6 +10,7 @@ use Yiisoft\Queue\AMQP\Exception\NotImplementedException; use Yiisoft\Queue\Cli\LoopInterface; use Yiisoft\Queue\Enum\JobStatus; +use Yiisoft\Queue\Message\IdEnvelope; use Yiisoft\Queue\Message\MessageInterface; final class Adapter implements AdapterInterface @@ -23,33 +24,34 @@ public function __construct( public function withChannel(string $channel): self { - $instance = clone $this; - $instance->queueProvider = $this->queueProvider->withChannelName($channel); + $new = clone $this; + $new->queueProvider = $this->queueProvider->withChannelName($channel); - return $instance; + return $new; } /** - * @param callable(MessageInterface): bool $handlerCallback + * @param callable(MessageInterface): bool $handlerCallback */ public function runExisting(callable $handlerCallback): void { $channel = $this->queueProvider->getChannel(); - (new ExistingMessagesConsumer($channel, $this->queueProvider - ->getQueueSettings() - ->getName(), $this->serializer)) - ->consume($handlerCallback); + $queueName = $this->queueProvider->getQueueSettings()->getName(); + $consumer = new ExistingMessagesConsumer( + $channel, + $queueName, + $this->serializer + ); + + $consumer->consume($handlerCallback); } - /** - * @return never - */ - public function status(string $id): JobStatus + public function status(string|int $id): JobStatus { throw new NotImplementedException('Status check is not supported by the adapter ' . self::class . '.'); } - public function push(MessageInterface $message): void + public function push(MessageInterface $message): MessageInterface { $payload = $this->serializer->serialize($message); $amqpMessage = new AMQPMessage( @@ -57,30 +59,28 @@ public function push(MessageInterface $message): void array_merge(['message_id' => uniqid(more_entropy: true)], $this->queueProvider->getMessageProperties()) ); $exchangeSettings = $this->queueProvider->getExchangeSettings(); - $this->queueProvider - ->getChannel() - ->basic_publish( - $amqpMessage, - $exchangeSettings?->getName() ?? '', - $exchangeSettings ? '' : $this->queueProvider - ->getQueueSettings() - ->getName() - ); + $channel = $this->queueProvider->getChannel(); + $channel->basic_publish( + $amqpMessage, + $exchangeSettings?->getName() ?? '', + $exchangeSettings ? '' : $this->queueProvider + ->getQueueSettings() + ->getName() + ); /** @var string $messageId */ $messageId = $amqpMessage->get('message_id'); - $message->setId($messageId); + + return new IdEnvelope($message, $messageId); } public function subscribe(callable $handlerCallback): void { $channel = $this->queueProvider->getChannel(); + $queueName = $this->queueProvider->getQueueSettings()->getName(); + $channel->basic_consume( - $this->queueProvider - ->getQueueSettings() - ->getName(), - $this->queueProvider - ->getQueueSettings() - ->getName(), + $queueName, + $queueName, false, false, false, diff --git a/src/MessageSerializer.php b/src/MessageSerializer.php index 9afc07e..e91de5a 100644 --- a/src/MessageSerializer.php +++ b/src/MessageSerializer.php @@ -7,6 +7,7 @@ use InvalidArgumentException; use JsonException; use Yiisoft\Queue\AMQP\Exception\NoKeyInPayloadException; +use Yiisoft\Queue\Message\IdEnvelope; use Yiisoft\Queue\Message\Message; use Yiisoft\Queue\Message\MessageInterface; @@ -18,7 +19,7 @@ class MessageSerializer implements MessageSerializerInterface public function serialize(MessageInterface $message): string { $payload = [ - 'id' => $message->getId(), + 'id' => $message->getMetadata()[IdEnvelope::MESSAGE_ID_KEY] ?? null, 'name' => $message->getHandlerName(), 'data' => $message->getData(), 'meta' => $message->getMetadata(), diff --git a/src/QueueProvider.php b/src/QueueProvider.php index 54bf096..2d64060 100644 --- a/src/QueueProvider.php +++ b/src/QueueProvider.php @@ -31,6 +31,7 @@ public function __construct( public function __destruct() { $this->channel?->close(); + unset($this->channel); } public function getChannel(): AMQPChannel From 04ff42933cc2d23b85e83becede8e6818cdebe01 Mon Sep 17 00:00:00 2001 From: Dmitrii Derepko Date: Fri, 12 Jan 2024 13:01:48 +0700 Subject: [PATCH 02/15] Set channels and exchanges not auto-deletable --- src/Settings/Exchange.php | 2 +- src/Settings/Queue.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Settings/Exchange.php b/src/Settings/Exchange.php index 53e54d8..25935de 100644 --- a/src/Settings/Exchange.php +++ b/src/Settings/Exchange.php @@ -14,7 +14,7 @@ public function __construct( private string $type = AMQPExchangeType::DIRECT, private bool $passive = false, private bool $durable = false, - private bool $autoDelete = true, + private bool $autoDelete = false, private bool $internal = false, private bool $nowait = false, private AMQPTable|array $arguments = [], diff --git a/src/Settings/Queue.php b/src/Settings/Queue.php index 69cb206..6df4bb8 100644 --- a/src/Settings/Queue.php +++ b/src/Settings/Queue.php @@ -14,7 +14,7 @@ public function __construct( private bool $passive = false, private bool $durable = false, private bool $exclusive = false, - private bool $autoDelete = true, + private bool $autoDelete = false, private bool $nowait = false, private AMQPTable|array $arguments = [], private ?int $ticket = null From eb1153fe312644be657064ebbd94cebfe4962fa9 Mon Sep 17 00:00:00 2001 From: Dmitrii Derepko Date: Fri, 12 Jan 2024 13:02:29 +0700 Subject: [PATCH 03/15] Adjust envelop changes --- tests/Support/FakeAdapter.php | 4 ++-- tests/Support/FileHelper.php | 18 +++++++++++++++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/tests/Support/FakeAdapter.php b/tests/Support/FakeAdapter.php index ddbbe15..3f0f7ee 100644 --- a/tests/Support/FakeAdapter.php +++ b/tests/Support/FakeAdapter.php @@ -25,12 +25,12 @@ public function runExisting(callable $handlerCallback): void // TODO: Implement runExisting() method. } - public function status(string $id): JobStatus + public function status(string|int $id): JobStatus { // TODO: Implement status() method. } - public function push(MessageInterface $message): void + public function push(MessageInterface $message): MessageInterface { // TODO: Implement push() method. } diff --git a/tests/Support/FileHelper.php b/tests/Support/FileHelper.php index beff8b2..d1674a2 100644 --- a/tests/Support/FileHelper.php +++ b/tests/Support/FileHelper.php @@ -14,8 +14,15 @@ final class FileHelper */ public function put(string $fileName, int|string $data): void { - if (file_put_contents("{$this->getRuntimeDir()}/$fileName", $data) === false) { - throw new RuntimeException("Runtime dir {$this->getRuntimeDir()} or file $fileName are not writable."); + $path = $this->getRuntimeDir() . DIRECTORY_SEPARATOR . $fileName; + if (file_put_contents($path, $data) === false) { + throw new RuntimeException( + sprintf( + 'Runtime dir %"s" or file "%s" are not writable.', + $this->getRuntimeDir(), + $fileName + ) + ); } } @@ -28,7 +35,12 @@ public function get(string $filename): ?string $result = file_get_contents($path); if ($result === false) { - throw new RuntimeException("File '$path' exists but is not readable."); + throw new RuntimeException( + sprintf( + 'File "%s" exists but is not readable.', + $path + ) + ); } return $result; From ebca70ec17278c7b5753cb5918f5bb5d7b34b02c Mon Sep 17 00:00:00 2001 From: Dmitrii Derepko Date: Fri, 12 Jan 2024 13:02:47 +0700 Subject: [PATCH 04/15] Add management plugin --- tests/docker-compose.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/docker-compose.yml b/tests/docker-compose.yml index 18aebec..3a56465 100644 --- a/tests/docker-compose.yml +++ b/tests/docker-compose.yml @@ -44,9 +44,12 @@ services: PHP_VERSION: '8.2' rabbitmq: - image: rabbitmq:3-alpine + image: rabbitmq:3-management healthcheck: test: rabbitmq-diagnostics check_port_connectivity interval: 3s timeout: 5s retries: 3 + ports: + - 5672:5672 + - 5673:15672 From 150486df111d2fddfd995b93798fa66fdf5d86d0 Mon Sep 17 00:00:00 2001 From: Dmitrii Derepko Date: Fri, 12 Jan 2024 13:03:22 +0700 Subject: [PATCH 05/15] Rename vars --- src/Middleware/DelayMiddleware.php | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/Middleware/DelayMiddleware.php b/src/Middleware/DelayMiddleware.php index c1eb0a7..b48d50f 100644 --- a/src/Middleware/DelayMiddleware.php +++ b/src/Middleware/DelayMiddleware.php @@ -43,20 +43,27 @@ public function processPush(PushRequest $request, MessageHandlerPushInterface $h { $adapter = $request->getAdapter(); if (!$adapter instanceof Adapter) { - $type = get_debug_type($adapter); - $class = Adapter::class; throw new InvalidArgumentException( - "This middleware works only with the $class. $type given." + sprintf( + 'This middleware works only with the %s. %s given.', + Adapter::class, + get_debug_type($adapter) + ) ); } $queueProvider = $adapter->getQueueProvider(); - $exchangeSettings = $this->getExchangeSettings($queueProvider->getExchangeSettings()); - $queueSettings = $this->getQueueSettings($queueProvider->getQueueSettings(), $queueProvider->getExchangeSettings()); + $originalExchangeSettings = $queueProvider->getExchangeSettings(); + $delayedExchangeSettings = $this->getExchangeSettings($originalExchangeSettings); + $queueSettings = $this->getQueueSettings( + $queueProvider->getQueueSettings(), + $originalExchangeSettings + ); + $adapter = $adapter->withQueueProvider( $queueProvider ->withMessageProperties($this->getMessageProperties($queueProvider)) - ->withExchangeSettings($exchangeSettings) + ->withExchangeSettings($delayedExchangeSettings) ->withQueueSettings($queueSettings) ); From 662879c97642c3bcb5530d16f88f767cdcf47a88 Mon Sep 17 00:00:00 2001 From: Dmitrii Derepko Date: Sun, 14 Jan 2024 16:17:35 +0700 Subject: [PATCH 06/15] Adjust changes --- src/Adapter.php | 1 + src/Exception/NoKeyInPayloadException.php | 54 --------- src/ExistingMessagesConsumer.php | 1 + src/MessageSerializer.php | 65 ----------- src/MessageSerializerInterface.php | 14 --- src/Middleware/DelayMiddleware.php | 2 +- src/QueueProvider.php | 2 +- tests/Integration/DelayMiddlewareTest.php | 9 +- tests/Support/MainTestCase.php | 8 +- tests/Unit/ExchangeSettingsTest.php | 5 +- tests/Unit/FriendlyExceptionTest.php | 29 ----- tests/Unit/MessageSerializerTest.php | 134 ---------------------- tests/Unit/QueueProviderTest.php | 7 +- tests/Unit/QueueSettingsTest.php | 9 +- tests/Unit/QueueTest.php | 19 +-- tests/Unit/UnitTestCase.php | 5 +- tests/yii | 3 +- 17 files changed, 40 insertions(+), 327 deletions(-) delete mode 100644 src/Exception/NoKeyInPayloadException.php delete mode 100644 src/MessageSerializer.php delete mode 100644 src/MessageSerializerInterface.php delete mode 100644 tests/Unit/FriendlyExceptionTest.php delete mode 100644 tests/Unit/MessageSerializerTest.php diff --git a/src/Adapter.php b/src/Adapter.php index c33263c..772f675 100644 --- a/src/Adapter.php +++ b/src/Adapter.php @@ -12,6 +12,7 @@ use Yiisoft\Queue\Enum\JobStatus; use Yiisoft\Queue\Message\IdEnvelope; use Yiisoft\Queue\Message\MessageInterface; +use Yiisoft\Queue\Message\MessageSerializerInterface; final class Adapter implements AdapterInterface { diff --git a/src/Exception/NoKeyInPayloadException.php b/src/Exception/NoKeyInPayloadException.php deleted file mode 100644 index 79ec038..0000000 --- a/src/Exception/NoKeyInPayloadException.php +++ /dev/null @@ -1,54 +0,0 @@ -expectedKey . '" in payload'; - } - - /** - * @return string - * - * @infection-ignore-all - */ - public function getSolution(): ?string - { - return sprintf( - "We have successfully unserialized a message, but there was no expected key \"%s\". - There are the following keys in the message: %s. - You might want to change message's structure, or make your own implementation of %s, - which won't rely on this key in the message.", - $this->expectedKey, - implode(', ', array_keys($this->payload)), - MessageSerializerInterface::class - ); - } -} diff --git a/src/ExistingMessagesConsumer.php b/src/ExistingMessagesConsumer.php index 4e030eb..f01f97a 100644 --- a/src/ExistingMessagesConsumer.php +++ b/src/ExistingMessagesConsumer.php @@ -8,6 +8,7 @@ use PhpAmqpLib\Message\AMQPMessage; use Throwable; use Yiisoft\Queue\Message\MessageInterface; +use Yiisoft\Queue\Message\MessageSerializerInterface; /** * @internal diff --git a/src/MessageSerializer.php b/src/MessageSerializer.php deleted file mode 100644 index e91de5a..0000000 --- a/src/MessageSerializer.php +++ /dev/null @@ -1,65 +0,0 @@ - $message->getMetadata()[IdEnvelope::MESSAGE_ID_KEY] ?? null, - 'name' => $message->getHandlerName(), - 'data' => $message->getData(), - 'meta' => $message->getMetadata(), - ]; - - return json_encode($payload, JSON_THROW_ON_ERROR); - } - - /** - * @throws JsonException - * @throws NoKeyInPayloadException - * @throws InvalidArgumentException - */ - public function unserialize(string $value): Message - { - $payload = json_decode($value, true, 512, JSON_THROW_ON_ERROR); - if (!is_array($payload)) { - throw new InvalidArgumentException('Payload must be array. Got ' . get_debug_type($payload) . '.'); - } - - $name = $payload['name'] ?? null; - if (!is_string($name)) { - throw new NoKeyInPayloadException('name', $payload); - } - - $id = $payload['id'] ?? null; - if ($id !== null && !is_string($id)) { - throw new NoKeyInPayloadException('id', $payload); - } - - $meta = $payload['meta'] ?? []; - if (!is_array($meta)) { - throw new NoKeyInPayloadException('meta', $payload); - } - - return new Message( - $name, - $payload['data'] ?? null, - $meta, - $id, - ); - } -} diff --git a/src/MessageSerializerInterface.php b/src/MessageSerializerInterface.php deleted file mode 100644 index 4d84521..0000000 --- a/src/MessageSerializerInterface.php +++ /dev/null @@ -1,14 +0,0 @@ -withName("{$exchangeSettings->getName()}.dlx") - ->withAutoDelete(true) + ->withAutoDelete(false) ->withType(AMQPExchangeType::TOPIC); } } diff --git a/src/QueueProvider.php b/src/QueueProvider.php index 2d64060..ae50b8b 100644 --- a/src/QueueProvider.php +++ b/src/QueueProvider.php @@ -31,7 +31,7 @@ public function __construct( public function __destruct() { $this->channel?->close(); - unset($this->channel); + //unset($this->channel); } public function getChannel(): AMQPChannel diff --git a/tests/Integration/DelayMiddlewareTest.php b/tests/Integration/DelayMiddlewareTest.php index 2d4003e..45a1209 100644 --- a/tests/Integration/DelayMiddlewareTest.php +++ b/tests/Integration/DelayMiddlewareTest.php @@ -9,7 +9,7 @@ use Psr\Log\LoggerInterface; use Yiisoft\Queue\Adapter\AdapterInterface; use Yiisoft\Queue\AMQP\Adapter; -use Yiisoft\Queue\AMQP\MessageSerializer; + use Yiisoft\Queue\AMQP\Middleware\DelayMiddleware; use Yiisoft\Queue\AMQP\QueueProvider; use Yiisoft\Queue\AMQP\Settings\Queue as QueueSettings; @@ -18,6 +18,7 @@ use Yiisoft\Queue\AMQP\Tests\Support\SimpleMessageHandler; use Yiisoft\Queue\Cli\LoopInterface; use Yiisoft\Queue\Cli\SignalLoop; +use Yiisoft\Queue\Message\JsonMessageSerializer; use Yiisoft\Queue\Message\Message; use Yiisoft\Queue\Middleware\CallableFactory; use Yiisoft\Queue\Middleware\Push\MiddlewareFactoryPush; @@ -44,7 +45,7 @@ public function testMainFlow(): void $this->createConnection(), new QueueSettings(), ), - new MessageSerializer(), + new JsonMessageSerializer(), new SignalLoop(), ); $queue = $this->makeQueue($adapter); @@ -75,7 +76,7 @@ public function testMainFlowWithFakeAdapter(): void $this->createConnection(), new QueueSettings(), ), - new MessageSerializer(), + new JsonMessageSerializer(), new SignalLoop(), ); $queue = $this->makeQueue($adapter); @@ -83,7 +84,7 @@ public function testMainFlowWithFakeAdapter(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage("This middleware works only with the $adapterClass. $fakeAdapterClass given."); $queue->push( - new Message('simple', 'test-delay-middleware-main'), + new Message(SimpleMessageHandler::class, 'test-delay-middleware-main'), new DelayMiddleware(3), ); } diff --git a/tests/Support/MainTestCase.php b/tests/Support/MainTestCase.php index 66a9f16..030f1ae 100644 --- a/tests/Support/MainTestCase.php +++ b/tests/Support/MainTestCase.php @@ -15,10 +15,10 @@ abstract class MainTestCase extends TestCase protected function createConnection(): AMQPStreamConnection { return new AMQPStreamConnection( - getenv('RABBITMQ_HOST'), - getenv('RABBITMQ_PORT'), - getenv('RABBITMQ_USER'), - getenv('RABBITMQ_PASSWORD') + getenv('RABBITMQ_HOST') ?: '127.0.0.1', + getenv('RABBITMQ_PORT') ?: 5672, + getenv('RABBITMQ_USER') ?: 'guest', + getenv('RABBITMQ_PASSWORD') ?: 'guest', ); } diff --git a/tests/Unit/ExchangeSettingsTest.php b/tests/Unit/ExchangeSettingsTest.php index 5d16634..879dd19 100644 --- a/tests/Unit/ExchangeSettingsTest.php +++ b/tests/Unit/ExchangeSettingsTest.php @@ -7,10 +7,11 @@ use PhpAmqpLib\Exchange\AMQPExchangeType; use PhpAmqpLib\Wire\AMQPTable; use Yiisoft\Queue\AMQP\Adapter; -use Yiisoft\Queue\AMQP\MessageSerializer; + use Yiisoft\Queue\AMQP\QueueProvider; use Yiisoft\Queue\AMQP\Settings\Exchange as ExchangeSettings; use Yiisoft\Queue\AMQP\Settings\Queue as QueueSettings; +use Yiisoft\Queue\Message\JsonMessageSerializer; final class ExchangeSettingsTest extends UnitTestCase { @@ -38,7 +39,7 @@ public function testCommonSettings(): void ]) ) ), - new MessageSerializer(), + new JsonMessageSerializer(), $this->getLoop(), ); $exchangeSettings = $adapter->getQueueProvider()->getExchangeSettings(); diff --git a/tests/Unit/FriendlyExceptionTest.php b/tests/Unit/FriendlyExceptionTest.php deleted file mode 100644 index 6e14fab..0000000 --- a/tests/Unit/FriendlyExceptionTest.php +++ /dev/null @@ -1,29 +0,0 @@ -getName()); - $this->assertMatchesRegularExpression('/test/', $exception->getSolution()); - } - - public function testExchangeDeclaredException(): void - { - $exception = new ExchangeDeclaredException(); - - self::assertSame('Exchange is declared', $exception->getName()); - } -} diff --git a/tests/Unit/MessageSerializerTest.php b/tests/Unit/MessageSerializerTest.php deleted file mode 100644 index 8a2c9a0..0000000 --- a/tests/Unit/MessageSerializerTest.php +++ /dev/null @@ -1,134 +0,0 @@ -createConnection() - ->channel(); - $channel->queue_declare($queue); - $channel->exchange_declare($exchange, AMQPExchangeType::DIRECT); - $channel->queue_bind($queue, $exchange); - $channel->basic_publish($message, $exchange); - } - - /** - * @throws Exception - */ - private function getCustomAdapter(string $queueExchangeName): Adapter - { - $queueProvider = new QueueProvider( - $this->createConnection(), - $this->getQueueSettings(), - ); - return new Adapter( - $queueProvider - ->withQueueSettings(new QueueSettings($queueExchangeName)) - ->withExchangeSettings(new ExchangeSettings($queueExchangeName)), - new MessageSerializer(), - $this->getLoop(), - ); - } - - public function testNoKeyInPayloadExceptionName(): void - { - $queueExchangeName = 'yii-test-no-key-in-payload-exception-name'; - $this->publishWithAMQPLib( - $queueExchangeName, - $queueExchangeName, - new AMQPMessage( - json_encode(['test'], JSON_THROW_ON_ERROR), - ['content_type' => 'text/json', 'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT] - ) - ); - - $this->expectException(NoKeyInPayloadException::class); - $this - ->getQueue() - ->withAdapter($this->getCustomAdapter($queueExchangeName)) - ->run(); - } - - public function testNoKeyInPayloadExceptionId(): void - { - $queueExchangeName = 'yii-test-no-key-in-payload-exception-id'; - $this->publishWithAMQPLib( - $queueExchangeName, - $queueExchangeName, - new AMQPMessage( - json_encode(['name' => 'ext-simple', 'id' => 1], JSON_THROW_ON_ERROR), - ['content_type' => 'text/json', 'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT] - ) - ); - - $this->expectException(NoKeyInPayloadException::class); - $this->expectExceptionMessage("No expected key 'id' in payload. Payload's keys list: name, id."); - $this - ->getQueue() - ->withAdapter($this->getCustomAdapter($queueExchangeName)) - ->run(); - } - - public function testNoKeyInPayloadExceptionMeta(): void - { - $queueExchangeName = 'yii-test-no-key-in-payload-exception-meta'; - $this->publishWithAMQPLib( - $queueExchangeName, - $queueExchangeName, - new AMQPMessage( - json_encode(['name' => 'ext-simple', 'meta' => ''], JSON_THROW_ON_ERROR), - ['content_type' => 'text/json', 'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT] - ) - ); - - $this->expectException(NoKeyInPayloadException::class); - $this->expectExceptionMessage("No expected key 'meta' in payload. Payload's keys list: name, meta."); - $this - ->getQueue() - ->withAdapter($this->getCustomAdapter($queueExchangeName)) - ->run(); - } - - public function testInvalidArgumentException(): void - { - $queueExchangeName = 'yii-test-invalid-argument-exception'; - $this->publishWithAMQPLib( - $queueExchangeName, - $queueExchangeName, - new AMQPMessage( - json_encode('test', JSON_THROW_ON_ERROR), - ['content_type' => 'text/json', 'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT] - ) - ); - - $this->expectException(InvalidArgumentException::class); - $this - ->getQueue() - ->withAdapter($this->getCustomAdapter($queueExchangeName)) - ->run(); - } -} diff --git a/tests/Unit/QueueProviderTest.php b/tests/Unit/QueueProviderTest.php index 897f257..da9584c 100644 --- a/tests/Unit/QueueProviderTest.php +++ b/tests/Unit/QueueProviderTest.php @@ -6,13 +6,14 @@ use Yiisoft\Queue\AMQP\Adapter; use Yiisoft\Queue\AMQP\Exception\ExchangeDeclaredException; -use Yiisoft\Queue\AMQP\MessageSerializer; + use Yiisoft\Queue\AMQP\QueueProvider; use Yiisoft\Queue\AMQP\Settings\Exchange as ExchangeSettings; use Yiisoft\Queue\AMQP\Settings\ExchangeSettingsInterface; use Yiisoft\Queue\AMQP\Settings\Queue as QueueSettings; use Yiisoft\Queue\AMQP\Settings\QueueSettingsInterface; use Yiisoft\Queue\AMQP\Tests\Support\FileHelper; +use Yiisoft\Queue\Message\JsonMessageSerializer; use Yiisoft\Queue\Message\Message; final class QueueProviderTest extends UnitTestCase @@ -34,7 +35,7 @@ public function testWithQueueAndExchangeSettings(): void ->withExchangeSettings( new ExchangeSettings($this->exchangeName) ), - new MessageSerializer(), + new JsonMessageSerializer(), $this->getLoop(), ); @@ -81,7 +82,7 @@ public function testWithChannelNameExchangeDeclaredException(): void new ExchangeSettings('yii-queue-test-with-channel-name') ) ->withChannelName('yii-queue-test-channel-name'), - new MessageSerializer(), + new JsonMessageSerializer(), $this->getLoop(), ); } diff --git a/tests/Unit/QueueSettingsTest.php b/tests/Unit/QueueSettingsTest.php index 446e6db..ed61cf3 100644 --- a/tests/Unit/QueueSettingsTest.php +++ b/tests/Unit/QueueSettingsTest.php @@ -7,10 +7,11 @@ use PhpAmqpLib\Exception\AMQPProtocolChannelException; use PhpAmqpLib\Wire\AMQPTable; use Yiisoft\Queue\AMQP\Adapter; -use Yiisoft\Queue\AMQP\MessageSerializer; + use Yiisoft\Queue\AMQP\QueueProvider; use Yiisoft\Queue\AMQP\Settings\Exchange as ExchangeSettings; use Yiisoft\Queue\AMQP\Settings\Queue as QueueSettings; +use Yiisoft\Queue\Message\JsonMessageSerializer; use Yiisoft\Queue\Message\Message; final class QueueSettingsTest extends UnitTestCase @@ -40,7 +41,7 @@ public function testCommonSettings(): void ->withExchangeSettings( new ExchangeSettings('yii-queue-test-queue-common-settings') ), - new MessageSerializer(), + new JsonMessageSerializer(), $this->getLoop(), ); @@ -49,7 +50,7 @@ public function testCommonSettings(): void self::assertTrue($queueSettings->isDurable()); self::assertTrue($queueSettings->isPassive()); self::assertTrue($queueSettings->isExclusive()); - self::assertTrue($queueSettings->isAutoDeletable()); + self::assertFalse($queueSettings->isAutoDeletable()); self::assertTrue($queueSettings->hasNowait()); self::assertNull($queueSettings->getTicket()); @@ -85,7 +86,7 @@ public function testArgumentsXExpires(): void ->withExchangeSettings( new ExchangeSettings('yii-queue-test-queue-settings-arg') ), - new MessageSerializer(), + new JsonMessageSerializer(), $this->getLoop(), ); diff --git a/tests/Unit/QueueTest.php b/tests/Unit/QueueTest.php index 84f1619..c24a134 100644 --- a/tests/Unit/QueueTest.php +++ b/tests/Unit/QueueTest.php @@ -8,8 +8,6 @@ use Yiisoft\Queue\Adapter\AdapterInterface; use Yiisoft\Queue\AMQP\Adapter; use Yiisoft\Queue\AMQP\Exception\NotImplementedException; -use Yiisoft\Queue\AMQP\MessageSerializer; -use Yiisoft\Queue\AMQP\MessageSerializerInterface; use Yiisoft\Queue\AMQP\QueueProvider; use Yiisoft\Queue\AMQP\QueueProviderInterface; use Yiisoft\Queue\AMQP\Settings\Exchange as ExchangeSettings; @@ -17,7 +15,10 @@ use Yiisoft\Queue\AMQP\Tests\Support\FileHelper; use Yiisoft\Queue\Cli\LoopInterface; use Yiisoft\Queue\Exception\JobFailureException; +use Yiisoft\Queue\Message\IdEnvelope; +use Yiisoft\Queue\Message\JsonMessageSerializer; use Yiisoft\Queue\Message\Message; +use Yiisoft\Queue\Message\MessageSerializerInterface; use Yiisoft\Queue\Queue; final class QueueTest extends UnitTestCase @@ -34,10 +35,11 @@ public function testStatus(): void $queue = $this->getDefaultQueue($adapter); - $message = new Message('ext-simple', null); - $queue->push( - $message, + $message = new IdEnvelope( + new Message('ext-simple', null), + 'test-id', ); + $queue->push($message); $this->expectException(NotImplementedException::class); $this->expectExceptionMessage("Status check is not supported by the adapter $adapterClass."); @@ -84,7 +86,7 @@ public function testListenWithException(): void $queueProvider ->withQueueSettings(new QueueSettings($this->queueName)) ->withExchangeSettings(new ExchangeSettings($this->exchangeName)), - new MessageSerializer(), + new JsonMessageSerializer(), $this->getLoop(), ); $queue = $this->getDefaultQueue($adapter); @@ -110,9 +112,8 @@ public function testListen(): void $this->getQueueSettings(), ); $adapter = new Adapter( - $queueProvider - ->withChannelName('yii-queue'), - new MessageSerializer(), + $queueProvider->withChannelName('yii-queue'), + new JsonMessageSerializer(), $mockLoop, ); $queue = $this->getDefaultQueue($adapter); diff --git a/tests/Unit/UnitTestCase.php b/tests/Unit/UnitTestCase.php index 2f119c5..e617ab6 100644 --- a/tests/Unit/UnitTestCase.php +++ b/tests/Unit/UnitTestCase.php @@ -10,7 +10,7 @@ use Yiisoft\Injector\Injector; use Yiisoft\Queue\Adapter\AdapterInterface; use Yiisoft\Queue\AMQP\Adapter; -use Yiisoft\Queue\AMQP\MessageSerializer; + use Yiisoft\Queue\AMQP\QueueProvider; use Yiisoft\Queue\AMQP\Settings\Queue as QueueSettings; use Yiisoft\Queue\AMQP\Tests\Support\ExtendedSimpleMessageHandler; @@ -18,6 +18,7 @@ use Yiisoft\Queue\AMQP\Tests\Support\MainTestCase; use Yiisoft\Queue\Cli\LoopInterface; use Yiisoft\Queue\Cli\SignalLoop; +use Yiisoft\Queue\Message\JsonMessageSerializer; use Yiisoft\Queue\Message\MessageInterface; use Yiisoft\Queue\Middleware\CallableFactory; use Yiisoft\Queue\Middleware\Consume\ConsumeMiddlewareDispatcher; @@ -134,7 +135,7 @@ protected function getAdapter(): AdapterInterface { return $this->adapter ??= new Adapter( $this->getQueueProvider(), - new MessageSerializer(), + new JsonMessageSerializer(), $this->getLoop(), ); } diff --git a/tests/yii b/tests/yii index 7ae7c3e..6918a2b 100755 --- a/tests/yii +++ b/tests/yii @@ -4,6 +4,7 @@ use PhpAmqpLib\Connection\AMQPStreamConnection; use Psr\Log\NullLogger; use Yiisoft\Injector\Injector; +use Yiisoft\Queue\Message\JsonMessageSerializer; use Yiisoft\Test\Support\Container\SimpleContainer; use Yiisoft\Yii\Console\Application; use Yiisoft\Queue\AMQP\Adapter; @@ -53,7 +54,7 @@ $adapter = new Adapter( ), new QueueSettings(), ), - new MessageSerializer(), + new JsonMessageSerializer(), $loop, ); $queue = new Queue( From c24813d385809266008e5f93af83b2bb12a9a098 Mon Sep 17 00:00:00 2001 From: Dmitrii Derepko Date: Sun, 14 Jan 2024 16:18:14 +0700 Subject: [PATCH 07/15] Remove unused import --- tests/yii | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/yii b/tests/yii index 6918a2b..48d48f9 100755 --- a/tests/yii +++ b/tests/yii @@ -8,7 +8,7 @@ use Yiisoft\Queue\Message\JsonMessageSerializer; use Yiisoft\Test\Support\Container\SimpleContainer; use Yiisoft\Yii\Console\Application; use Yiisoft\Queue\AMQP\Adapter; -use Yiisoft\Queue\AMQP\MessageSerializer; + use Yiisoft\Queue\AMQP\QueueProvider; use Yiisoft\Queue\AMQP\Settings\Queue as QueueSettings; use Yiisoft\Queue\AMQP\Tests\Support\FileHelper; From 8275ab109a78e02f3b896ea4035fce76963cba3f Mon Sep 17 00:00:00 2001 From: Dmitrii Derepko Date: Sun, 14 Jan 2024 16:41:39 +0700 Subject: [PATCH 08/15] Fix tests --- tests/Support/FakeAdapter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Support/FakeAdapter.php b/tests/Support/FakeAdapter.php index 3f0f7ee..cf8a7c9 100644 --- a/tests/Support/FakeAdapter.php +++ b/tests/Support/FakeAdapter.php @@ -5,11 +5,11 @@ namespace Yiisoft\Queue\AMQP\Tests\Support; use Yiisoft\Queue\Adapter\AdapterInterface; -use Yiisoft\Queue\AMQP\MessageSerializerInterface; use Yiisoft\Queue\AMQP\QueueProviderInterface; use Yiisoft\Queue\Cli\LoopInterface; use Yiisoft\Queue\Enum\JobStatus; use Yiisoft\Queue\Message\MessageInterface; +use Yiisoft\Queue\Message\MessageSerializerInterface; final class FakeAdapter implements AdapterInterface { From feb9dc4128bebef56c4727f2ce7b3573843b132e Mon Sep 17 00:00:00 2001 From: Dmitrii Derepko Date: Sun, 14 Jan 2024 17:36:13 +0700 Subject: [PATCH 09/15] Rewrite middlewares --- src/Middleware/DelayMiddleware.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Middleware/DelayMiddleware.php b/src/Middleware/DelayMiddleware.php index c1eb0a7..2f3f2b8 100644 --- a/src/Middleware/DelayMiddleware.php +++ b/src/Middleware/DelayMiddleware.php @@ -11,11 +11,12 @@ use Yiisoft\Queue\AMQP\QueueProviderInterface; use Yiisoft\Queue\AMQP\Settings\ExchangeSettingsInterface; use Yiisoft\Queue\AMQP\Settings\QueueSettingsInterface; +use Yiisoft\Queue\Middleware\MessageHandlerInterface; +use Yiisoft\Queue\Middleware\MiddlewareInterface; use Yiisoft\Queue\Middleware\Push\Implementation\DelayMiddlewareInterface; -use Yiisoft\Queue\Middleware\Push\MessageHandlerPushInterface; -use Yiisoft\Queue\Middleware\Push\PushRequest; +use Yiisoft\Queue\Middleware\Request; -final class DelayMiddleware implements DelayMiddlewareInterface +final class DelayMiddleware implements MiddlewareInterface, DelayMiddlewareInterface { public function __construct(private float $delayInSeconds, private bool $forcePersistentMessages = true) { @@ -39,7 +40,7 @@ public function getDelay(): float return $this->delayInSeconds; } - public function processPush(PushRequest $request, MessageHandlerPushInterface $handler): PushRequest + public function process(Request $request, MessageHandlerInterface $handler): Request { $adapter = $request->getAdapter(); if (!$adapter instanceof Adapter) { @@ -60,7 +61,7 @@ public function processPush(PushRequest $request, MessageHandlerPushInterface $h ->withQueueSettings($queueSettings) ); - return $handler->handlePush($request->withAdapter($adapter)); + return $handler->handle($request->withAdapter($adapter)); } /** From 10b7bc72628f8ec0f87e4bbfb11c709fcf2bc986 Mon Sep 17 00:00:00 2001 From: Dmitrii Derepko Date: Sun, 14 Jan 2024 20:40:59 +0700 Subject: [PATCH 10/15] Merge branches --- tests/Integration/DelayMiddlewareTest.php | 4 ++-- tests/Unit/QueueFactoryTest.php | 2 +- tests/Unit/QueueProviderTest.php | 2 +- tests/Unit/QueueSettingsTest.php | 2 +- tests/Unit/QueueTest.php | 6 +++--- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/Integration/DelayMiddlewareTest.php b/tests/Integration/DelayMiddlewareTest.php index 45a1209..17ee439 100644 --- a/tests/Integration/DelayMiddlewareTest.php +++ b/tests/Integration/DelayMiddlewareTest.php @@ -52,7 +52,7 @@ public function testMainFlow(): void $time = time(); $queue->push( - new Message('simple', 'test-delay-middleware-main'), + new Message('test-delay-middleware-main'), new DelayMiddleware(3), ); @@ -84,7 +84,7 @@ public function testMainFlowWithFakeAdapter(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage("This middleware works only with the $adapterClass. $fakeAdapterClass given."); $queue->push( - new Message(SimpleMessageHandler::class, 'test-delay-middleware-main'), + new Message('test-delay-middleware-main'), new DelayMiddleware(3), ); } diff --git a/tests/Unit/QueueFactoryTest.php b/tests/Unit/QueueFactoryTest.php index 6b2f267..3aeff04 100644 --- a/tests/Unit/QueueFactoryTest.php +++ b/tests/Unit/QueueFactoryTest.php @@ -58,7 +58,7 @@ public function testDifferentChannel(): void $time = time(); $queue = $factory->get('channel2'); - $queue->push(new Message('ext-simple', ['file_name' => 'test-channel-run', 'payload' => ['time' => $time]])); + $queue->push(new Message(['file_name' => 'test-channel-run', 'payload' => ['time' => $time]])); self::assertNull($fileHelper->get('test-channel-run')); diff --git a/tests/Unit/QueueProviderTest.php b/tests/Unit/QueueProviderTest.php index da9584c..f074cef 100644 --- a/tests/Unit/QueueProviderTest.php +++ b/tests/Unit/QueueProviderTest.php @@ -44,7 +44,7 @@ public function testWithQueueAndExchangeSettings(): void $fileHelper = new FileHelper(); $time = time(); $queue->push( - new Message('ext-simple', ['file_name' => 'test-with-queue-settings', 'payload' => ['time' => $time]]) + new Message(['file_name' => 'test-with-queue-settings', 'payload' => ['time' => $time]]) ); $message = $this diff --git a/tests/Unit/QueueSettingsTest.php b/tests/Unit/QueueSettingsTest.php index ed61cf3..e6f4042 100644 --- a/tests/Unit/QueueSettingsTest.php +++ b/tests/Unit/QueueSettingsTest.php @@ -93,7 +93,7 @@ public function testArgumentsXExpires(): void $this->getQueue() ->withAdapter($adapter) ->push( - new Message('ext-simple', ['payload' => time()]) + new Message(['payload' => time()]) ); sleep(2); diff --git a/tests/Unit/QueueTest.php b/tests/Unit/QueueTest.php index c24a134..25e447a 100644 --- a/tests/Unit/QueueTest.php +++ b/tests/Unit/QueueTest.php @@ -36,7 +36,7 @@ public function testStatus(): void $queue = $this->getDefaultQueue($adapter); $message = new IdEnvelope( - new Message('ext-simple', null), + new Message(null), 'test-id', ); $queue->push($message); @@ -61,7 +61,7 @@ public function testRun(): void $queue = $this->getDefaultQueue($this->getAdapter()); $queue->push( - new Message('ext-simple', ['file_name' => $fileName, 'payload' => ['time' => $time]]) + new Message(['file_name' => $fileName, 'payload' => ['time' => $time]]) ); self::assertNull($fileHelper->get($fileName)); @@ -119,7 +119,7 @@ public function testListen(): void $queue = $this->getDefaultQueue($adapter); $queue->push( - new Message('ext-simple', ['file_name' => 'test-listen' . $time, 'payload' => ['time' => $time]]) + new Message(['file_name' => 'test-listen' . $time, 'payload' => ['time' => $time]]) ); $queue->listen(); } From 35a3c4491ef69df2193df442bb37e38d07d8e9de Mon Sep 17 00:00:00 2001 From: Dmitrii Derepko Date: Fri, 2 Feb 2024 14:40:48 +0700 Subject: [PATCH 11/15] Use event-dispatcher instead of handlers --- tests/yii | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/tests/yii b/tests/yii index 48d48f9..59100a8 100755 --- a/tests/yii +++ b/tests/yii @@ -3,26 +3,22 @@ use PhpAmqpLib\Connection\AMQPStreamConnection; use Psr\Log\NullLogger; +use Yiisoft\EventDispatcher\Dispatcher\Dispatcher; +use Yiisoft\EventDispatcher\Provider\ListenerCollection; +use Yiisoft\EventDispatcher\Provider\Provider; use Yiisoft\Injector\Injector; use Yiisoft\Queue\Message\JsonMessageSerializer; +use Yiisoft\Queue\Middleware\MiddlewareDispatcher; +use Yiisoft\Queue\Middleware\MiddlewareFactory; use Yiisoft\Test\Support\Container\SimpleContainer; use Yiisoft\Yii\Console\Application; use Yiisoft\Queue\AMQP\Adapter; - use Yiisoft\Queue\AMQP\QueueProvider; use Yiisoft\Queue\AMQP\Settings\Queue as QueueSettings; -use Yiisoft\Queue\AMQP\Tests\Support\FileHelper; -use Yiisoft\Queue\AMQP\Tests\Support\SimpleMessageHandler; use Yiisoft\Queue\Cli\SignalLoop; use Yiisoft\Queue\Command\ListenCommand; use Yiisoft\Queue\Command\RunCommand; use Yiisoft\Queue\Middleware\CallableFactory; -use Yiisoft\Queue\Middleware\Consume\ConsumeMiddlewareDispatcher; -use Yiisoft\Queue\Middleware\Consume\MiddlewareFactoryConsume; -use Yiisoft\Queue\Middleware\FailureHandling\FailureMiddlewareDispatcher; -use Yiisoft\Queue\Middleware\FailureHandling\MiddlewareFactoryFailure; -use Yiisoft\Queue\Middleware\Push\MiddlewareFactoryPush; -use Yiisoft\Queue\Middleware\Push\PushMiddlewareDispatcher; use Yiisoft\Queue\Queue; use Yiisoft\Queue\QueueFactory; @@ -33,17 +29,13 @@ $container = new SimpleContainer([]); $injector = new Injector($container); $callableFactory = new CallableFactory($container); $worker = new \Yiisoft\Queue\Worker\Worker( - [ - 'simple' => new SimpleMessageHandler(new FileHelper()), - ], $logger, - $injector, - $container, - new ConsumeMiddlewareDispatcher(new MiddlewareFactoryConsume($container, $callableFactory)), - new FailureMiddlewareDispatcher(new MiddlewareFactoryFailure($container, $callableFactory), []), + new Dispatcher(new Provider(new ListenerCollection())), + new MiddlewareDispatcher(new MiddlewareFactory($container, $callableFactory)), + new MiddlewareDispatcher(new MiddlewareFactory($container, $callableFactory), []), ); $loop = new SignalLoop(); -$pushMiddlewareDispatcher = new PushMiddlewareDispatcher(new MiddlewareFactoryPush($container, $callableFactory)); +$pushMiddlewareDispatcher = new MiddlewareDispatcher(new MiddlewareFactory($container, $callableFactory)); $adapter = new Adapter( new QueueProvider( new AMQPStreamConnection( From 57af4ab307b42679b0aa79caa40c6cb4a5cae35e Mon Sep 17 00:00:00 2001 From: Dmitrii Derepko Date: Thu, 15 Feb 2024 01:10:10 +0700 Subject: [PATCH 12/15] Fix tests --- composer.json | 4 +- src/Middleware/DelayMiddleware.php | 32 +++++---- tests/Integration/DelayMiddlewareTest.php | 41 +++++------ tests/Support/ExtendedSimpleMessage.php | 23 ++++++ tests/Support/FakeAdapter.php | 7 +- tests/Unit/DelayMiddlewareTest.php | 20 +++--- tests/Unit/QueueFactoryTest.php | 7 +- tests/Unit/QueueProviderTest.php | 3 +- tests/Unit/QueueTest.php | 8 ++- tests/Unit/UnitTestCase.php | 88 +++++++++++++++-------- tests/docker-compose.yml | 11 --- tests/yii | 1 + 12 files changed, 149 insertions(+), 96 deletions(-) create mode 100644 tests/Support/ExtendedSimpleMessage.php diff --git a/composer.json b/composer.json index f919cd0..27a199a 100644 --- a/composer.json +++ b/composer.json @@ -22,13 +22,13 @@ "minimum-stability": "dev", "prefer-stable": true, "require": { - "php": "^8.0", + "php": "^8.1", "ext-json": "*", "ext-sockets": "*", "php-amqplib/php-amqplib": "^3.1.0", "yiisoft/factory": "^1.0", "yiisoft/friendly-exception": "^1.0", - "yiisoft/queue": "dev-master" + "yiisoft/queue": "dev-new" }, "require-dev": { "maglnet/composer-require-checker": "^4.4", diff --git a/src/Middleware/DelayMiddleware.php b/src/Middleware/DelayMiddleware.php index d71d526..3ff51c5 100644 --- a/src/Middleware/DelayMiddleware.php +++ b/src/Middleware/DelayMiddleware.php @@ -7,19 +7,33 @@ use InvalidArgumentException; use PhpAmqpLib\Exchange\AMQPExchangeType; use PhpAmqpLib\Message\AMQPMessage; +use Yiisoft\Queue\Adapter\AdapterInterface; use Yiisoft\Queue\AMQP\Adapter; use Yiisoft\Queue\AMQP\QueueProviderInterface; use Yiisoft\Queue\AMQP\Settings\ExchangeSettingsInterface; use Yiisoft\Queue\AMQP\Settings\QueueSettingsInterface; +use Yiisoft\Queue\Middleware\DelayMiddlewareInterface; use Yiisoft\Queue\Middleware\MessageHandlerInterface; use Yiisoft\Queue\Middleware\MiddlewareInterface; -use Yiisoft\Queue\Middleware\Push\Implementation\DelayMiddlewareInterface; use Yiisoft\Queue\Middleware\Request; final class DelayMiddleware implements MiddlewareInterface, DelayMiddlewareInterface { - public function __construct(private float $delayInSeconds, private bool $forcePersistentMessages = true) + public function __construct( + private AdapterInterface $adapter, + private float $delayInSeconds, + private bool $forcePersistentMessages = true + ) { + if (!$adapter instanceof Adapter) { + throw new InvalidArgumentException( + sprintf( + 'This middleware works only with the %s. %s given.', + Adapter::class, + get_debug_type($adapter) + ) + ); + } } /** @@ -42,18 +56,8 @@ public function getDelay(): float public function process(Request $request, MessageHandlerInterface $handler): Request { - $adapter = $request->getAdapter(); - if (!$adapter instanceof Adapter) { - throw new InvalidArgumentException( - sprintf( - 'This middleware works only with the %s. %s given.', - Adapter::class, - get_debug_type($adapter) - ) - ); - } - $queueProvider = $adapter->getQueueProvider(); + $queueProvider = $this->adapter->getQueueProvider(); $originalExchangeSettings = $queueProvider->getExchangeSettings(); $delayedExchangeSettings = $this->getExchangeSettings($originalExchangeSettings); $queueSettings = $this->getQueueSettings( @@ -61,7 +65,7 @@ public function process(Request $request, MessageHandlerInterface $handler): Req $originalExchangeSettings ); - $adapter = $adapter->withQueueProvider( + $adapter = $this->adapter->withQueueProvider( $queueProvider ->withMessageProperties($this->getMessageProperties($queueProvider)) ->withExchangeSettings($delayedExchangeSettings) diff --git a/tests/Integration/DelayMiddlewareTest.php b/tests/Integration/DelayMiddlewareTest.php index 17ee439..7f37d5b 100644 --- a/tests/Integration/DelayMiddlewareTest.php +++ b/tests/Integration/DelayMiddlewareTest.php @@ -7,20 +7,21 @@ use InvalidArgumentException; use Psr\Container\ContainerInterface; use Psr\Log\LoggerInterface; +use Yiisoft\Injector\Injector; use Yiisoft\Queue\Adapter\AdapterInterface; use Yiisoft\Queue\AMQP\Adapter; - use Yiisoft\Queue\AMQP\Middleware\DelayMiddleware; use Yiisoft\Queue\AMQP\QueueProvider; use Yiisoft\Queue\AMQP\Settings\Queue as QueueSettings; use Yiisoft\Queue\AMQP\Tests\Support\FakeAdapter; use Yiisoft\Queue\AMQP\Tests\Support\FileHelper; -use Yiisoft\Queue\AMQP\Tests\Support\SimpleMessageHandler; use Yiisoft\Queue\Cli\LoopInterface; use Yiisoft\Queue\Cli\SignalLoop; use Yiisoft\Queue\Message\JsonMessageSerializer; use Yiisoft\Queue\Message\Message; use Yiisoft\Queue\Middleware\CallableFactory; +use Yiisoft\Queue\Middleware\MiddlewareDispatcher; +use Yiisoft\Queue\Middleware\MiddlewareFactory; use Yiisoft\Queue\Middleware\Push\MiddlewareFactoryPush; use Yiisoft\Queue\Middleware\Push\PushMiddlewareDispatcher; use Yiisoft\Queue\Queue; @@ -53,7 +54,7 @@ public function testMainFlow(): void $time = time(); $queue->push( new Message('test-delay-middleware-main'), - new DelayMiddleware(3), + fn (Injector $injector) => $injector->make(DelayMiddleware::class, ['delayInSeconds' => 3]), ); sleep(2); @@ -68,24 +69,19 @@ public function testMainFlow(): void public function testMainFlowWithFakeAdapter(): void { - $adapterClass = Adapter::class; - $fakeAdapterClass = FakeAdapter::class; - - $adapter = new FakeAdapter( - new QueueProvider( - $this->createConnection(), - new QueueSettings(), - ), - new JsonMessageSerializer(), - new SignalLoop(), - ); - $queue = $this->makeQueue($adapter); + $queue = $this->makeQueue(new FakeAdapter()); $this->expectException(InvalidArgumentException::class); - $this->expectExceptionMessage("This middleware works only with the $adapterClass. $fakeAdapterClass given."); + $this->expectExceptionMessage( + sprintf( + 'This middleware works only with the %s. %s given.', + Adapter::class, + FakeAdapter::class, + ) + ); $queue->push( new Message('test-delay-middleware-main'), - new DelayMiddleware(3), + fn (Injector $injector) => $injector->make(DelayMiddleware::class, ['delayInSeconds' => 3]), ); } @@ -95,10 +91,15 @@ private function makeQueue(AdapterInterface $adapter): Queue $this->createMock(WorkerInterface::class), $this->createMock(LoopInterface::class), $this->createMock(LoggerInterface::class), - new PushMiddlewareDispatcher( - new MiddlewareFactoryPush( + new MiddlewareDispatcher( + new MiddlewareFactory( new SimpleContainer([ - 'simple' => new SimpleMessageHandler(new FileHelper()), + AdapterInterface::class => $adapter, + Injector::class => new Injector( + new SimpleContainer([ + AdapterInterface::class => $adapter, + ]) + ), ]), new CallableFactory($this->createMock(ContainerInterface::class)), ), diff --git a/tests/Support/ExtendedSimpleMessage.php b/tests/Support/ExtendedSimpleMessage.php new file mode 100644 index 0000000..4c7f313 --- /dev/null +++ b/tests/Support/ExtendedSimpleMessage.php @@ -0,0 +1,23 @@ +data = $data; + } +} diff --git a/tests/Support/FakeAdapter.php b/tests/Support/FakeAdapter.php index cf8a7c9..7c5c886 100644 --- a/tests/Support/FakeAdapter.php +++ b/tests/Support/FakeAdapter.php @@ -14,15 +14,11 @@ final class FakeAdapter implements AdapterInterface { public function __construct( - private QueueProviderInterface $queueProvider, - private MessageSerializerInterface $serializer, - private LoopInterface $loop, ) { } public function runExisting(callable $handlerCallback): void { - // TODO: Implement runExisting() method. } public function status(string|int $id): JobStatus @@ -32,12 +28,11 @@ public function status(string|int $id): JobStatus public function push(MessageInterface $message): MessageInterface { - // TODO: Implement push() method. + return $message; } public function subscribe(callable $handlerCallback): void { - // TODO: Implement subscribe() method. } public function withChannel(string $channel): AdapterInterface diff --git a/tests/Unit/DelayMiddlewareTest.php b/tests/Unit/DelayMiddlewareTest.php index 4d2140f..0bda2a4 100644 --- a/tests/Unit/DelayMiddlewareTest.php +++ b/tests/Unit/DelayMiddlewareTest.php @@ -4,24 +4,28 @@ namespace Yiisoft\Queue\AMQP\Tests\Unit; +use Yiisoft\Queue\AMQP\Adapter; use Yiisoft\Queue\AMQP\Middleware\DelayMiddleware; +use Yiisoft\Queue\AMQP\QueueProviderInterface; +use Yiisoft\Queue\Cli\LoopInterface; +use Yiisoft\Queue\Message\MessageSerializerInterface; final class DelayMiddlewareTest extends UnitTestCase { public function testWithDelay(): void { - $delayMiddleware = new DelayMiddleware(5); + $adapter = new Adapter( + $this->createMock(QueueProviderInterface::class), + $this->createMock(MessageSerializerInterface::class), + $this->createMock(LoopInterface::class), + ); + $delayMiddleware = new DelayMiddleware($adapter, 5); self::assertEquals(5, $delayMiddleware->getDelay()); $delayMiddlewareWithDelay = $delayMiddleware->withDelay(10); - self::assertEquals(10, $delayMiddlewareWithDelay->getDelay()); - } + self::assertNotSame($delayMiddleware, $delayMiddlewareWithDelay); - public function testImmutable(): void - { - $delayMiddleware = new DelayMiddleware(0); - - self::assertNotSame($delayMiddleware, $delayMiddleware->withDelay(1)); + self::assertEquals(10, $delayMiddlewareWithDelay->getDelay()); } } diff --git a/tests/Unit/QueueFactoryTest.php b/tests/Unit/QueueFactoryTest.php index 3aeff04..4fcc155 100644 --- a/tests/Unit/QueueFactoryTest.php +++ b/tests/Unit/QueueFactoryTest.php @@ -6,6 +6,7 @@ use Yiisoft\Injector\Injector; use Yiisoft\Queue\AMQP\QueueProvider; +use Yiisoft\Queue\AMQP\Tests\Support\ExtendedSimpleMessage; use Yiisoft\Queue\AMQP\Tests\Support\FileHelper; use Yiisoft\Queue\Message\Message; use Yiisoft\Queue\Middleware\CallableFactory; @@ -16,7 +17,7 @@ class QueueFactoryTest extends UnitTestCase public function testSameChannelName(): void { $queue = $this->getQueue(); - $container = $this->getContainer(); + $container = $this->createContainer(); $factory = new QueueFactory( [], $queue, @@ -42,7 +43,7 @@ public function testDifferentChannel(): void $this->queueProvider = $queueProvider->withExchangeSettings(null); - $container = $this->getContainer(); + $container = $this->createContainer(); $adapter = $this->getAdapter(); $factory = new QueueFactory( @@ -58,7 +59,7 @@ public function testDifferentChannel(): void $time = time(); $queue = $factory->get('channel2'); - $queue->push(new Message(['file_name' => 'test-channel-run', 'payload' => ['time' => $time]])); + $queue->push(new ExtendedSimpleMessage(['file_name' => 'test-channel-run', 'payload' => ['time' => $time]])); self::assertNull($fileHelper->get('test-channel-run')); diff --git a/tests/Unit/QueueProviderTest.php b/tests/Unit/QueueProviderTest.php index f074cef..de516f6 100644 --- a/tests/Unit/QueueProviderTest.php +++ b/tests/Unit/QueueProviderTest.php @@ -12,6 +12,7 @@ use Yiisoft\Queue\AMQP\Settings\ExchangeSettingsInterface; use Yiisoft\Queue\AMQP\Settings\Queue as QueueSettings; use Yiisoft\Queue\AMQP\Settings\QueueSettingsInterface; +use Yiisoft\Queue\AMQP\Tests\Support\ExtendedSimpleMessage; use Yiisoft\Queue\AMQP\Tests\Support\FileHelper; use Yiisoft\Queue\Message\JsonMessageSerializer; use Yiisoft\Queue\Message\Message; @@ -44,7 +45,7 @@ public function testWithQueueAndExchangeSettings(): void $fileHelper = new FileHelper(); $time = time(); $queue->push( - new Message(['file_name' => 'test-with-queue-settings', 'payload' => ['time' => $time]]) + new ExtendedSimpleMessage(['file_name' => 'test-with-queue-settings', 'payload' => ['time' => $time]]) ); $message = $this diff --git a/tests/Unit/QueueTest.php b/tests/Unit/QueueTest.php index 25e447a..fad7f15 100644 --- a/tests/Unit/QueueTest.php +++ b/tests/Unit/QueueTest.php @@ -12,6 +12,7 @@ use Yiisoft\Queue\AMQP\QueueProviderInterface; use Yiisoft\Queue\AMQP\Settings\Exchange as ExchangeSettings; use Yiisoft\Queue\AMQP\Settings\Queue as QueueSettings; +use Yiisoft\Queue\AMQP\Tests\Support\ExtendedSimpleMessage; use Yiisoft\Queue\AMQP\Tests\Support\FileHelper; use Yiisoft\Queue\Cli\LoopInterface; use Yiisoft\Queue\Exception\JobFailureException; @@ -20,6 +21,7 @@ use Yiisoft\Queue\Message\Message; use Yiisoft\Queue\Message\MessageSerializerInterface; use Yiisoft\Queue\Queue; +use Yiisoft\Queue\Tests\Shared\ExceptionMessage; final class QueueTest extends UnitTestCase { @@ -61,7 +63,7 @@ public function testRun(): void $queue = $this->getDefaultQueue($this->getAdapter()); $queue->push( - new Message(['file_name' => $fileName, 'payload' => ['time' => $time]]) + new ExtendedSimpleMessage(['file_name' => $fileName, 'payload' => ['time' => $time]]) ); self::assertNull($fileHelper->get($fileName)); @@ -92,7 +94,7 @@ public function testListenWithException(): void $queue = $this->getDefaultQueue($adapter); $time = time(); - $queue->push(new Message('exception-listen', ['payload' => ['time' => $time]])); + $queue->push(new ExceptionMessage(['payload' => ['time' => $time]])); $this->expectException(JobFailureException::class); @@ -119,7 +121,7 @@ public function testListen(): void $queue = $this->getDefaultQueue($adapter); $queue->push( - new Message(['file_name' => 'test-listen' . $time, 'payload' => ['time' => $time]]) + new ExtendedSimpleMessage(['file_name' => 'test-listen' . $time, 'payload' => ['time' => $time]]) ); $queue->listen(); } diff --git a/tests/Unit/UnitTestCase.php b/tests/Unit/UnitTestCase.php index e617ab6..c19ec80 100644 --- a/tests/Unit/UnitTestCase.php +++ b/tests/Unit/UnitTestCase.php @@ -6,13 +6,17 @@ use PHPUnit\Util\Exception as PHPUnitException; use Psr\Container\ContainerInterface; +use Psr\EventDispatcher\EventDispatcherInterface; use Psr\Log\NullLogger; +use Yiisoft\EventDispatcher\Dispatcher\Dispatcher; +use Yiisoft\EventDispatcher\Provider\ListenerCollection; +use Yiisoft\EventDispatcher\Provider\Provider; use Yiisoft\Injector\Injector; use Yiisoft\Queue\Adapter\AdapterInterface; use Yiisoft\Queue\AMQP\Adapter; - use Yiisoft\Queue\AMQP\QueueProvider; use Yiisoft\Queue\AMQP\Settings\Queue as QueueSettings; +use Yiisoft\Queue\AMQP\Tests\Support\ExtendedSimpleMessage; use Yiisoft\Queue\AMQP\Tests\Support\ExtendedSimpleMessageHandler; use Yiisoft\Queue\AMQP\Tests\Support\FileHelper; use Yiisoft\Queue\AMQP\Tests\Support\MainTestCase; @@ -21,13 +25,15 @@ use Yiisoft\Queue\Message\JsonMessageSerializer; use Yiisoft\Queue\Message\MessageInterface; use Yiisoft\Queue\Middleware\CallableFactory; -use Yiisoft\Queue\Middleware\Consume\ConsumeMiddlewareDispatcher; -use Yiisoft\Queue\Middleware\Consume\MiddlewareFactoryConsume; -use Yiisoft\Queue\Middleware\FailureHandling\FailureMiddlewareDispatcher; -use Yiisoft\Queue\Middleware\FailureHandling\MiddlewareFactoryFailure; -use Yiisoft\Queue\Middleware\Push\MiddlewareFactoryPush; -use Yiisoft\Queue\Middleware\Push\PushMiddlewareDispatcher; +use Yiisoft\Queue\Middleware\MiddlewareDispatcher; +use Yiisoft\Queue\Middleware\MiddlewareFactory; use Yiisoft\Queue\Queue; +use Yiisoft\Queue\Tests\Shared\ExceptionMessage; +use Yiisoft\Queue\Tests\Shared\ExceptionMessageHandler; +use Yiisoft\Queue\Tests\Shared\NullMessage; +use Yiisoft\Queue\Tests\Shared\NullMessageHandler; +use Yiisoft\Queue\Tests\Shared\StackMessage; +use Yiisoft\Queue\Tests\Shared\StackMessageHandler; use Yiisoft\Queue\Worker\Worker; use Yiisoft\Queue\Worker\WorkerInterface; use Yiisoft\Test\Support\Container\SimpleContainer; @@ -37,6 +43,7 @@ */ abstract class UnitTestCase extends MainTestCase { + protected Dispatcher $eventDispatcher; protected Queue|null $queue = null; protected ?WorkerInterface $worker = null; protected ?ContainerInterface $container = null; @@ -78,10 +85,9 @@ protected function getQueue(): Queue protected function getWorker(): WorkerInterface { return $this->worker ??= new Worker( - $this->getMessageHandlers(), new NullLogger(), - new Injector($this->getContainer()), - $this->getContainer(), + $this->createEventDispatcher(), + $this->createContainer(), $this->getConsumeMiddlewareDispatcher(), $this->getFailureMiddlewareDispatcher(), ); @@ -100,34 +106,38 @@ protected function getMessageHandlers(): array ]; } - protected function getContainer(): ContainerInterface + protected function createContainer(): ContainerInterface { return $this->container ??= new SimpleContainer($this->getContainerDefinitions()); } protected function getContainerDefinitions(): array { - return []; + return [ + ExtendedSimpleMessageHandler::class => new ExtendedSimpleMessageHandler(new FileHelper()), + ExceptionMessageHandler::class => new ExceptionMessageHandler(), + StackMessageHandler::class => new StackMessageHandler(), + NullMessageHandler::class => new NullMessageHandler(), + ]; } - protected function getConsumeMiddlewareDispatcher(): ConsumeMiddlewareDispatcher + protected function getConsumeMiddlewareDispatcher(): MiddlewareDispatcher { - return new ConsumeMiddlewareDispatcher( - new MiddlewareFactoryConsume( - $this->getContainer(), - new CallableFactory($this->getContainer()), + return new MiddlewareDispatcher( + new MiddlewareFactory( + $this->createContainer(), + new CallableFactory($this->createContainer()), ), ); } - protected function getFailureMiddlewareDispatcher(): FailureMiddlewareDispatcher + protected function getFailureMiddlewareDispatcher(): MiddlewareDispatcher { - return new FailureMiddlewareDispatcher( - new MiddlewareFactoryFailure( - $this->getContainer(), - new CallableFactory($this->getContainer()), + return new MiddlewareDispatcher( + new MiddlewareFactory( + $this->createContainer(), + new CallableFactory($this->createContainer()), ), - [], ); } @@ -145,12 +155,12 @@ protected function getLoop(): LoopInterface return $this->loop ??= new SignalLoop(); } - protected function getPushMiddlewareDispatcher(): PushMiddlewareDispatcher + protected function getPushMiddlewareDispatcher(): MiddlewareDispatcher { - return new PushMiddlewareDispatcher( - new MiddlewareFactoryPush( - $this->getContainer(), - new CallableFactory($this->getContainer()), + return new MiddlewareDispatcher( + new MiddlewareFactory( + $this->createContainer(), + new CallableFactory($this->createContainer()), ), ); } @@ -167,4 +177,26 @@ protected function getQueueProvider(): QueueProvider $this->getQueueSettings(), ); } + + protected function createEventDispatcher(): EventDispatcherInterface + { + $container = $this->createContainer(); + $listeners = new ListenerCollection(); + $listeners = $listeners + ->add(fn (NullMessage $message) => $container->get(NullMessageHandler::class)->handle($message)) + ->add(fn (StackMessage $message) => $container->get(StackMessageHandler::class)->handle($message)) + ->add(fn (ExtendedSimpleMessage $message) => $container->get(ExtendedSimpleMessageHandler::class)->handle($message)) + ->add(fn (ExceptionMessage $message) => $container->get(ExceptionMessageHandler::class)->handle($message)); + + + // 'ext-simple' => [new ExtendedSimpleMessageHandler(new FileHelper()), 'handle'], + // 'exception-listen' => static function (MessageInterface $message) { + // $data = $message->getData(); + // if (null !== $data) { + // throw new PHPUnitException((string) $data['payload']['time']); + // } + //}, + + return $this->eventDispatcher ??= new Dispatcher(new Provider($listeners)); + } } diff --git a/tests/docker-compose.yml b/tests/docker-compose.yml index 3a56465..7f9e50a 100644 --- a/tests/docker-compose.yml +++ b/tests/docker-compose.yml @@ -16,18 +16,8 @@ x-php: &php condition: service_healthy services: - php80: - <<: *php - container_name: yii-queue-amqp-php80 - build: - context: .. - dockerfile: tests/docker/php/Dockerfile - args: - PHP_VERSION: '8.0' - php81: <<: *php - container_name: yii-queue-amqp-php81 build: context: .. dockerfile: tests/docker/php/Dockerfile @@ -36,7 +26,6 @@ services: php82: <<: *php - container_name: yii-queue-amqp-php82 build: context: .. dockerfile: tests/docker/php/Dockerfile diff --git a/tests/yii b/tests/yii index 59100a8..83f66cb 100755 --- a/tests/yii +++ b/tests/yii @@ -31,6 +31,7 @@ $callableFactory = new CallableFactory($container); $worker = new \Yiisoft\Queue\Worker\Worker( $logger, new Dispatcher(new Provider(new ListenerCollection())), + new SimpleContainer([]), new MiddlewareDispatcher(new MiddlewareFactory($container, $callableFactory)), new MiddlewareDispatcher(new MiddlewareFactory($container, $callableFactory), []), ); From 6361665c63b469c5ae4ac166d17b8f9af4527aef Mon Sep 17 00:00:00 2001 From: Dmitrii Derepko Date: Thu, 15 Feb 2024 01:41:04 +0700 Subject: [PATCH 13/15] Fix accessing adapter --- composer.json | 3 ++- src/Adapter.php | 2 +- src/Middleware/DelayMiddleware.php | 10 ++++++---- tests/Unit/UnitTestCase.php | 9 --------- tests/yii | 5 +++-- 5 files changed, 12 insertions(+), 17 deletions(-) diff --git a/composer.json b/composer.json index 27a199a..669d197 100644 --- a/composer.json +++ b/composer.json @@ -39,7 +39,8 @@ "symfony/console": "^6.0", "symfony/process": "^6.0", "vimeo/psalm": "^4.30|^5.8", - "yiisoft/test-support": "^3.0" + "yiisoft/test-support": "^3.0", + "yiisoft/yii-console": "^2.1" }, "autoload": { "psr-4": { diff --git a/src/Adapter.php b/src/Adapter.php index 772f675..c204e1d 100644 --- a/src/Adapter.php +++ b/src/Adapter.php @@ -49,7 +49,7 @@ public function runExisting(callable $handlerCallback): void public function status(string|int $id): JobStatus { - throw new NotImplementedException('Status check is not supported by the adapter ' . self::class . '.'); + throw new NotImplementedException(sprintf('Status check is not supported by the adapter %s.', self::class)); } public function push(MessageInterface $message): MessageInterface diff --git a/src/Middleware/DelayMiddleware.php b/src/Middleware/DelayMiddleware.php index 3ff51c5..fa4cae4 100644 --- a/src/Middleware/DelayMiddleware.php +++ b/src/Middleware/DelayMiddleware.php @@ -23,8 +23,7 @@ public function __construct( private AdapterInterface $adapter, private float $delayInSeconds, private bool $forcePersistentMessages = true - ) - { + ) { if (!$adapter instanceof Adapter) { throw new InvalidArgumentException( sprintf( @@ -56,7 +55,6 @@ public function getDelay(): float public function process(Request $request, MessageHandlerInterface $handler): Request { - $queueProvider = $this->adapter->getQueueProvider(); $originalExchangeSettings = $queueProvider->getExchangeSettings(); $delayedExchangeSettings = $this->getExchangeSettings($originalExchangeSettings); @@ -72,7 +70,11 @@ public function process(Request $request, MessageHandlerInterface $handler): Req ->withQueueSettings($queueSettings) ); - return $handler->handle($request->withAdapter($adapter)); + return $handler->handle( + $request->withQueue( + $request->getQueue()->withAdapter($adapter) + ) + ); } /** diff --git a/tests/Unit/UnitTestCase.php b/tests/Unit/UnitTestCase.php index c19ec80..1fbb9d0 100644 --- a/tests/Unit/UnitTestCase.php +++ b/tests/Unit/UnitTestCase.php @@ -188,15 +188,6 @@ protected function createEventDispatcher(): EventDispatcherInterface ->add(fn (ExtendedSimpleMessage $message) => $container->get(ExtendedSimpleMessageHandler::class)->handle($message)) ->add(fn (ExceptionMessage $message) => $container->get(ExceptionMessageHandler::class)->handle($message)); - - // 'ext-simple' => [new ExtendedSimpleMessageHandler(new FileHelper()), 'handle'], - // 'exception-listen' => static function (MessageInterface $message) { - // $data = $message->getData(); - // if (null !== $data) { - // throw new PHPUnitException((string) $data['payload']['time']); - // } - //}, - return $this->eventDispatcher ??= new Dispatcher(new Provider($listeners)); } } diff --git a/tests/yii b/tests/yii index 83f66cb..825cd3e 100755 --- a/tests/yii +++ b/tests/yii @@ -10,6 +10,7 @@ use Yiisoft\Injector\Injector; use Yiisoft\Queue\Message\JsonMessageSerializer; use Yiisoft\Queue\Middleware\MiddlewareDispatcher; use Yiisoft\Queue\Middleware\MiddlewareFactory; +use Yiisoft\Queue\QueueFactoryInterface; use Yiisoft\Test\Support\Container\SimpleContainer; use Yiisoft\Yii\Console\Application; use Yiisoft\Queue\AMQP\Adapter; @@ -31,7 +32,7 @@ $callableFactory = new CallableFactory($container); $worker = new \Yiisoft\Queue\Worker\Worker( $logger, new Dispatcher(new Provider(new ListenerCollection())), - new SimpleContainer([]), + $container, new MiddlewareDispatcher(new MiddlewareFactory($container, $callableFactory)), new MiddlewareDispatcher(new MiddlewareFactory($container, $callableFactory), []), ); @@ -67,6 +68,6 @@ $queueFactory = new QueueFactory( $application = new Application(); $application->add(new ListenCommand($queueFactory)); -$application->add(new RunCommand($queueFactory)); +$application->add(new RunCommand($queueFactory, [QueueFactoryInterface::DEFAULT_CHANNEL_NAME])); $application->run(); From b2708749b51f049160b5cfdf978cf0de40a646f7 Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Wed, 14 Feb 2024 18:41:22 +0000 Subject: [PATCH 14/15] Apply fixes from StyleCI --- tests/Integration/DelayMiddlewareTest.php | 2 -- tests/Support/ExtendedSimpleMessage.php | 3 +-- tests/Support/FakeAdapter.php | 3 --- tests/Unit/QueueFactoryTest.php | 1 - tests/Unit/QueueProviderTest.php | 1 - tests/Unit/UnitTestCase.php | 1 - 6 files changed, 1 insertion(+), 10 deletions(-) diff --git a/tests/Integration/DelayMiddlewareTest.php b/tests/Integration/DelayMiddlewareTest.php index 7f37d5b..098f192 100644 --- a/tests/Integration/DelayMiddlewareTest.php +++ b/tests/Integration/DelayMiddlewareTest.php @@ -22,8 +22,6 @@ use Yiisoft\Queue\Middleware\CallableFactory; use Yiisoft\Queue\Middleware\MiddlewareDispatcher; use Yiisoft\Queue\Middleware\MiddlewareFactory; -use Yiisoft\Queue\Middleware\Push\MiddlewareFactoryPush; -use Yiisoft\Queue\Middleware\Push\PushMiddlewareDispatcher; use Yiisoft\Queue\Queue; use Yiisoft\Queue\Worker\WorkerInterface; use Yiisoft\Test\Support\Container\SimpleContainer; diff --git a/tests/Support/ExtendedSimpleMessage.php b/tests/Support/ExtendedSimpleMessage.php index 4c7f313..adbe2d8 100644 --- a/tests/Support/ExtendedSimpleMessage.php +++ b/tests/Support/ExtendedSimpleMessage.php @@ -16,8 +16,7 @@ final class ExtendedSimpleMessage implements MessageInterface public function __construct( array $data, - ) - { + ) { $this->data = $data; } } diff --git a/tests/Support/FakeAdapter.php b/tests/Support/FakeAdapter.php index 7c5c886..7e06054 100644 --- a/tests/Support/FakeAdapter.php +++ b/tests/Support/FakeAdapter.php @@ -5,11 +5,8 @@ namespace Yiisoft\Queue\AMQP\Tests\Support; use Yiisoft\Queue\Adapter\AdapterInterface; -use Yiisoft\Queue\AMQP\QueueProviderInterface; -use Yiisoft\Queue\Cli\LoopInterface; use Yiisoft\Queue\Enum\JobStatus; use Yiisoft\Queue\Message\MessageInterface; -use Yiisoft\Queue\Message\MessageSerializerInterface; final class FakeAdapter implements AdapterInterface { diff --git a/tests/Unit/QueueFactoryTest.php b/tests/Unit/QueueFactoryTest.php index 4fcc155..f88326f 100644 --- a/tests/Unit/QueueFactoryTest.php +++ b/tests/Unit/QueueFactoryTest.php @@ -8,7 +8,6 @@ use Yiisoft\Queue\AMQP\QueueProvider; use Yiisoft\Queue\AMQP\Tests\Support\ExtendedSimpleMessage; use Yiisoft\Queue\AMQP\Tests\Support\FileHelper; -use Yiisoft\Queue\Message\Message; use Yiisoft\Queue\Middleware\CallableFactory; use Yiisoft\Queue\QueueFactory; diff --git a/tests/Unit/QueueProviderTest.php b/tests/Unit/QueueProviderTest.php index de516f6..db8eab7 100644 --- a/tests/Unit/QueueProviderTest.php +++ b/tests/Unit/QueueProviderTest.php @@ -15,7 +15,6 @@ use Yiisoft\Queue\AMQP\Tests\Support\ExtendedSimpleMessage; use Yiisoft\Queue\AMQP\Tests\Support\FileHelper; use Yiisoft\Queue\Message\JsonMessageSerializer; -use Yiisoft\Queue\Message\Message; final class QueueProviderTest extends UnitTestCase { diff --git a/tests/Unit/UnitTestCase.php b/tests/Unit/UnitTestCase.php index 1fbb9d0..1a14636 100644 --- a/tests/Unit/UnitTestCase.php +++ b/tests/Unit/UnitTestCase.php @@ -11,7 +11,6 @@ use Yiisoft\EventDispatcher\Dispatcher\Dispatcher; use Yiisoft\EventDispatcher\Provider\ListenerCollection; use Yiisoft\EventDispatcher\Provider\Provider; -use Yiisoft\Injector\Injector; use Yiisoft\Queue\Adapter\AdapterInterface; use Yiisoft\Queue\AMQP\Adapter; use Yiisoft\Queue\AMQP\QueueProvider; From 2e2ae57fe073c164a05f0c4f701b8fea426f9046 Mon Sep 17 00:00:00 2001 From: Dmitrii Derepko Date: Sun, 3 Mar 2024 17:03:14 +0700 Subject: [PATCH 15/15] Fix test --- tests/Integration/DelayMiddlewareTest.php | 66 ++++++++++++++++------- 1 file changed, 46 insertions(+), 20 deletions(-) diff --git a/tests/Integration/DelayMiddlewareTest.php b/tests/Integration/DelayMiddlewareTest.php index 098f192..b38968c 100644 --- a/tests/Integration/DelayMiddlewareTest.php +++ b/tests/Integration/DelayMiddlewareTest.php @@ -6,13 +6,18 @@ use InvalidArgumentException; use Psr\Container\ContainerInterface; -use Psr\Log\LoggerInterface; +use Psr\Log\NullLogger; +use Yiisoft\EventDispatcher\Dispatcher\Dispatcher; +use Yiisoft\EventDispatcher\Provider\ListenerCollection; +use Yiisoft\EventDispatcher\Provider\Provider; use Yiisoft\Injector\Injector; use Yiisoft\Queue\Adapter\AdapterInterface; use Yiisoft\Queue\AMQP\Adapter; use Yiisoft\Queue\AMQP\Middleware\DelayMiddleware; use Yiisoft\Queue\AMQP\QueueProvider; use Yiisoft\Queue\AMQP\Settings\Queue as QueueSettings; +use Yiisoft\Queue\AMQP\Tests\Support\ExtendedSimpleMessage; +use Yiisoft\Queue\AMQP\Tests\Support\ExtendedSimpleMessageHandler; use Yiisoft\Queue\AMQP\Tests\Support\FakeAdapter; use Yiisoft\Queue\AMQP\Tests\Support\FileHelper; use Yiisoft\Queue\Cli\LoopInterface; @@ -23,7 +28,13 @@ use Yiisoft\Queue\Middleware\MiddlewareDispatcher; use Yiisoft\Queue\Middleware\MiddlewareFactory; use Yiisoft\Queue\Queue; -use Yiisoft\Queue\Worker\WorkerInterface; +use Yiisoft\Queue\Tests\Shared\ExceptionMessage; +use Yiisoft\Queue\Tests\Shared\ExceptionMessageHandler; +use Yiisoft\Queue\Tests\Shared\NullMessage; +use Yiisoft\Queue\Tests\Shared\NullMessageHandler; +use Yiisoft\Queue\Tests\Shared\StackMessage; +use Yiisoft\Queue\Tests\Shared\StackMessageHandler; +use Yiisoft\Queue\Worker\Worker; use Yiisoft\Test\Support\Container\SimpleContainer; final class DelayMiddlewareTest extends TestCase @@ -50,15 +61,16 @@ public function testMainFlow(): void $queue = $this->makeQueue($adapter); $time = time(); + $file = 'test-delay-middleware-main'; $queue->push( - new Message('test-delay-middleware-main'), + new ExtendedSimpleMessage(['file_name' => $file, 'payload' => ['time' => $time]]), fn (Injector $injector) => $injector->make(DelayMiddleware::class, ['delayInSeconds' => 3]), ); sleep(2); - self::assertNull($fileHelper->get('test-delay-middleware-main')); + self::assertNull($fileHelper->get($file)); sleep(2); - $result = $fileHelper->get('test-delay-middleware-main'); + $result = $fileHelper->get($file); self::assertNotNull($result); $result = (int) $result; self::assertGreaterThanOrEqual($time + 3, $result); @@ -85,23 +97,37 @@ public function testMainFlowWithFakeAdapter(): void private function makeQueue(AdapterInterface $adapter): Queue { + $definitions = [ + AdapterInterface::class => $adapter, + ]; + $middlewareDispatcher = new MiddlewareDispatcher( + new MiddlewareFactory( + $container = new SimpleContainer([ + ...$definitions, + ExtendedSimpleMessageHandler::class => new ExtendedSimpleMessageHandler(new FileHelper()), + Injector::class => new Injector(new SimpleContainer($definitions)), + ]), + new CallableFactory($this->createMock(ContainerInterface::class)), + ), + ); + $listeners = new ListenerCollection(); + $listeners = $listeners + ->add(fn (NullMessage $message) => $container->get(NullMessageHandler::class)->handle($message)) + ->add(fn (StackMessage $message) => $container->get(StackMessageHandler::class)->handle($message)) + ->add(fn (ExtendedSimpleMessage $message) => $container->get(ExtendedSimpleMessageHandler::class)->handle($message)) + ->add(fn (ExceptionMessage $message) => $container->get(ExceptionMessageHandler::class)->handle($message)); + return new Queue( - $this->createMock(WorkerInterface::class), - $this->createMock(LoopInterface::class), - $this->createMock(LoggerInterface::class), - new MiddlewareDispatcher( - new MiddlewareFactory( - new SimpleContainer([ - AdapterInterface::class => $adapter, - Injector::class => new Injector( - new SimpleContainer([ - AdapterInterface::class => $adapter, - ]) - ), - ]), - new CallableFactory($this->createMock(ContainerInterface::class)), - ), + new Worker( + $logger = new NullLogger(), + new Dispatcher(new Provider($listeners)), + $container, + $middlewareDispatcher, + $middlewareDispatcher, ), + $this->createMock(LoopInterface::class), + $logger, + $middlewareDispatcher, $adapter, ); }