16
16
use Symfony \Component \Messenger \Envelope ;
17
17
use Symfony \Component \Messenger \Event \WorkerMessageFailedEvent ;
18
18
use Symfony \Component \Messenger \EventListener \SendFailedMessageForRetryListener ;
19
+ use Symfony \Component \Messenger \Exception \RecoverableMessageHandlingException ;
19
20
use Symfony \Component \Messenger \Retry \RetryStrategyInterface ;
20
21
use Symfony \Component \Messenger \Stamp \DelayStamp ;
21
22
use Symfony \Component \Messenger \Stamp \RedeliveryStamp ;
@@ -40,6 +41,42 @@ public function testNoRetryStrategyCausesNoRetry()
40
41
$ listener ->onMessageFailed ($ event );
41
42
}
42
43
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
+
43
80
public function testEnvelopeIsSentToTransportOnRetry ()
44
81
{
45
82
$ exception = new \Exception ('no! ' );
0 commit comments