Passed
Pull Request — 1.x (#17)
by Kevin
01:36
created

can_configure_throwing_exceptions_with_intercept_disabled()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 5
nc 1
nop 0
dl 0
loc 10
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace Zenstruck\Messenger\Test\Tests;
4
5
use PHPUnit\Framework\AssertionFailedError;
6
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
7
use Symfony\Component\HttpKernel\KernelInterface;
8
use Symfony\Component\Messenger\Envelope;
9
use Symfony\Component\Messenger\MessageBusInterface;
10
use Symfony\Component\Messenger\Stamp\DelayStamp;
11
use Zenstruck\Messenger\Test\InteractsWithMessenger;
12
use Zenstruck\Messenger\Test\TestEnvelope;
13
use Zenstruck\Messenger\Test\Tests\Fixture\Messenger\MessageA;
14
use Zenstruck\Messenger\Test\Tests\Fixture\Messenger\MessageAHandler;
15
use Zenstruck\Messenger\Test\Tests\Fixture\Messenger\MessageB;
16
use Zenstruck\Messenger\Test\Tests\Fixture\Messenger\MessageBHandler;
17
use Zenstruck\Messenger\Test\Tests\Fixture\Messenger\MessageC;
18
use Zenstruck\Messenger\Test\Tests\Fixture\Messenger\MessageD;
19
use Zenstruck\Messenger\Test\Tests\Fixture\Messenger\MessageE;
20
use Zenstruck\Messenger\Test\Tests\Fixture\Messenger\MessageF;
21
use Zenstruck\Messenger\Test\Tests\Fixture\NoBundleKernel;
22
23
/**
24
 * @author Kevin Bond <[email protected]>
25
 */
26
final class InteractsWithMessengerTest extends WebTestCase
27
{
28
    use InteractsWithMessenger;
29
30
    /**
31
     * @test
32
     */
33
    public function can_interact_with_queue(): void
34
    {
35
        self::bootKernel();
36
37
        $this->messenger()->queue()->assertEmpty();
38
        $this->assertEmpty(self::$container->get(MessageAHandler::class)->messages);
39
        $this->assertEmpty(self::$container->get(MessageBHandler::class)->messages);
40
41
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageA());
42
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageB());
43
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageA());
44
45
        $this->messenger()->queue()->assertCount(3);
46
        $this->messenger()->queue()->assertContains(MessageA::class);
47
        $this->messenger()->queue()->assertContains(MessageA::class, 2);
48
        $this->messenger()->queue()->assertContains(MessageB::class);
49
        $this->messenger()->queue()->assertContains(MessageB::class, 1);
50
        $this->messenger()->queue()->assertNotContains(MessageC::class);
51
        $this->assertEmpty(self::$container->get(MessageAHandler::class)->messages);
52
        $this->assertEmpty(self::$container->get(MessageBHandler::class)->messages);
53
54
        $this->messenger()->process(2);
55
56
        $this->messenger()->queue()->assertCount(1);
57
        $this->messenger()->queue()->assertContains(MessageA::class, 1);
58
        $this->messenger()->queue()->assertNotContains(MessageB::class);
59
        $this->assertCount(1, self::$container->get(MessageAHandler::class)->messages);
60
        $this->assertCount(1, self::$container->get(MessageBHandler::class)->messages);
61
62
        $this->messenger()->process();
63
64
        $this->messenger()->queue()->assertEmpty();
65
        $this->messenger()->queue()->assertNotContains(MessageA::class);
66
        $this->messenger()->queue()->assertNotContains(MessageB::class);
67
        $this->assertCount(2, self::$container->get(MessageAHandler::class)->messages);
68
        $this->assertCount(1, self::$container->get(MessageBHandler::class)->messages);
69
    }
70
71
    /**
72
     * @test
73
     */
74
    public function can_disable_intercept(): void
