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 \Retry \ExceptionRetryStrategyInterface ;
19
20
use Symfony \Component \Messenger \Retry \RetryStrategyInterface ;
20
21
use Symfony \Component \Messenger \Stamp \DelayStamp ;
21
22
use Symfony \Component \Messenger \Stamp \RedeliveryStamp ;
@@ -76,4 +77,41 @@ public function testEnvelopeIsSentToTransportOnRetry()
76
77
77
78
$ listener ->onMessageFailed ($ event );
78
79
}
80
+
81
+ public function testEnvelopeIsSentToTransportOnRetryWithExceptionStrategy ()
82
+ {
83
+ $ exception = new \Exception ('no! ' );
84
+ $ envelope = new Envelope (new \stdClass ());
85
+
86
+ $ sender = $ this ->createMock (SenderInterface::class);
87
+ $ sender ->expects ($ this ->once ())->method ('send ' )->willReturnCallback (function (Envelope $ envelope ) {
88
+ /** @var DelayStamp $delayStamp */
89
+ $ delayStamp = $ envelope ->last (DelayStamp::class);
90
+ /** @var RedeliveryStamp $redeliveryStamp */
91
+ $ redeliveryStamp = $ envelope ->last (RedeliveryStamp::class);
92
+
93
+ $ this ->assertInstanceOf (DelayStamp::class, $ delayStamp );
94
+ $ this ->assertSame (1000 , $ delayStamp ->getDelay ());
95
+
96
+ $ this ->assertInstanceOf (RedeliveryStamp::class, $ redeliveryStamp );
97
+ $ this ->assertSame (1 , $ redeliveryStamp ->getRetryCount ());
98
+
99
+ return $ envelope ;
100
+ });
101
+ $ senderLocator = $ this ->createMock (ContainerInterface::class);
102
+ $ senderLocator ->expects ($ this ->once ())->method ('has ' )->willReturn (true );
103
+ $ senderLocator ->expects ($ this ->once ())->method ('get ' )->willReturn ($ sender );
104
+ $ retryStategy = $ this ->createMock (ExceptionRetryStrategyInterface::class);
105
+ $ retryStategy ->expects ($ this ->once ())->method ('isRetryable ' )->with ($ envelope , $ exception )->willReturn (true );
106
+ $ retryStategy ->expects ($ this ->once ())->method ('getWaitingTime ' )->with ($ envelope , $ exception )->willReturn (1000 );
107
+ $ retryStrategyLocator = $ this ->createMock (ContainerInterface::class);
108
+ $ retryStrategyLocator ->expects ($ this ->once ())->method ('has ' )->willReturn (true );
109
+ $ retryStrategyLocator ->expects ($ this ->once ())->method ('get ' )->willReturn ($ retryStategy );
110
+
111
+ $ listener = new SendFailedMessageForRetryListener ($ senderLocator , $ retryStrategyLocator );
112
+
113
+ $ event = new WorkerMessageFailedEvent ($ envelope , 'my_receiver ' , $ exception );
114
+
115
+ $ listener ->onMessageFailed ($ event );
116
+ }
79
117
}
0 commit comments