Skip to content

Commit e00d295

Browse files
committed
Add envelope tests
1 parent ae4de26 commit e00d295

File tree

4 files changed

+216
-8
lines changed

4 files changed

+216
-8
lines changed

src/Message/IdEnvelope.php

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public function __construct(
2121

2222
public static function fromMessage(MessageInterface $message): self
2323
{
24-
return new self($message, $message->getMetadata()[self::MESSAGE_ID_KEY] ?? null);
24+
return new self($message, self::getIdFromMessage($message));
2525
}
2626

2727
public function setId(string|int|null $id): void
@@ -31,11 +31,27 @@ public function setId(string|int|null $id): void
3131

3232
public function getId(): string|int|null
3333
{
34-
return $this->id ?? $this->message->getMetadata()[self::MESSAGE_ID_KEY] ?? null;
34+
return $this->id ?? self::getIdFromMessage($this->message);
3535
}
3636

3737
private function getEnvelopeMetadata(): array
3838
{
3939
return [self::MESSAGE_ID_KEY => $this->getId()];
4040
}
41+
42+
private static function getIdFromMessage(MessageInterface $message): string|int|null
43+
{
44+
$id = $message->getMetadata()[self::MESSAGE_ID_KEY] ?? null;
45+
if ($id instanceof \Stringable) {
46+
$id = (string) $id;
47+
}
48+
49+
// We don't throw an error as this value could come from external sources,
50+
// and we should process the message either way
51+
if (!is_string($id) && !is_int($id)) {
52+
return null;
53+
}
54+
55+
return $id;
56+
}
4157
}
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Yiisoft\Queue\Tests\Unit\Message;
6+
7+
use PHPUnit\Framework\TestCase;
8+
use Yiisoft\Queue\Message\IdEnvelope;
9+
use Yiisoft\Queue\Message\Message;
10+
use Yiisoft\Queue\Message\MessageInterface;
11+
12+
final class IdEnvelopeTest extends TestCase
13+
{
14+
public function testConstructor(): void
15+
{
16+
$message = $this->createMessage();
17+
$id = 'test-id';
18+
19+
$envelope = new IdEnvelope($message, $id);
20+
21+
$this->assertSame($message, $envelope->getMessage());
22+
$this->assertSame($id, $envelope->getId());
23+
}
24+
25+
public function testFromMessageWithStringId(): void
26+
{
27+
$id = 'test-id';
28+
$message = $this->createMessage([IdEnvelope::MESSAGE_ID_KEY => $id]);
29+
30+
$envelope = IdEnvelope::fromMessage($message);
31+
32+
$this->assertSame($id, $envelope->getId());
33+
}
34+
35+
public function testFromMessageWithIntId(): void
36+
{
37+
$id = 123;
38+
$message = $this->createMessage([IdEnvelope::MESSAGE_ID_KEY => $id]);
39+
40+
$envelope = IdEnvelope::fromMessage($message);
41+
42+
$this->assertSame($id, $envelope->getId());
43+
}
44+
45+
public function testFromMessageWithNullId(): void
46+
{
47+
$message = $this->createMessage();
48+
49+
$envelope = IdEnvelope::fromMessage($message);
50+
51+
$this->assertNull($envelope->getId());
52+
}
53+
54+
public function testFromMessageWithObjectHavingToString(): void
55+
{
56+
$stringableObject = new class () {
57+
public function __toString(): string
58+
{
59+
return 'object-id';
60+
}
61+
};
62+
$message = $this->createMessage([IdEnvelope::MESSAGE_ID_KEY => $stringableObject]);
63+
$envelope = IdEnvelope::fromMessage($message);
64+
65+
$this->assertSame('object-id', $envelope->getId());
66+
}
67+
68+
public function testFromMessageWithInvalidIdType(): void
69+
{
70+
$invalidId = ['array-cannot-be-id'];
71+
$message = $this->createMessage([IdEnvelope::MESSAGE_ID_KEY => $invalidId]);
72+
$message = IdEnvelope::fromMessage($message);
73+
74+
$this->assertNull($message->getId());
75+
}
76+
77+
public function testGetEnvelopeMetadata(): void
78+
{
79+
$id = 'test-id';
80+
$message = $this->createMessage();
81+
$envelope = new IdEnvelope($message, $id);
82+
83+
$metadata = $envelope->getMetadata();
84+
85+
$this->assertArrayHasKey(IdEnvelope::MESSAGE_ID_KEY, $metadata);
86+
$this->assertSame($id, $metadata[IdEnvelope::MESSAGE_ID_KEY]);
87+
}
88+
89+
public function testFromData(): void
90+
{
91+
$handlerName = 'test-handler';
92+
$data = ['key' => 'value'];
93+
$metadata = ['meta' => 'data', IdEnvelope::MESSAGE_ID_KEY => 'test-id'];
94+
95+
/**
96+
* @var IdEnvelope $envelope
97+
*/
98+
$envelope = IdEnvelope::fromData($handlerName, $data, $metadata);
99+
100+
$this->assertInstanceOf(IdEnvelope::class, $envelope);
101+
$this->assertSame($handlerName, $envelope->getHandlerName());
102+
$this->assertSame($data, $envelope->getData());
103+
$this->assertArrayHasKey('meta', $envelope->getMetadata());
104+
$this->assertSame('data', $envelope->getMetadata()['meta']);
105+
$this->assertSame('test-id', $envelope->getId());
106+
}
107+
108+
private function createMessage(array $metadata = []): MessageInterface
109+
{
110+
return new Message('test-handler', ['test-data'], $metadata);
111+
}
112+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Yiisoft\Queue\Tests\Unit\Middleware\FailureHandling;
6+
7+
use PHPUnit\Framework\TestCase;
8+
use Yiisoft\Queue\Message\Message;
9+
use Yiisoft\Queue\Message\MessageInterface;
10+
use Yiisoft\Queue\Middleware\FailureHandling\FailureEnvelope;
11+
12+
final class FailureEnvelopeTest extends TestCase
13+
{
14+
public function testConstructor(): void
15+
{
16+
$message = $this->createMessage();
17+
$metadata = ['attempt' => 1, 'error' => 'Test error'];
18+
19+
$envelope = new FailureEnvelope($message, $metadata);
20+
21+
$this->assertSame($message, $envelope->getMessage());
22+
$this->assertArrayHasKey(FailureEnvelope::FAILURE_META_KEY, $envelope->getMetadata());
23+
$this->assertSame($metadata, $envelope->getMetadata()[FailureEnvelope::FAILURE_META_KEY]);
24+
}
25+
26+
public function testFromMessageWithExistingMetadata(): void
27+
{
28+
$existingMetadata = ['attempt' => 1];
29+
$message = $this->createMessage([FailureEnvelope::FAILURE_META_KEY => $existingMetadata]);
30+
31+
$envelope = FailureEnvelope::fromMessage($message);
32+
33+
$this->assertSame($existingMetadata, $envelope->getMetadata()[FailureEnvelope::FAILURE_META_KEY]);
34+
}
35+
36+
public function testFromMessageWithoutMetadata(): void
37+
{
38+
$message = $this->createMessage();
39+
40+
$envelope = FailureEnvelope::fromMessage($message);
41+
42+
$this->assertArrayHasKey(FailureEnvelope::FAILURE_META_KEY, $envelope->getMetadata());
43+
$this->assertSame([], $envelope->getMetadata()[FailureEnvelope::FAILURE_META_KEY]);
44+
}
45+
46+
public function testMetadataMerging(): void
47+
{
48+
$existingMetadata = ['attempt' => 1, 'firstError' => 'First error'];
49+
$message = $this->createMessage([FailureEnvelope::FAILURE_META_KEY => $existingMetadata]);
50+
$newMetadata = ['attempt' => 2, 'lastError' => 'Last error'];
51+
52+
$envelope = new FailureEnvelope($message, $newMetadata);
53+
54+
$mergedMetadata = $envelope->getMetadata()[FailureEnvelope::FAILURE_META_KEY];
55+
$this->assertSame(2, $mergedMetadata['attempt']);
56+
$this->assertSame('First error', $mergedMetadata['firstError']);
57+
$this->assertSame('Last error', $mergedMetadata['lastError']);
58+
}
59+
60+
public function testFromData(): void
61+
{
62+
$handlerName = 'test-handler';
63+
$data = ['key' => 'value'];
64+
$metadata = [
65+
'meta' => 'data',
66+
FailureEnvelope::FAILURE_META_KEY => ['attempt' => 1],
67+
];
68+
69+
$envelope = FailureEnvelope::fromData($handlerName, $data, $metadata);
70+
71+
$this->assertInstanceOf(FailureEnvelope::class, $envelope);
72+
$this->assertSame($handlerName, $envelope->getHandlerName());
73+
$this->assertSame($data, $envelope->getData());
74+
$this->assertArrayHasKey('meta', $envelope->getMetadata());
75+
$this->assertSame('data', $envelope->getMetadata()['meta']);
76+
$this->assertSame(['attempt' => 1], $envelope->getMetadata()[FailureEnvelope::FAILURE_META_KEY]);
77+
}
78+
79+
private function createMessage(array $metadata = []): MessageInterface
80+
{
81+
return new Message('test-handler', ['test-data'], $metadata);
82+
}
83+
}

tests/Unit/Middleware/FailureHandling/Implementation/SendAgainMiddlewareTest.php

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -151,9 +151,6 @@ public function testQueueSendingStrategies(
151151
$this->expectExceptionMessage('testException');
152152
}
153153

154-
$metaInitial = [FailureEnvelope::FAILURE_META_KEY => $metaInitial];
155-
$metaResult = [FailureEnvelope::FAILURE_META_KEY => $metaResult];
156-
157154
$handler = $this->getHandler($metaResult, $suites);
158155
$queue = $this->getPreparedQueue($metaResult, $suites);
159156

@@ -162,7 +159,7 @@ public function testQueueSendingStrategies(
162159
new Message(
163160
'test',
164161
null,
165-
$metaInitial
162+
[FailureEnvelope::FAILURE_META_KEY => $metaInitial]
166163
),
167164
new Exception('testException'),
168165
$queue
@@ -194,7 +191,7 @@ private function getHandler(array $metaResult, bool $suites): MessageFailureHand
194191
$pipelineAssertion = static function (FailureHandlingRequest $request) use (
195192
$metaResult
196193
): FailureHandlingRequest {
197-
Assert::assertEquals($metaResult, $request->getMessage()->getMetadata());
194+
Assert::assertEquals($metaResult, $request->getMessage()->getMetadata()[FailureEnvelope::FAILURE_META_KEY] ?? []);
198195

199196
throw $request->getException();
200197
};
@@ -209,7 +206,7 @@ private function getHandler(array $metaResult, bool $suites): MessageFailureHand
209206
private function getPreparedQueue(array $metaResult, bool $suites): QueueInterface
210207
{
211208
$queueAssertion = static function (MessageInterface $message) use ($metaResult): MessageInterface {
212-
Assert::assertEquals($metaResult, $message->getMetadata());
209+
Assert::assertEquals($metaResult, $message->getMetadata()[FailureEnvelope::FAILURE_META_KEY] ?? []);
213210

214211
return $message;
215212
};

0 commit comments

Comments
 (0)