75
    {
76
        self::bootKernel();
77
78
        $this->messenger()->unblock();
79
80
        $this->messenger()->queue()->assertEmpty();
81
        $this->messenger()->acknowledged()->assertEmpty();
82
        $this->messenger()->dispatched()->assertEmpty();
83
84
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageA());
85
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageB());
86
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageA());
87
88
        $this->messenger()->queue()->assertEmpty();
89
        $this->messenger()->queue()->assertNotContains(MessageA::class);
90
        $this->messenger()->dispatched()->assertCount(3);
91
        $this->messenger()->dispatched()->assertContains(MessageA::class, 2);
92
        $this->messenger()->dispatched()->assertContains(MessageB::class, 1);
93
        $this->messenger()->acknowledged()->assertCount(3);
94
        $this->messenger()->acknowledged()->assertContains(MessageA::class, 2);
95
        $this->messenger()->acknowledged()->assertContains(MessageB::class, 1);
96
        $this->assertCount(2, self::$container->get(MessageAHandler::class)->messages);
97
        $this->assertCount(1, self::$container->get(MessageBHandler::class)->messages);
98
    }
99
100
    /**
101
     * @test
102
     */
103
    public function disabling_intercept_with_items_on_queue_processes_all(): void
104
    {
105
        self::bootKernel();
106
107
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageA());
108
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageB());
109
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageA());
110
111
        $this->messenger()->queue()->assertCount(3);
112
113
        $this->messenger()->process();
114
115
        $this->messenger()->queue()->assertEmpty();
116
        $this->assertCount(2, self::$container->get(MessageAHandler::class)->messages);
117
        $this->assertCount(1, self::$container->get(MessageBHandler::class)->messages);
118
    }
119
120
    /**
121
     * @test
122
     */
123
    public function can_access_envelope_collection_items_via_first(): void
124
    {
125
        self::bootKernel();
126
127
        self::$container->get(MessageBusInterface::class)->dispatch($m1 = new MessageA());
128
        self::$container->get(MessageBusInterface::class)->dispatch($m2 = new MessageB());
129
        self::$container->get(MessageBusInterface::class)->dispatch($m3 = new MessageA(true));
130
131
        $this->messenger()->queue()->assertCount(3);
132
133
        $this->assertSame($m1, $this->messenger()->queue()->first()->getMessage());
0 ignored issues
show
Bug introduced by
The method getMessage() does not exist on Zenstruck\Messenger\Test\TestEnvelope. Since you implemented __call, consider adding a @method annotation. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

133
        $this->assertSame($m1, $this->messenger()->queue()->first()->/** @scrutinizer ignore-call */ getMessage());
Loading history...
134
        $this->assertSame($m2, $this->messenger()->queue()->first(MessageB::class)->getMessage());
135
        $this->assertSame($m3, $this->messenger()->queue()->first(fn(Envelope $e) => $e->getMessage()->fail)->getMessage());
136
        $this->assertSame($m3, $this->messenger()->queue()->first(fn($e) => $e->getMessage()->fail)->getMessage());
137
        $this->assertSame($m3, $this->messenger()->queue()->first(fn(MessageA $m) => $m->fail)->getMessage());
138
    }
139
140
    /**
141
     * @test
142
     */
143
    public function envelope_collection_first_throws_exception_if_no_match(): void
144
    {
145
        self::bootKernel();
146
147
        $this->expectException(\RuntimeException::class);
148
149
        $this->messenger()->queue()->first();
150
    }
151
152
    /**
153
     * @test
154
     */
155
    public function can_make_stamp_assertions_on_test_envelope(): void
156
    {
157
        self::bootKernel();
158
159
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageA(), [new DelayStamp(1000)]);
160
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageB());
161
162
        $this->messenger()->queue()->first()->assertHasStamp(DelayStamp::class);
163
        $this->messenger()->queue()->first(MessageB::class)->assertNotHasStamp(DelayStamp::class);
164
    }
165
166
    /**
167
     * @test
168
     */
169
    public function cannot_access_queue_if_none_registered(): void
