13
13
14
14
use PHPUnit \Framework \TestCase ;
15
15
use Symfony \Component \Console \Tester \CommandTester ;
16
+ use Symfony \Component \Debug \Exception \FlattenException ;
16
17
use Symfony \Component \EventDispatcher \EventDispatcherInterface ;
17
18
use Symfony \Component \Messenger \Command \FailedMessagesRetryCommand ;
18
19
use Symfony \Component \Messenger \Envelope ;
19
20
use Symfony \Component \Messenger \MessageBusInterface ;
21
+ use Symfony \Component \Messenger \Retry \RetryStrategyInterface ;
22
+ use Symfony \Component \Messenger \Stamp \ReceivedStamp ;
23
+ use Symfony \Component \Messenger \Stamp \RedeliveryStamp ;
20
24
use Symfony \Component \Messenger \Transport \Receiver \ListableReceiverInterface ;
21
- use Symfony \Component \Messenger \Worker ;
22
25
23
26
class FailedMessagesRetryCommandTest extends TestCase
24
27
{
@@ -34,16 +37,52 @@ public function testBasicRun()
34
37
// the bus should be called in the worker
35
38
$ bus ->expects ($ this ->exactly (2 ))->method ('dispatch ' )->willReturn (new Envelope (new \stdClass ()));
36
39
37
- $ command = new FailedMessagesRetryCommand (
38
- 'failure_receiver ' ,
39
- $ receiver ,
40
- $ bus ,
41
- $ dispatcher
42
- );
40
+ $ command = new FailedMessagesRetryCommand ('failure_receiver ' , $ receiver , $ bus , $ dispatcher );
43
41
44
42
$ tester = new CommandTester ($ command );
45
43
$ tester ->execute (['id ' => [10 , 12 ]]);
46
44
47
45
$ this ->assertStringContainsString ('[OK] ' , $ tester ->getDisplay ());
48
46
}
47
+
48
+ public function testExceptionOnRetry ()
49
+ {
50
+ $ receiver = $ this ->createMock (ListableReceiverInterface::class);
51
+ $ receiver ->expects ($ this ->once ())->method ('find ' )->with (10 )->willReturn (new Envelope (new \stdClass ()));
52
+ // message will eventually be ack'ed in Worker
53
+ $ receiver ->expects ($ this ->once ())->method ('ack ' );
54
+
55
+ $ dispatcher = $ this ->createMock (EventDispatcherInterface::class);
56
+ $ bus = $ this ->createMock (MessageBusInterface::class);
57
+ // the bus should be called in the worker
58
+ $ bus ->expects ($ this ->at (0 ))
59
+ ->method ('dispatch ' )
60
+ ->with ($ this ->callback (function (Envelope $ envelope ) {
61
+ $ lastReceivedStamp = $ envelope ->last (ReceivedStamp::class);
62
+
63
+ return $ lastReceivedStamp instanceof ReceivedStamp && \is_string ($ lastReceivedStamp ->getTransportName ());
64
+ }))
65
+ ->will ($ this ->throwException (new \Exception ('Mock test exception ' )));
66
+
67
+ $ bus ->expects ($ this ->at (1 ))
68
+ ->method ('dispatch ' )
69
+ ->with ($ this ->callback (function (Envelope $ envelope ) {
70
+ $ lastRedeliveryStamp = $ envelope ->last (RedeliveryStamp::class);
71
+
72
+ return $ lastRedeliveryStamp instanceof RedeliveryStamp &&
73
+ \is_string ($ lastRedeliveryStamp ->getExceptionMessage ()) &&
74
+ $ lastRedeliveryStamp ->getFlattenException () instanceof FlattenException;
75
+ }))
76
+ ->willReturn (new Envelope (new \stdClass ()));
77
+
78
+ $ retryStrategy = $ this ->createMock (RetryStrategyInterface::class);
79
+ $ retryStrategy ->expects ($ this ->once ())->method ('isRetryable ' )->with ($ this ->isInstanceOf (Envelope::class))->willReturn (true );
80
+
81
+ $ command = new FailedMessagesRetryCommand ('failure_receiver ' , $ receiver , $ bus , $ dispatcher , $ retryStrategy );
82
+
83
+ $ tester = new CommandTester ($ command );
84
+ $ tester ->execute (['id ' => [10 ]]);
85
+
86
+ $ this ->assertStringContainsString ('[OK] ' , $ tester ->getDisplay ());
87
+ }
49
88
}
0 commit comments