Passed
Pull Request — 1.x (#19)
by Kevin
21:20
created

envelope_collection_assertions()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 24
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 14
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 24
rs 9.7998
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 Symfony\Component\Messenger\Stamp\SerializerStamp;
12
use Zenstruck\Assert;
13
use Zenstruck\Messenger\Test\InteractsWithMessenger;
14
use Zenstruck\Messenger\Test\TestEnvelope;
15
use Zenstruck\Messenger\Test\Tests\Fixture\Messenger\MessageA;
16
use Zenstruck\Messenger\Test\Tests\Fixture\Messenger\MessageAHandler;
17
use Zenstruck\Messenger\Test\Tests\Fixture\Messenger\MessageB;
18
use Zenstruck\Messenger\Test\Tests\Fixture\Messenger\MessageBHandler;
19
use Zenstruck\Messenger\Test\Tests\Fixture\Messenger\MessageC;
20
use Zenstruck\Messenger\Test\Tests\Fixture\Messenger\MessageD;
21
use Zenstruck\Messenger\Test\Tests\Fixture\Messenger\MessageE;
22
use Zenstruck\Messenger\Test\Tests\Fixture\Messenger\MessageF;
23
use Zenstruck\Messenger\Test\Tests\Fixture\NoBundleKernel;
24
25
/**
26
 * @author Kevin Bond <[email protected]>
27
 */
28
final class InteractsWithMessengerTest extends WebTestCase
29
{
30
    use InteractsWithMessenger;
31
32
    /**
33
     * @test
34
     */
35
    public function can_interact_with_queue(): void
36
    {
37
        self::bootKernel();
38
39
        $this->messenger()->queue()->assertEmpty();
40
        $this->assertEmpty(self::$container->get(MessageAHandler::class)->messages);
41
        $this->assertEmpty(self::$container->get(MessageBHandler::class)->messages);
42
43
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageA());
44
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageB());
45
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageA());
46
47
        $this->messenger()->queue()->assertCount(3);
48
        $this->messenger()->queue()->assertContains(MessageA::class);
49
        $this->messenger()->queue()->assertContains(MessageA::class, 2);
50
        $this->messenger()->queue()->assertContains(MessageB::class);
51
        $this->messenger()->queue()->assertContains(MessageB::class, 1);
52
        $this->messenger()->queue()->assertNotContains(MessageC::class);
53
        $this->assertEmpty(self::$container->get(MessageAHandler::class)->messages);
54
        $this->assertEmpty(self::$container->get(MessageBHandler::class)->messages);
55
56
        $this->messenger()->process(2);
57
58
        $this->messenger()->queue()->assertCount(1);
59
        $this->messenger()->queue()->assertContains(MessageA::class, 1);
60
        $this->messenger()->queue()->assertNotContains(MessageB::class);
61
        $this->assertCount(1, self::$container->get(MessageAHandler::class)->messages);
62
        $this->assertCount(1, self::$container->get(MessageBHandler::class)->messages);
63
64
        $this->messenger()->process();
65
66
        $this->messenger()->queue()->assertEmpty();
67
        $this->messenger()->queue()->assertNotContains(MessageA::class);
68
        $this->messenger()->queue()->assertNotContains(MessageB::class);
69
        $this->assertCount(2, self::$container->get(MessageAHandler::class)->messages);
70
        $this->assertCount(1, self::$container->get(MessageBHandler::class)->messages);
71
    }
72
73
    /**
74
     * @test
75
     */
76
    public function can_disable_intercept(): void
77
    {
78
        self::bootKernel();
79
80
        $this->messenger()->unblock();
81
82
        $this->messenger()->queue()->assertEmpty();
83
        $this->messenger()->acknowledged()->assertEmpty();
84
        $this->messenger()->dispatched()->assertEmpty();
85
86
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageA());
87
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageB());
88
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageA());
89
90
        $this->messenger()->queue()->assertEmpty();
91
        $this->messenger()->queue()->assertNotContains(MessageA::class);
92
        $this->messenger()->dispatched()->assertCount(3);
93
        $this->messenger()->dispatched()->assertContains(MessageA::class, 2);
94
        $this->messenger()->dispatched()->assertContains(MessageB::class, 1);
95
        $this->messenger()->acknowledged()->assertCount(3);
96
        $this->messenger()->acknowledged()->assertContains(MessageA::class, 2);
97
        $this->messenger()->acknowledged()->assertContains(MessageB::class, 1);
98
        $this->assertCount(2, self::$container->get(MessageAHandler::class)->messages);
99
        $this->assertCount(1, self::$container->get(MessageBHandler::class)->messages);
100
    }
101
102
    /**
103
     * @test
104
     */
105
    public function disabling_intercept_with_items_on_queue_processes_all(): void
106
    {
107
        self::bootKernel();
108
109
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageA());
110
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageB());
111
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageA());
112
113
        $this->messenger()->queue()->assertCount(3);
114
115
        $this->messenger()->process();
116
117
        $this->messenger()->queue()->assertEmpty();
118
        $this->assertCount(2, self::$container->get(MessageAHandler::class)->messages);
119
        $this->assertCount(1, self::$container->get(MessageBHandler::class)->messages);
120
    }
121
122
    /**
123
     * @test
124
     */
125
    public function unblocking_processes_existing_messages_on_queue(): void
126
    {
127
        self::bootKernel();
128
129
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageA());
130
        self::$container->get(MessageBusInterface::class)->dispatch(new MessageB());
131
132
        $this->messenger()->queue()->assertCount(2);
133
        $this->messenger()->acknowledged()->assertEmpty();
134
135
        $this->messenger()->unblock();
136
137
        $this->messenger()->queue()->assertEmpty();
138
        $this->messenger()->acknowledged()->assertCount(2);
139
    }
140
141
    /**
142
     * @test
143
     */
144
    public function can_access_envelope_collection_items_via_first(): void
145
    {
146
        self::bootKernel();
147
148
        self::$container->get(MessageBusInterface::class)->dispatch($m1 = new MessageA());
149
        self::$container->get(MessageBusInterface::class)->dispatch($m2 = new MessageB());
150
        self::$container->get(MessageBusInterface::class)->dispatch($m3 = new MessageA(true));
151
152
        $this->messenger()->queue()->assertCount(3);
153
154
        $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

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