170
    {
171
        self::bootKernel(['environment' => 'test']);
172
173
        $this->expectException(\LogicException::class);
174
        $this->expectExceptionMessage('No transports registered');
175
176
        $this->messenger();
177
    }
178
179
    /**
180
     * @test
181
     */
182
    public function accessing_transport_boots_kernel_if_not_yet_booted(): void
183
    {
184
        $this->messenger()->queue()->assertEmpty();
185
    }
186
187
    /**
188
     * @test
189
     */
190
    public function can_interact_with_multiple_queues(): void
191
    {
192
        self::bootKernel(['environment' => 'multi_transport']);
193
194
        $this->messenger('async1')->queue()->assertEmpty();
195
        $this->messenger('async2')->queue()->assertEmpty();
196
        $this->assertEmpty(self::$container->get(MessageAHandler::class)->messages);
197
        $this->assertEmpty(self::$container->get(MessageBHandler::class)->messages);
198
199
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageA());
200
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageB());
201
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageA());
202
203
        $this->messenger('async1')->queue()->assertCount(2);
204
        $this->messenger('async2')->queue()->assertEmpty();
205
        $this->messenger('async1')->queue()->assertContains(MessageA::class);
206
        $this->messenger('async1')->queue()->assertContains(MessageA::class, 2);
207
        $this->messenger('async2')->queue()->assertNotContains(MessageB::class);
208
        $this->assertEmpty(self::$container->get(MessageAHandler::class)->messages);
209
        $this->assertCount(1, self::$container->get(MessageBHandler::class)->messages);
210
211
        $this->messenger('async1')->process(1);
212
213
        $this->messenger('async1')->queue()->assertCount(1);
214
        $this->messenger('async1')->queue()->assertContains(MessageA::class, 1);
215
        $this->messenger('async2')->queue()->assertNotContains(MessageB::class);
216
        $this->assertCount(1, self::$container->get(MessageAHandler::class)->messages);
217
        $this->assertCount(1, self::$container->get(MessageBHandler::class)->messages);
218
219
        $this->messenger('async1')->process();
220
221
        $this->messenger('async1')->queue()->assertEmpty();
222
        $this->messenger('async2')->queue()->assertEmpty();
223
        $this->messenger('async2')->acknowledged()->assertCount(1);
224
        $this->messenger('async2')->acknowledged()->assertContains(MessageB::class, 1);
225
        $this->assertCount(2, self::$container->get(MessageAHandler::class)->messages);
226
        $this->assertCount(1, self::$container->get(MessageBHandler::class)->messages);
227
    }
228
229
    /**
230
     * @test
231
     */
232
    public function can_enable_intercept(): void
233
    {
234
        self::bootKernel(['environment' => 'multi_transport']);
235
236
        $this->messenger('async2')->intercept();
237
238
        $this->messenger('async2')->queue()->assertEmpty();
239
        $this->assertEmpty(self::$container->get(MessageBHandler::class)->messages);
240
241
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageB());
242
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageB());
243
244
        $this->messenger('async2')->queue()->assertCount(2);
245
    }
246
247
    /**
248
     * @test
249
     */
250
    public function cannot_access_queue_that_does_not_exist(): void
251
    {
252
        self::bootKernel(['environment' => 'multi_transport']);
253
254
        $this->expectException(\InvalidArgumentException::class);
255
        $this->expectExceptionMessage('"invalid" not registered');
256
257
        $this->messenger('invalid');
258
    }
259
260
    /**
261
     * @test
262
     */
263
    public function cannot_access_queue_that_is_not_test_transport(): void
264
    {
265
        self::bootKernel(['environment' => 'multi_transport']);
266
267
        $this->expectException(\LogicException::class);
268
        $this->expectExceptionMessage('Transport "async3" needs to be set to "test://" in your test config to use this feature.');
269
270
        $this->messenger('async3');
271
    }
272
273
    /**
274
     * @test
275
     */
276
    public function queue_name_is_required_if_using_multiple_transports(): void
