Skip to content
Open
Show file tree
Hide file tree
Changes from 2 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
4 changes: 4 additions & 0 deletions src/Middleware/Consume/ConsumeMiddlewareFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,11 @@ public function createConsumeMiddleware(
$middleware = $this->create($middlewareDefinition);

if (!$middleware instanceof ConsumeMiddlewareInterface) {
// self::create() always returns an instance of the required interface or throws,
Comment thread
WarLikeLaux marked this conversation as resolved.
Outdated
// so this is unreachable at runtime and kept only for the static analyzer.
// @codeCoverageIgnoreStart
throw new InvalidMiddlewareDefinitionException($middlewareDefinition);
// @codeCoverageIgnoreEnd
}

return $middleware;
Expand Down
4 changes: 4 additions & 0 deletions src/Middleware/FailureHandling/FailureMiddlewareFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,11 @@ public function createFailureMiddleware(
$middleware = $this->create($middlewareDefinition);

if (!$middleware instanceof FailureMiddlewareInterface) {
// self::create() always returns an instance of the required interface or throws,
Comment thread
WarLikeLaux marked this conversation as resolved.
Outdated
// so this is unreachable at runtime and kept only for the static analyzer.
// @codeCoverageIgnoreStart
throw new InvalidMiddlewareDefinitionException($middlewareDefinition);
// @codeCoverageIgnoreEnd
}

return $middleware;
Expand Down
4 changes: 4 additions & 0 deletions src/Middleware/MiddlewareFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,11 @@ protected function create(callable|array|string $definition): object
?? throw new InvalidMiddlewareDefinitionException($definition);
}

// A non-string, non-array value of type callable|array|string is always callable and handled above,
Comment thread
WarLikeLaux marked this conversation as resolved.
Outdated
// so this is unreachable at runtime and kept only for completeness.
// @codeCoverageIgnoreStart
throw new InvalidMiddlewareDefinitionException($definition);
// @codeCoverageIgnoreEnd
}

