|
13 | 13 |
|
14 | 14 | use PHPUnit\Framework\TestCase;
|
15 | 15 | use Psr\Container\ContainerInterface;
|
| 16 | +use Symfony\Component\DependencyInjection\Container; |
16 | 17 | use Symfony\Component\Messenger\Envelope;
|
17 | 18 | use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent;
|
| 19 | +use Symfony\Component\Messenger\Event\WorkerMessageRetriedEvent; |
18 | 20 | use Symfony\Component\Messenger\EventListener\SendFailedMessageForRetryListener;
|
19 | 21 | use Symfony\Component\Messenger\Exception\RecoverableMessageHandlingException;
|
20 | 22 | use Symfony\Component\Messenger\Retry\RetryStrategyInterface;
|
21 | 23 | use Symfony\Component\Messenger\Stamp\DelayStamp;
|
22 | 24 | use Symfony\Component\Messenger\Stamp\RedeliveryStamp;
|
| 25 | +use Symfony\Component\Messenger\Stamp\TransportMessageIdStamp; |
23 | 26 | use Symfony\Component\Messenger\Transport\Sender\SenderInterface;
|
24 | 27 | use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
|
25 | 28 |
|
@@ -190,4 +193,47 @@ public function testEnvelopeKeepOnlyTheLast10Stamps()
|
190 | 193 |
|
191 | 194 | $listener->onMessageFailed($event);
|
192 | 195 | }
|
| 196 | + |
| 197 | + public function testRetriedEnvelopePassesToRetriedEvent() |
| 198 | + { |
| 199 | + $exception = new \Exception('no!'); |
| 200 | + $envelope = new Envelope(new \stdClass()); |
| 201 | + |
| 202 | + $sender = $this->createMock(SenderInterface::class); |
| 203 | + $sender->expects($this->once())->method('send')->willReturnCallback(static function (Envelope $envelope) { |
| 204 | + return $envelope->with(new TransportMessageIdStamp(123)); |
| 205 | + }); |
| 206 | + |
| 207 | + $eventDispatcher = $this->createMock(EventDispatcherInterface::class); |
| 208 | + $eventDispatcher->expects($this->once())->method('dispatch')->willReturnCallback( |
| 209 | + function (WorkerMessageRetriedEvent $retriedEvent) { |
| 210 | + $envelope = $retriedEvent->getEnvelope(); |
| 211 | + |
| 212 | + $transportIdStamp = $envelope->last(TransportMessageIdStamp::class); |
| 213 | + $this->assertNotNull($transportIdStamp); |
| 214 | + |
| 215 | + return $retriedEvent; |
| 216 | + }); |
| 217 | + |
| 218 | + $senderLocator = new Container(); |
| 219 | + $senderLocator->set('my_receiver', $sender); |
| 220 | + |
| 221 | + $retryStrategy = $this->createMock(RetryStrategyInterface::class); |
| 222 | + $retryStrategy->expects($this->once())->method('isRetryable')->willReturn(true); |
| 223 | + $retryStrategy->expects($this->once())->method('getWaitingTime')->willReturn(1000); |
| 224 | + |
| 225 | + $retryStrategyLocator = new Container(); |
| 226 | + $retryStrategyLocator->set('my_receiver', $retryStrategy); |
| 227 | + |
| 228 | + $listener = new SendFailedMessageForRetryListener( |
| 229 | + $senderLocator, |
| 230 | + $retryStrategyLocator, |
| 231 | + null, |
| 232 | + $eventDispatcher |
| 233 | + ); |
| 234 | + |
| 235 | + $event = new WorkerMessageFailedEvent($envelope, 'my_receiver', $exception); |
| 236 | + |
| 237 | + $listener->onMessageFailed($event); |
| 238 | + } |
193 | 239 | }
|
0 commit comments