277
    {
278
        self::bootKernel(['environment' => 'multi_transport']);
279
280
        $this->expectException(\LogicException::class);
281
        $this->expectExceptionMessage('Multiple transports are registered (async1, async2, async3), you must specify a name.');
282
283
        $this->messenger();
284
    }
285
286
    /**
287
     * @test
288
     */
289
    public function can_access_message_objects_on_queue(): void
290
    {
291
        self::bootKernel();
292
293
        self::$container->get(MessageBusInterface::class)->dispatch($m1 = new MessageA());
294
        self::$container->get(MessageBusInterface::class)->dispatch($m2 = new MessageB());
295
        self::$container->get(MessageBusInterface::class)->dispatch($m3 = new MessageA());
296
297
        $this->assertSame([$m1, $m2, $m3], $this->messenger()->queue()->messages());
298
        $this->assertSame([$m1, $m3], $this->messenger()->queue()->messages(MessageA::class));
299
        $this->assertSame([$m2], $this->messenger()->queue()->messages(MessageB::class));
300
    }
301
302
    /**
303
     * @test
304
     */
305
    public function can_access_envelopes_on_envelope_collection(): void
306
    {
307
        self::bootKernel();
308
309
        self::$container->get(MessageBusInterface::class)->dispatch($m1 = new MessageA());
310
        self::$container->get(MessageBusInterface::class)->dispatch($m2 = new MessageB());
311
        self::$container->get(MessageBusInterface::class)->dispatch($m3 = new MessageA());
312
313
        $messages = \array_map(fn(TestEnvelope $envelope) => $envelope->getMessage(), $this->messenger()->queue()->all());
314
        $messagesFromIterator = \array_map(fn(TestEnvelope $envelope) => $envelope->getMessage(), \iterator_to_array($this->messenger()->queue()));
315
316
        $this->assertSame([$m1, $m2, $m3], $messages);
317
        $this->assertSame([$m1, $m2, $m3], $messagesFromIterator);
318
    }
319
320
    /**
321
     * @test
322
     */
323
    public function can_access_sent_acknowledged_and_rejected(): void
324
    {
325
        self::bootKernel();
326
327
        self::$container->get(MessageBusInterface::class)->dispatch($m1 = new MessageA(true));
328
        self::$container->get(MessageBusInterface::class)->dispatch($m2 = new MessageB());
329
330
        $this->assertCount(2, $this->messenger()->queue());
331
        $this->assertCount(2, $this->messenger()->dispatched());
332
        $this->assertCount(0, $this->messenger()->acknowledged());
333
        $this->assertCount(0, $this->messenger()->rejected());
334
335
        $this->messenger()->process();
336
337
        $this->assertCount(0, $this->messenger()->queue());
338
        $this->assertCount(2, $this->messenger()->dispatched());
339
        $this->assertCount(1, $this->messenger()->acknowledged());
340
        $this->assertCount(1, $this->messenger()->rejected());
341
    }
342
343
    /**
344
     * @test
345
     */
346
    public function cannot_access_queue_if_bundle_not_enabled(): void
347
    {
348
        self::$class = NoBundleKernel::class;
349
        self::bootKernel(['environment' => 'no_bundle']);
350
        self::$class = null;
351
352
        $this->expectException(\LogicException::class);
353
        $this->expectExceptionMessage('Cannot access transport - is ZenstruckMessengerTestBundle enabled in your test environment?');
354
355
        $this->messenger();
356
    }
357
358
    /**
359
     * @test
360
     */
361
    public function can_configure_throwing_exceptions(): void
362
    {
363
        self::bootKernel();
364
365
        $this->messenger()->throwExceptions();
366
367
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageA(true));
368
369
        $this->expectException(\RuntimeException::class);
370
        $this->expectExceptionMessage('handling failed...');
371
372
        $this->messenger()->process();
373
    }
374
375
    /**
376
     * @test
377
     */
378
    public function can_configure_throwing_exceptions_with_intercept_disabled(): void
