8000 Add test and nested exception · symfony/symfony@1d385aa · GitHub
[go: up one dir, main page]

Skip to content

Commit 1d385aa

Browse files
committed
Add test and nested exception
1 parent 654b197 commit 1d385aa

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

src/Symfony/Component/Messenger/EventListener/SendFailedMessageForRetryListener.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,15 @@ private function shouldRetry(\Throwable $e, Envelope $envelope, RetryStrategyInt
9292
return true;
9393
}
9494

95+
// if one or more nested Exceptions is an instance of RecoverableExceptionInterface we should retry
9596
// if ALL nested Exceptions are an instance of UnrecoverableExceptionInterface we should not retry
9697
if ($e instanceof HandlerFailedException) {
9798
$shouldNotRetry = true;
9899
foreach ($e->getNestedExceptions() as $nestedException) {
100+
if ($nestedException instanceof RecoverableExceptionInterface) {
101+
return true;
102+
}
103+
99104
if (!$nestedException instanceof UnrecoverableExceptionInterface) {
100105
$shouldNotRetry = false;
101106
break;

src/Symfony/Component/Messenger/Tests/EventListener/SendFailedMessageForRetryListenerTest.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use Symfony\Component\Messenger\Envelope;
1717
use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent;
1818
use Symfony\Component\Messenger\EventListener\SendFailedMessageForRetryListener;
19+
use Symfony\Component\Messenger\Exception\RecoverableMessageHandlingException;
1920
use Symfony\Component\Messenger\Retry\RetryStrategyInterface;
2021
use Symfony\Component\Messenger\Stamp\DelayStamp;
2122
use Symfony\Component\Messenger\Stamp\RedeliveryStamp;
@@ -40,6 +41,42 @@ public function testNoRetryStrategyCausesNoRetry()
4041
$listener->onMessageFailed($event);
4142
}
4243

44+
public function testRecoverableStrategyCausesRetry()
45+
{
46+
$sender = $this->createMock(SenderInterface::class);
47+
$sender->expects($this->once())->method('send')->willReturnCallback(function (Envelope $envelope) {
48+
/** @var DelayStamp $delayStamp */
49+
$delayStamp = $envelope->last(DelayStamp::class);
50+
/** @var RedeliveryStamp $redeliveryStamp */
51+
$redeliveryStamp = $envelope->last(RedeliveryStamp::class);
52+
53+
$this->assertInstanceOf(DelayStamp::class, $delayStamp);
54+
$this->assertSame(1000, $delayStamp->getDelay());
55+
56+
$this->assertInstanceOf(RedeliveryStamp::class, $redeliveryStamp);
57+
$this->assertSame(1, $redeliveryStamp->getRetryCount());
58+
59+
return $envelope;
60+
});
61+
$senderLocator = $this->createMock(ContainerInterface::class);
62+
$senderLocator->expects($this->once())->method('has')->willReturn(true);
63+
$senderLocator->expects($this->once())->method('get')->willReturn($sender);
64+
$retryStategy = $this->createMock(RetryStrategyInterface::class);
65+
$retryStategy->expects($this->never())->method('isRetryable');
66+
$retryStategy->expects($this->once())->method('getWaitingTime')->willReturn(1000);
67+
$retryStrategyLocator = $this->createMock(ContainerInterface::class);
68+
$retryStrategyLocator->expects($this->once())->method('has')->willReturn(true);
69+
$retryStrategyLocator->expects($this->once())->method('get')->willReturn($retryStategy);
70+
71+
$listener = new SendFailedMessageForRetryListener($senderLocator, $retryStrategyLocator);
72+
73+
$exception = new RecoverableMessageHandlingException('retry');
74+
$envelope = new Envelope(new \stdClass());
75+
$event = new WorkerMessageFailedEvent($envelope, 'my_receiver', $exception);
76+
77+
$listener->onMessageFailed($event);
78+
}
79+
4380
public function testEnvelopeIsSentToTransportOnRetry()
4481
{
4582
$exception = new \Exception('no!');

0 commit comments

Comments
 (0)
0