@@ -334,4 +334,156 @@ public static function provideCompletionSuggestions()
334
334
yield 'receiver (no repeat) ' => [['async ' , '' ], ['async_high ' , 'failed ' ]];
335
335
yield 'option --bus ' => [['--bus ' , '' ], ['messenger.bus.default ' ]];
336
336
}
337
+
338
+ public function testRunWithExcludeTransportsOption ()
339
+ {
340
+ $ envelope1 = new Envelope (new \stdClass (), [new BusNameStamp ('dummy-bus ' )]);
341
+ $ envelope2 = new Envelope (new \stdClass (), [new BusNameStamp ('dummy-bus ' )]);
342
+ $ envelope3 = new Envelope (new \stdClass (), [new BusNameStamp ('dummy-bus ' )]);
343
+
344
+ $ receiver1 = $ this ->createMock (ReceiverInterface::class);
345
+ $ receiver1 ->method ('get ' )->willReturn ([$ envelope1 ]);
346
+ $ receiver2 = $ this ->createMock (ReceiverInterface::class);
347
+ $ receiver2 ->method ('get ' )->willReturn ([$ envelope2 ]);
348
+ $ receiver3 = $ this ->createMock (ReceiverInterface::class);
349
+ $ receiver3 ->method ('get ' )->willReturn ([$ envelope3 ]);
350
+
351
+ $ receiverLocator = new Container ();
352
+ $ receiverLocator ->set ('dummy-receiver1 ' , $ receiver1 );
353
+ $ receiverLocator ->set ('dummy-receiver2 ' , $ receiver2 );
354
+ $ receiverLocator ->set ('dummy-receiver3 ' , $ receiver3 );
355
+
356
+ $ bus = $ this ->createMock (MessageBusInterface::class);
357
+ // Only 2 messages should be dispatched (receiver1 and receiver3, receiver2 is excluded)
358
+ $ bus ->expects ($ this ->exactly (2 ))->method ('dispatch ' );
359
+
360
+ $ busLocator = new Container ();
361
+ $ busLocator ->set ('dummy-bus ' , $ bus );
362
+
363
+ $ command = new ConsumeMessagesCommand (
364
+ new RoutableMessageBus ($ busLocator ),
365
+ $ receiverLocator , new EventDispatcher (),
366
+ receiverNames: ['dummy-receiver1 ' , 'dummy-receiver2 ' , 'dummy-receiver3 ' ]
367
+ );
368
+
369
+ $ application = new Application ();
370
+ if (method_exists ($ application , 'addCommand ' )) {
371
+ $ application ->addCommand ($ command );
372
+ } else {
373
+ $ application ->add ($ command );
374
+ }
375
+ $ tester = new CommandTester ($ application ->get ('messenger:consume ' ));
376
+ $ tester ->execute ([
377
+ '--all ' => true ,
378
+ '--exclude-transports ' => ['dummy-receiver2 ' ],
379
+ '--limit ' => 2 ,
380
+ ]);
381
+
382
+ $ tester ->assertCommandIsSuccessful ();
383
+ $ this ->assertStringContainsString ('[OK] Consuming messages from transports "dummy-receiver1, dummy-receiver3" ' , $ tester ->getDisplay ());
384
+ }
385
+
386
+ public function testRunWithExcludeTransportsMultipleQueues ()
387
+ {
388
+ $ envelope1 = new Envelope (new \stdClass (), [new BusNameStamp ('dummy-bus ' )]);
389
+ $ envelope2 = new Envelope (new \stdClass (), [new BusNameStamp ('dummy-bus ' )]);
390
+ $ envelope3 = new Envelope (new \stdClass (), [new BusNameStamp ('dummy-bus ' )]);
391
+ $ envelope4 = new Envelope (new \stdClass (), [new BusNameStamp ('dummy-bus ' )]);
392
+
393
+ $ receiver1 = $ this ->createMock (ReceiverInterface::class);
394
+ $ receiver1 ->method ('get ' )->willReturn ([$ envelope1 ]);
395
+ $ receiver2 = $ this ->createMock (ReceiverInterface::class);
396
+ $ receiver2 ->method ('get ' )->willReturn ([$ envelope2 ]);
397
+ $ receiver3 = $ this ->createMock (ReceiverInterface::class);
398
+ $ receiver3 ->method ('get ' )->willReturn ([$ envelope3 ]);
399
+ $ receiver4 = $ this ->createMock (ReceiverInterface::class);
400
+ $ receiver4 ->method ('get ' )->willReturn ([$ envelope4 ]);
401
+
402
+ $ receiverLocator = new Container ();
403
+ $ receiverLocator ->set ('dummy-receiver1 ' , $ receiver1 );
404
+ $ receiverLocator ->set ('dummy-receiver2 ' , $ receiver2 );
405
+ $ receiverLocator ->set ('dummy-receiver3 ' , $ receiver3 );
406
+ $ receiverLocator ->set ('dummy-receiver4 ' , $ receiver4 );
407
+
408
+ $ bus = $ this ->createMock (MessageBusInterface::class);
409
+ // Only 2 messages should be dispatched (receiver1 and receiver4, receiver2 and receiver3 are excluded)
410
+ $ bus ->expects ($ this ->exactly (2 ))->method ('dispatch ' );
411
+
412
+ $ busLocator = new Container ();
413
+ $ busLocator ->set ('dummy-bus ' , $ bus );
414
+
415
+ $ command = new ConsumeMessagesCommand (
416
+ new RoutableMessageBus ($ busLocator ),
417
+ $ receiverLocator , new EventDispatcher (),
418
+ receiverNames: ['dummy-receiver1 ' , 'dummy-receiver2 ' , 'dummy-receiver3 ' , 'dummy-receiver4 ' ]
419
+ );
420
+
421
+ $ application = new Application ();
422
+ if (method_exists ($ application , 'addCommand ' )) {
423
+ $ application ->addCommand ($ command );
424
+ } else {
425
+ $ application ->add ($ command );
426
+ }
427
+ $ tester = new CommandTester ($ application ->get ('messenger:consume ' ));
428
+ $ tester ->execute ([
429
+ '--all ' => true ,
430
+ '--exclude-transports ' => ['dummy-receiver2 ' , 'dummy-receiver3 ' ],
431
+ '--limit ' => 2 ,
432
+ ]);
433
+
434
+ $ tester ->assertCommandIsSuccessful ();
435
+ $ this ->assertStringContainsString ('[OK] Consuming messages from transports "dummy-receiver1, dummy-receiver4" ' , $ tester ->getDisplay ());
436
+ }
437
+
438
+ public function testExcludeTransportssWithoutAllOptionThrowsException ()
439
+ {
440
+ $ receiverLocator = new Container ();
441
+ $ receiverLocator ->set ('dummy-receiver ' , new \stdClass ());
442
+
443
+ $ command = new ConsumeMessagesCommand (new RoutableMessageBus (new Container ()), $ receiverLocator , new EventDispatcher ());
444
+
445
+ $ application = new Application ();
446
+ if (method_exists ($ application , 'addCommand ' )) {
447
+ $ application ->addCommand ($ command );
448
+ } else {
449
+ $ application ->add ($ command );
450
+ }
451
+ $ tester = new CommandTester ($ application ->get ('messenger:consume ' ));
452
+
453
+ $ this ->expectException (InvalidOptionException::class);
454
+ $ this ->expectExceptionMessage ('The --exclude-transports option can only be used with the --all option. ' );
455
+ $ tester ->execute ([
456
+ 'receivers ' => ['dummy-receiver ' ],
457
+ '--exclude-transports ' => ['dummy-receiver ' ],
458
+ ]);
459
+ }
460
+
461
+ public function testExcludeTransportsWithAllQueuesExcludedThrowsException ()
462
+ {
463
+ $ receiverLocator = new Container ();
464
+ $ receiverLocator ->set ('dummy-receiver1 ' , new \stdClass ());
465
+ $ receiverLocator ->set ('dummy-receiver2 ' , new \stdClass ());
466
+
467
+ $ command = new ConsumeMessagesCommand (
468
+ new RoutableMessageBus (new Container ()),
469
+ $ receiverLocator ,
470
+ new EventDispatcher (),
471
+ receiverNames: ['dummy-receiver1 ' , 'dummy-receiver2 ' ]
472
+ );
473
+
474
+ $ application = new Application ();
475
+ if (method_exists ($ application , 'addCommand ' )) {
476
+ $ application ->addCommand ($ command );
477
+ } else {
478
+ $ application ->add ($ command );
479
+ }
480
+ $ tester = new CommandTester ($ application ->get ('messenger:consume ' ));
481
+
482
+ $ this ->expectException (\Symfony \Component \Console \Exception \RuntimeException::class);
483
+ $ this ->expectExceptionMessage ('All queues have been excluded. Please specify at least one queue to consume from. ' );
484
+ $ tester ->execute ([
485
+ '--all ' => true ,
486
+ '--exclude-transports ' => ['dummy-receiver1 ' , 'dummy-receiver2 ' ],
487
+ ]);
488
+ }
337
489
}
0 commit comments