379
    {
380
        self::bootKernel();
381
382
        $this->messenger()->throwExceptions()->unblock();
383
384
        $this->expectException(\RuntimeException::class);
385
        $this->expectExceptionMessage('handling failed...');
386
387
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageA(true));
388
    }
389
390
    /**
391
     * @test
392
     */
393
    public function can_disable_exception_catching_in_transport_config(): void
394
    {
395
        self::bootKernel(['environment' => 'multi_transport']);
396
397
        $this->expectException(\RuntimeException::class);
398
        $this->expectExceptionMessage('handling failed...');
399
400
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageB(true));
401
    }
402
403
    /**
404
     * @test
405
     */
406
    public function can_re_enable_exception_catching_if_disabled_in_transport_config(): void
407
    {
408
        self::bootKernel(['environment' => 'multi_transport']);
409
410
        $this->messenger('async2')->catchExceptions();
411
412
        $this->messenger('async2')->rejected()->assertEmpty();
413
414
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageB(true));
415
416
        $this->messenger('async2')->rejected()->assertCount(1);
417
    }
418
419
    /**
420
     * @test
421
     */
422
    public function transport_data_is_persisted_between_requests_and_kernel_shutdown(): void
423
    {
424
        self::bootKernel();
425
426
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageA());
427
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageA(true));
428
429
        $this->messenger()->queue()->assertCount(2);
430
431
        self::ensureKernelShutdown();
432
        self::bootKernel();
433
434
        $this->messenger()->queue()->assertCount(2);
435
436
        $this->messenger()->process();
437
438
        self::ensureKernelShutdown();
439
        self::bootKernel();
440
441
        $this->messenger()->queue()->assertEmpty();
442
        $this->messenger()->dispatched()->assertCount(2);
443
        $this->messenger()->acknowledged()->assertCount(1);
444
        $this->messenger()->rejected()->assertCount(1);
445
446
        self::ensureKernelShutdown();
447
448
        $client = self::createClient();
449
450
        $client->request('GET', '/dispatch');
451
452
        $this->messenger()->queue()->assertCount(1);
453
        $this->messenger()->dispatched()->assertCount(3);
454
        $this->messenger()->acknowledged()->assertCount(1);
455
        $this->messenger()->rejected()->assertCount(1);
456
457
        $client->request('GET', '/dispatch');
458
459
        $this->messenger()->queue()->assertCount(2);
460
        $this->messenger()->dispatched()->assertCount(4);
461
        $this->messenger()->acknowledged()->assertCount(1);
462
        $this->messenger()->rejected()->assertCount(1);
463
    }
464
465
    /**
466
     * @test
467
     */
468
    public function can_reset_transport_data(): void
469
    {
470
        self::bootKernel();
471
472
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageA());
473
474
        $this->messenger()->queue()->assertNotEmpty();
475
476
        $this->messenger()->reset();
477
478
        $this->messenger()->queue()->assertEmpty();
479
    }
480
481
    /**
482
     * @test
483
     */
484
    public function disabling_intercept_is_remembered_between_kernel_reboots(): void
485
    {
486
        self::bootKernel();
487
488
        $this->messenger()->unblock();
489
490
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageA());
491
492
        $this->messenger()->queue()->assertEmpty();
493
        $this->messenger()->dispatched()->assertCount(1);
494
495
        self::ensureKernelShutdown();
496
        self::bootKernel();
497
498
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageA());
499
500
        $this->messenger()->queue()->assertEmpty();
501
        $this->messenger()->dispatched()->assertCount(2);
502
    }
503
504
    /**
505
     * @test
506
     */
507
    public function throwing_exceptions_is_remembered_between_kernel_reboots(): void
508
    {
509
        self::bootKernel();
510
511
        $this->messenger()->throwExceptions();
512
513
        self::ensureKernelShutdown();
514
        self::bootKernel();
515
516
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageA(true));
517
518
        $this->expectException(\RuntimeException::class);
