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