From aed00ec2a49eb2608a9500d8f44f4a2eaf68df35 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sun, 15 Mar 2026 20:12:27 +0300 Subject: [PATCH 1/4] Add `PredefinedQueueProvider` --- src/Provider/PredefinedQueueProvider.php | 65 ++++++++++++++ .../Provider/PredefinedQueueProviderTest.php | 89 +++++++++++++++++++ 2 files changed, 154 insertions(+) create mode 100644 src/Provider/PredefinedQueueProvider.php create mode 100644 tests/Unit/Provider/PredefinedQueueProviderTest.php diff --git a/src/Provider/PredefinedQueueProvider.php b/src/Provider/PredefinedQueueProvider.php new file mode 100644 index 00000000..91f26acc --- /dev/null +++ b/src/Provider/PredefinedQueueProvider.php @@ -0,0 +1,65 @@ + + */ + private readonly array $queues; + + /** + * @param array $queues Map of queue name to queue instance. + * + * @psalm-param array $queues + * + * @throws InvalidQueueConfigException If a value in the array is not a {@see QueueInterface} instance. + */ + public function __construct(array $queues) + { + foreach ($queues as $name => $queue) { + if (!$queue instanceof QueueInterface) { + throw new InvalidQueueConfigException( + sprintf( + 'Queue must implement "%s". For queue "%s" got "%s" instead.', + QueueInterface::class, + $name, + get_debug_type($queue), + ), + ); + } + } + $this->queues = $queues; + } + + public function get(string|BackedEnum $name): QueueInterface + { + $name = StringNormalizer::normalize($name); + + if (!array_key_exists($name, $this->queues)) { + throw new QueueNotFoundException($name); + } + + return $this->queues[$name]; + } + + public function has(string|BackedEnum $name): bool + { + $name = StringNormalizer::normalize($name); + return array_key_exists($name, $this->queues); + } +} diff --git a/tests/Unit/Provider/PredefinedQueueProviderTest.php b/tests/Unit/Provider/PredefinedQueueProviderTest.php new file mode 100644 index 00000000..7268bdac --- /dev/null +++ b/tests/Unit/Provider/PredefinedQueueProviderTest.php @@ -0,0 +1,89 @@ + $queue, + ]); + + $this->assertSame($queue, $provider->get('queue1')); + $this->assertTrue($provider->has('queue1')); + $this->assertFalse($provider->has('not-exist-queue')); + } + + public function testGetTwice(): void + { + $queue = new StubQueue(); + $provider = new PredefinedQueueProvider([ + 'queue1' => $queue, + ]); + + $queue1 = $provider->get('queue1'); + $queue2 = $provider->get('queue1'); + + $this->assertSame($queue1, $queue2); + } + + public function testGetNotExistQueue(): void + { + $provider = new PredefinedQueueProvider([ + 'queue1' => new StubQueue(), + ]); + + $this->expectException(QueueNotFoundException::class); + $this->expectExceptionMessage('Queue with name "not-exist-queue" not found.'); + $provider->get('not-exist-queue'); + } + + public function testInvalidQueueConfig(): void + { + $this->expectException(InvalidQueueConfigException::class); + $this->expectExceptionMessage( + sprintf( + 'Queue must implement "%s". For queue "%s" got "%s" instead.', + QueueInterface::class, + 'queue1', + 'stdClass', + ), + ); + new PredefinedQueueProvider([ + 'queue1' => new \stdClass(), + ]); + } + + public function testGetHasByStringEnum(): void + { + $queue = new StubQueue(); + $provider = new PredefinedQueueProvider([ + 'red' => $queue, + ]); + + $this->assertSame($queue, $provider->get(StringEnum::RED)); + $this->assertTrue($provider->has(StringEnum::RED)); + $this->assertFalse($provider->has(StringEnum::GREEN)); + } + + public function testEmpty(): void + { + $provider = new PredefinedQueueProvider([]); + + $this->assertFalse($provider->has('any')); + } +} From 90e9e54dde47445196764d23777023230d877a35 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sun, 15 Mar 2026 20:22:09 +0300 Subject: [PATCH 2/4] test --- .../Provider/CompositeQueueProviderTest.php | 25 ++++++++----------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/tests/Unit/Provider/CompositeQueueProviderTest.php b/tests/Unit/Provider/CompositeQueueProviderTest.php index 97293a85..c344852a 100644 --- a/tests/Unit/Provider/CompositeQueueProviderTest.php +++ b/tests/Unit/Provider/CompositeQueueProviderTest.php @@ -4,7 +4,7 @@ namespace Yiisoft\Queue\Tests\Unit\Provider; -use Yiisoft\Queue\Provider\AdapterFactoryQueueProvider; +use Yiisoft\Queue\Provider\PredefinedQueueProvider; use Yiisoft\Queue\Provider\QueueNotFoundException; use Yiisoft\Queue\Provider\CompositeQueueProvider; use Yiisoft\Queue\Stubs\StubAdapter; @@ -15,24 +15,19 @@ final class CompositeQueueProviderTest extends TestCase { public function testBase(): void { - $queue = new StubQueue(new StubAdapter()); + $queue1 = new StubQueue(new StubAdapter()); + $queue2 = new StubQueue(new StubAdapter()); $provider = new CompositeQueueProvider( - new AdapterFactoryQueueProvider( - $queue, - ['channel1' => new StubAdapter()], - ), - new AdapterFactoryQueueProvider( - $queue, - ['channel2' => new StubAdapter()], - ), + new PredefinedQueueProvider(['queue1' => $queue1]), + new PredefinedQueueProvider(['queue2' => $queue2]), ); - $this->assertTrue($provider->has('channel1')); - $this->assertTrue($provider->has('channel2')); - $this->assertFalse($provider->has('channel3')); + $this->assertTrue($provider->has('queue1')); + $this->assertTrue($provider->has('queue2')); + $this->assertFalse($provider->has('queue3')); - $this->assertSame('channel1', $provider->get('channel1')->getName()); - $this->assertSame('channel2', $provider->get('channel2')->getName()); + $this->assertSame($queue1, $provider->get('queue1')); + $this->assertSame($queue2, $provider->get('queue2')); } public function testNotFound(): void From fd482afb39bdb6ab36389ca3b866c6c0735bc2ca Mon Sep 17 00:00:00 2001 From: vjik <525501+vjik@users.noreply.github.com> Date: Sun, 15 Mar 2026 17:23:39 +0000 Subject: [PATCH 3/4] Apply PHP CS Fixer and Rector changes (CI) --- tests/Unit/Provider/PredefinedQueueProviderTest.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/Unit/Provider/PredefinedQueueProviderTest.php b/tests/Unit/Provider/PredefinedQueueProviderTest.php index 7268bdac..db836d91 100644 --- a/tests/Unit/Provider/PredefinedQueueProviderTest.php +++ b/tests/Unit/Provider/PredefinedQueueProviderTest.php @@ -12,6 +12,8 @@ use Yiisoft\Queue\Stubs\StubQueue; use Yiisoft\Queue\Tests\Unit\Support\StringEnum; +use stdClass; + use function sprintf; final class PredefinedQueueProviderTest extends TestCase @@ -64,7 +66,7 @@ public function testInvalidQueueConfig(): void ), ); new PredefinedQueueProvider([ - 'queue1' => new \stdClass(), + 'queue1' => new stdClass(), ]); } From d585134982260fb9af082cb32d820d630f0a1f18 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sun, 15 Mar 2026 20:28:38 +0300 Subject: [PATCH 4/4] fix --- tests/Unit/Provider/CompositeQueueProviderTest.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/Unit/Provider/CompositeQueueProviderTest.php b/tests/Unit/Provider/CompositeQueueProviderTest.php index c344852a..d115ddd2 100644 --- a/tests/Unit/Provider/CompositeQueueProviderTest.php +++ b/tests/Unit/Provider/CompositeQueueProviderTest.php @@ -33,10 +33,9 @@ public function testBase(): void public function testNotFound(): void { $provider = new CompositeQueueProvider( - new AdapterFactoryQueueProvider( - new StubQueue(new StubAdapter()), - ['channel1' => new StubAdapter()], - ), + new PredefinedQueueProvider([ + 'queue1' => new StubQueue(new StubAdapter()), + ]), ); $this->expectException(QueueNotFoundException::class);