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