@@ -99,6 +99,86 @@ public function testThrowingEventsHandlingWontStopExecution()
99
99
$ messageBus ->dispatch ($ message );
100
100
}
101
101
102
+ public function testLongChainWithExceptions ()
103
+ {
104
+ $ command = new DummyMessage ('Level 0 ' );
105
+
106
+ $ eventL1a = new DummyEvent ('Event level 1A ' );
107
+ $ eventL1b = new DummyEvent ('Event level 1B ' ); // will dispatch 2 more events
108
+ $ eventL1c = new DummyEvent ('Event level 1C ' );
109
+
110
+ $ eventL2a = new DummyEvent ('Event level 2A ' ); // Will dispatch 1 event and throw exception
111
+ $ eventL2b = new DummyEvent ('Event level 2B ' ); // Will dispatch 1 event
112
+
113
+ $ eventL3a = new DummyEvent ('Event level 3A ' ); // This should never get handled.
114
+ $ eventL3b = new DummyEvent ('Event level 3B ' );
115
+
116
+ $ middleware = new DispatchAfterCurrentBusMiddleware ();
117
+ $ handlingMiddleware = $ this ->createMock (MiddlewareInterface::class);
118
+
119
+ $ eventBus = new MessageBus ([
120
+ $ middleware ,
121
+ $ handlingMiddleware ,
122
+ ]);
123
+
124
+ // The command bus will dispatch 3 events.
125
+ $ commandBus = new MessageBus ([
126
+ $ middleware ,
127
+ new DispatchingMiddleware ($ eventBus , [
128
+ new Envelope ($ eventL1a , [new DispatchAfterCurrentBusStamp ()]),
129
+ new Envelope ($ eventL1b , [new DispatchAfterCurrentBusStamp ()]),
130
+ new Envelope ($ eventL1c , [new DispatchAfterCurrentBusStamp ()]),
131
+ ]),
132
+ $ handlingMiddleware ,
133
+ ]);
134
+
135
+ // Expect main dispatched message to be handled first:
136
+ $ this ->expectHandledMessage ($ handlingMiddleware , 0 , $ command );
137
+
138
+ $ this ->expectHandledMessage ($ handlingMiddleware , 1 , $ eventL1a );
139
+
140
+ // Handling $eventL1b will dispatch 2 more events
141
+ $ handlingMiddleware ->expects ($ this ->at (2 ))->method ('handle ' )->with ($ this ->callback (function (Envelope $ envelope ) use ($ eventL1b ) {
142
+ return $ envelope ->getMessage () === $ eventL1b ;
143
+ }))->willReturnCallback (function ($ envelope , StackInterface $ stack ) use ($ eventBus , $ eventL2a , $ eventL2b ) {
144
+ $ envelope1 = new Envelope ($ eventL2a , [new DispatchAfterCurrentBusStamp ()]);
145
+ $ eventBus ->dispatch ($ envelope1 );
146
+ $ eventBus ->dispatch (new Envelope ($ eventL2b , [new DispatchAfterCurrentBusStamp ()]));
147
+
148
+ return $ stack ->next ()->handle ($ envelope , $ stack );
149
+ });
150
+
151
+ $ this ->expectHandledMessage ($ handlingMiddleware , 3 , $ eventL1c );
152
+
153
+ // Handle $eventL2a will dispatch event and throw exception
154
+ $ handlingMiddleware ->expects ($ this ->at (4 ))->method ('handle ' )->with ($ this ->callback (function (Envelope $ envelope ) use ($ eventL2a ) {
155
+ return $ envelope ->getMessage () === $ eventL2a ;
156
+ }))->willReturnCallback (function ($ envelope , StackInterface $ stack ) use ($ eventBus , $ eventL3a ) {
157
+ $ eventBus ->dispatch (new Envelope ($ eventL3a , [new DispatchAfterCurrentBusStamp ()]));
158
+
159
+ throw new \RuntimeException ('Some exception while handling Event level 2a ' );
160
+ });
161
+
162
+ // Make sure $eventL2b is handled, since it was dispatched from $eventL1b
163
+ $ handlingMiddleware ->expects ($ this ->at (5 ))->method ('handle ' )->with ($ this ->callback (function (Envelope $ envelope ) use ($ eventL2b ) {
164
+ return $ envelope ->getMessage () === $ eventL2b ;
165
+ }))->willReturnCallback (function ($ envelope , StackInterface $ stack ) use ($ eventBus , $ eventL3b ) {
166
+ $ eventBus ->dispatch (new Envelope ($ eventL3b , [new DispatchAfterCurrentBusStamp ()]));
167
+
168
+ return $ stack ->next ()->handle ($ envelope , $ stack );
169
+ });
170
+
171
+ // We dont handle exception L3a since L2a threw an exception.
172
+ $ this ->expectHandledMessage ($ handlingMiddleware , 6 , $ eventL3b );
173
+
174
+ // Note: $eventL3a should not be handled.
175
+
176
+ $ this ->expectException (DelayedMessageHandlingException::class);
177
+ $ this ->expectExceptionMessage ('RuntimeException: Some exception while handling Event level 2a ' );
178
+
179
+ $ commandBus ->dispatch ($ command );
180
+ }
181
+
102
182
public function testHandleDelayedEventFromQueue ()
103
183
{
104
184
$ message = new DummyMessage ('Hello ' );
0 commit comments