/**
Expand Down
4 changes: 4 additions & 0 deletions src/Middleware/Push/PushMiddlewareFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,11 @@ public function createPushMiddleware(mixed $middlewareDefinition): PushMiddlewar
$middleware = $this->create($middlewareDefinition);

if (!$middleware instanceof PushMiddlewareInterface) {
// self::create() always returns an instance of the required interface or throws,
Comment thread
WarLikeLaux marked this conversation as resolved.
Outdated
// so this is unreachable at runtime and kept only for the static analyzer.
// @codeCoverageIgnoreStart
throw new InvalidMiddlewareDefinitionException($middlewareDefinition);
// @codeCoverageIgnoreEnd
}

return $middleware;
Expand Down
22 changes: 22 additions & 0 deletions tests/Unit/Command/ListenAllCommandTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,26 @@ public function testExecute(): void

$this->assertEquals(0, $exitCode);
}

public function testRunsWithNegativePause(): void
{
$queue = $this->createMock(QueueInterface::class);
$queue->method('run')->willReturn(1);

$queueProvider = new PredefinedQueueProvider([
'queue1' => $queue,
]);

$loop = $this->createMock(LoopInterface::class);
$loop->method('canContinue')->willReturn(true, false);

$command = new ListenAllCommand(
$queueProvider,
$loop,
);
$input = new ArrayInput(['--pause' => -1], $command->getNativeDefinition());
$exitCode = $command->run($input, $this->createMock(OutputInterface::class));

$this->assertSame(0, $exitCode);
}
}
44 changes: 44 additions & 0 deletions tests/Unit/Debug/QueueDecoratorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -80,4 +80,48 @@ public function testGetName(): void

$this->assertEquals('hello', $decorator->getName());
}

public function testWithMiddlewares(): void
{
$newQueue = $this->createMock(QueueInterface::class);
$newQueue->method('getName')->willReturn('new');
$queue = $this->createMock(QueueInterface::class);
$queue->expects($this->once())
->method('withMiddlewares')
->with('m1', 'm2')
->willReturn($newQueue);
$collector = new QueueCollector();
$decorator = new QueueDecorator(
$queue,
$collector,
);

$result = $decorator->withMiddlewares('m1', 'm2');

$this->assertInstanceOf(QueueDecorator::class, $result);
$this->assertNotSame($decorator, $result);
$this->assertSame('new', $result->getName());
}

public function testWithMiddlewaresAdded(): void
{
$newQueue = $this->createMock(QueueInterface::class);
$newQueue->method('getName')->willReturn('new');
$queue = $this->createMock(QueueInterface::class);
$queue->expects($this->once())
->method('withMiddlewaresAdded')
->with('m1', 'm2')
->willReturn($newQueue);
$collector = new QueueCollector();
$decorator = new QueueDecorator(
$queue,
$collector,
);

$result = $decorator->withMiddlewaresAdded('m1', 'm2');

$this->assertInstanceOf(QueueDecorator::class, $result);
$this->assertNotSame($decorator, $result);
$this->assertSame('new', $result->getName());
}
}
11 changes: 11 additions & 0 deletions tests/Unit/Message/EnvelopeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use LogicException;
use PHPUnit\Framework\TestCase;
use Yiisoft\Queue\Message\GenericMessage;
use Yiisoft\Queue\Tests\App\DummyEnvelope;

final class EnvelopeTest extends TestCase
Expand All @@ -18,4 +19,14 @@ public function testFromData(): void
);
DummyEnvelope::fromData('test', []);
}

public function testWithMetadata(): void
{
$envelope = DummyEnvelope::fromMessage(new GenericMessage('test', 'data'));

$result = $envelope->withMetadata(['key' => 'value']);

$this->assertInstanceOf(DummyEnvelope::class, $result);
$this->assertSame(['key' => 'value'], $result->getMetadata());
}
}
10 changes: 10 additions & 0 deletions tests/Unit/Middleware/FailureHandling/FailureEnvelopeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,16 @@ public function testConstructor(): void
$this->assertSame($metadata, $envelope->getMetadata()[FailureEnvelope::META_FAILURE]);
}

public function testGetFailureMetadata(): void
{
$message = $this->createMessage();
$metadata = ['attempt' => 1, 'error' => 'Test error'];

$envelope = new FailureEnvelope($message, $metadata);

$this->assertSame($metadata, $envelope->getFailureMetadata());
}

public function testFromMessageWithExistingMetadata(): void
{
$existingMetadata = ['attempt' => 1];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
namespace Yiisoft\Queue\Tests\Unit\Middleware\FailureHandling\Implementation;

use Exception;
use InvalidArgumentException;
use PHPUnit\Framework\Assert;
use PHPUnit\Framework\Attributes\DataProvider;
use RuntimeException;
Expand Down Expand Up @@ -167,6 +168,22 @@ public function testQueueSendingStrategies(
self::assertInstanceOf(FailureHandlingRequest::class, $result);
}

public static function nonPositiveMaxAttemptsProvider(): array
{
return [
[0, 'maxAttempts parameter must be a positive integer, 0 given.'],
[-5, 'maxAttempts parameter must be a positive integer, -5 given.'],
];
}

#[DataProvider('nonPositiveMaxAttemptsProvider')]
public function testThrowsOnNonPositiveMaxAttempts(int $maxAttempts, string $expectedMessage): void
{
$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage($expectedMessage);
new SendAgainMiddleware('', $maxAttempts);
}

private function getStrategy(string $strategyName, QueueInterface $queue): FailureMiddlewareInterface
{
return match ($strategyName) {
Expand Down
1 change: 1 addition & 0 deletions tests/Unit/Middleware/Push/MiddlewareFactoryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ public static function invalidMiddlewareDefinitionProvider(): array
'wrong array with int items' => [[7, 42]],
'array with wrong method name' => [[TestCallableMiddleware::class, 'notExists']],
'array wrong class' => [['class' => TestCallableMiddleware::class]],
'non-callable scalar' => [42],
];
}

Expand Down
14 changes: 14 additions & 0 deletions tests/Unit/Provider/QueueFactoryProviderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,20 @@ public function testInvalidQueueConfigOnGet(): void
$provider->get('queue1');
}

public function testInvalidQueueConfigThrownOnCreate(): void
{
$provider = new QueueFactoryProvider(
[
'queue1' => 42,
],
validate: false,
);

$this->expectException(InvalidQueueConfigException::class);
$this->expectExceptionMessage('Invalid definition: 42');
$provider->get('queue1');
}

public function testGetHasByStringEnum(): void
{
$provider = new QueueFactoryProvider(
Expand Down
34 changes: 34 additions & 0 deletions tests/Unit/WorkerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
use Yiisoft\Test\Support\Log\SimpleLogger;
use Yiisoft\Queue\Exception\MessageFailureException;
use Yiisoft\Queue\Message\GenericMessage;
use Yiisoft\Queue\Message\IdEnvelope;
use Yiisoft\Queue\Message\MessageInterface;
use Yiisoft\Queue\Middleware\Consume\ConsumeMiddlewareDispatcher;
use Yiisoft\Queue\Middleware\Consume\ConsumeMiddlewareFactoryInterface;
Expand Down Expand Up @@ -86,6 +87,39 @@ function (MessageInterface $message) {
];
}

public function testProcessLogsMessageId(): void
{
$message = new IdEnvelope(new GenericMessage('simple', ['test-data']), 'message-id-123');
$logger = new SimpleLogger();
$container = new SimpleContainer([FakeHandler::class => new FakeHandler()]);
$handlers = ['simple' => FakeHandler::class];

/** @var MockObject&QueueInterface $queue */
$queue = $this->createMock(QueueInterface::class);
$worker = $this->createWorkerByParams($handlers, $container, $logger);

$worker->process($message, $queue);
FakeHandler::$processedMessages = [];

$messages = $logger->getMessages();
$this->assertSame('Processing message #message-id-123.', $messages[0]['message']);
}

public function testProcessFailsForEmptyMessageType(): void
{
$message = new GenericMessage('', ['test-data']);
$container = new SimpleContainer();
$handlers = [];

/** @var MockObject&QueueInterface $queue */
$queue = $this->createMock(QueueInterface::class);
$worker = $this->createWorkerByParams($handlers, $container);

$this->expectException(RuntimeException::class);
$this->expectExceptionMessage('Queue handler for message type "" does not exist.');
$worker->process($message, $queue);
}

public function testMessageFailWithDefinitionUndefinedMethodHandler(): void
{
$this->expectExceptionMessage('Queue handler for message type "simple" does not exist');
Expand Down
Loading