519
        $this->expectErrorMessage('handling failed...');
520
521
        $this->messenger()->process();
522
    }
523
524
    /**
525
     * @test
526
     */
527
    public function can_manually_send_message_to_transport_and_process(): void
528
    {
529
        self::bootKernel();
530
531
        $this->messenger()->queue()->assertEmpty();
532
        $this->assertEmpty(self::$container->get(MessageAHandler::class)->messages);
533
534
        $this->messenger()->send(Envelope::wrap(new MessageA()));
535
536
        $this->messenger()->queue()->assertCount(1);
537
        $this->assertEmpty(self::$container->get(MessageAHandler::class)->messages);
538
539
        $this->messenger()->process();
540
541
        $this->messenger()->queue()->assertEmpty();
542
        $this->assertCount(1, self::$container->get(MessageAHandler::class)->messages);
543
    }
544
545
    /**
546
     * @test
547
     */
548
    public function process_all_is_recursive(): void
549
    {
550
        self::bootKernel();
551
552
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageD());
553
554
        $this->messenger()->queue()->assertCount(1);
555
        $this->messenger()->queue()->assertContains(MessageD::class, 1);
556
557
        $this->messenger()->process();
558
559
        $this->messenger()->queue()->assertEmpty();
560
        $this->messenger()->dispatched()->assertCount(3);
561
        $this->messenger()->acknowledged()->assertCount(3);
562
        $this->messenger()->acknowledged()->assertContains(MessageD::class, 1);
563
        $this->messenger()->acknowledged()->assertContains(MessageE::class, 1);
564
        $this->messenger()->acknowledged()->assertContains(MessageF::class, 1);
565
    }
566
567
    /**
568
     * @test
569
     */
570
    public function process_x_messages_is_recursive(): void
571
    {
572
        self::bootKernel();
573
574
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageD());
575
576
        $this->messenger()->queue()->assertCount(1);
577
        $this->messenger()->queue()->assertContains(MessageD::class, 1);
578
579
        $this->messenger()->process(1);
580
581
        $this->messenger()->queue()->assertCount(1);
582
        $this->messenger()->queue()->assertContains(MessageE::class, 1);
583
        $this->messenger()->acknowledged()->assertCount(1);
584
        $this->messenger()->acknowledged()->assertContains(MessageD::class, 1);
585
586
        $this->messenger()->process(2);
587
588
        $this->messenger()->queue()->assertEmpty();
589
        $this->messenger()->acknowledged()->assertCount(3);
590
        $this->messenger()->acknowledged()->assertContains(MessageE::class, 1);
591
        $this->messenger()->acknowledged()->assertContains(MessageF::class, 1);
592
    }
593
594
    /**
595
     * @test
596
     */
597
    public function fails_if_trying_to_process_more_messages_than_can_be_processed(): void
598
    {
599
        self::bootKernel();
600
601
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageA());
602
603
        try {
604
            $this->messenger()->process(2);
605
        } catch (AssertionFailedError $e) {
606
            $this->assertStringContainsString('Expected to process 2 messages but only 1 was processed.', $e->getMessage());
607
            $this->messenger()->queue()->assertEmpty();
608
            $this->messenger()->acknowledged()->assertContains(MessageA::class, 1);
609
610
            return;
611
        }
612
613
        $this->fail('Did not fail.');
614
    }
615
616
    /**
617
     * @test
618
     */
619
    public function process_fails_if_no_messages_on_queue(): void
620
    {
621
        self::bootKernel();
622
623
        try {
624
            $this->messenger()->process();
625
        } catch (AssertionFailedError $e) {
626
            $this->assertStringContainsString('No messages to process.', $e->getMessage());
627
628
            return;
629
        }
630
631
        $this->fail('Did not fail.');
632
    }
633
634
    protected static function bootKernel(array $options = []): KernelInterface
635
    {
636
        return parent::bootKernel(\array_merge(['environment' => 'single_transport'], $options));
637
    }
638
}
639