From 49ba0be928445dc37f5d78efe3e554f50b30bf30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Orlando=20Th=C3=B6ny?= Date: Tue, 2 Dec 2025 12:02:44 +0100 Subject: [PATCH] feat(SetupFabricCommand): add --skip-anon-consumers option --- Command/SetupFabricCommand.php | 13 ++- Tests/Command/SetupFabricCommandTest.php | 128 +++++++++++++++++++++++ Tests/TestKernel.php | 25 +++++ phpunit.xml.dist | 4 + 4 files changed, 169 insertions(+), 1 deletion(-) create mode 100644 Tests/Command/SetupFabricCommandTest.php create mode 100644 Tests/TestKernel.php diff --git a/Command/SetupFabricCommand.php b/Command/SetupFabricCommand.php index c154ae3d..65bc2e0a 100644 --- a/Command/SetupFabricCommand.php +++ b/Command/SetupFabricCommand.php @@ -2,6 +2,7 @@ namespace OldSound\RabbitMqBundle\Command; +use OldSound\RabbitMqBundle\RabbitMq\AnonConsumer; use OldSound\RabbitMqBundle\RabbitMq\DynamicConsumer; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; @@ -15,6 +16,7 @@ protected function configure(): void ->setName('rabbitmq:setup-fabric') ->setDescription('Sets up the Rabbit MQ fabric') ->addOption('debug', 'd', InputOption::VALUE_NONE, 'Enable Debugging') + ->addOption('skip-anon-consumers', null, InputOption::VALUE_NONE, 'Do not run the fabric-setup for anonymous consumers') ; } @@ -24,13 +26,22 @@ protected function execute(InputInterface $input, OutputInterface $output): int define('AMQP_DEBUG', (bool) $input->getOption('debug')); } + $skipAnonConsumers = (bool) $input->getOption('skip-anon-consumers'); + $output->writeln('Setting up the Rabbit MQ fabric'); + if ($skipAnonConsumers && $output->isVeryVerbose()) { + $output->writeln('Skipping fabric-setup for anonymous consumers'); + } + $partsHolder = $this->getContainer()->get('old_sound_rabbit_mq.parts_holder'); foreach (['base_amqp', 'binding'] as $key) { foreach ($partsHolder->getParts('old_sound_rabbit_mq.' . $key) as $baseAmqp) { - if ($baseAmqp instanceof DynamicConsumer) { + if ( + $baseAmqp instanceof DynamicConsumer + || ($skipAnonConsumers && $baseAmqp instanceof AnonConsumer) + ) { continue; } $baseAmqp->setupFabric(); diff --git a/Tests/Command/SetupFabricCommandTest.php b/Tests/Command/SetupFabricCommandTest.php new file mode 100644 index 00000000..f7f92143 --- /dev/null +++ b/Tests/Command/SetupFabricCommandTest.php @@ -0,0 +1,128 @@ +createApplication(); + + $command = new SetupFabricCommand(); + $container = $application->getKernel()->getContainer(); + + $partsHolder = new AmqpPartsHolder(); + $consumer = $this->createMock(Consumer::class); + $consumer->expects($this->once())->method('setupFabric'); + $partsHolder->addPart('old_sound_rabbit_mq.base_amqp', $consumer); + + $multipleConsumer = $this->createMock(MultipleConsumer::class); + $multipleConsumer->expects($this->once())->method('setupFabric'); + $partsHolder->addPart('old_sound_rabbit_mq.base_amqp', $multipleConsumer); + + $batchConsumer = $this->createMock(BatchConsumer::class); + $batchConsumer->expects($this->once())->method('setupFabric'); + $partsHolder->addPart('old_sound_rabbit_mq.base_amqp', $batchConsumer); + + $anonConsumer = $this->createMock(AnonConsumer::class); + $anonConsumer->expects($this->once())->method('setupFabric'); + $partsHolder->addPart('old_sound_rabbit_mq.base_amqp', $anonConsumer); + + $dynamicConsumer = $this->createMock(DynamicConsumer::class); + $dynamicConsumer->expects($this->never())->method('setupFabric'); + $partsHolder->addPart('old_sound_rabbit_mq.base_amqp', $dynamicConsumer); + + $container->set('old_sound_rabbit_mq.parts_holder', $partsHolder); + + $command->setContainer($container); + + // TODO: Use addCommand() once Symfony Support for < 7.4 is dropped + $application->add($command); + + $registeredCommand = $application->find('rabbitmq:setup-fabric'); + + $commandTester = new CommandTester($registeredCommand); + + $commandTester->execute([ + 'command' => $registeredCommand->getName(), + ], [ + 'verbosity' => OutputInterface::VERBOSITY_VERBOSE, + ]); + + self::assertSame(0, $commandTester->getStatusCode()); + } + + public function testExecute_withSkipAnonConsumers(): void + { + $application = $this->createApplication(); + + $command = new SetupFabricCommand(); + $container = $application->getKernel()->getContainer(); + + $partsHolder = new AmqpPartsHolder(); + $consumer = $this->createMock(Consumer::class); + $consumer->expects($this->once())->method('setupFabric'); + $partsHolder->addPart('old_sound_rabbit_mq.base_amqp', $consumer); + + $multipleConsumer = $this->createMock(MultipleConsumer::class); + $multipleConsumer->expects($this->once())->method('setupFabric'); + $partsHolder->addPart('old_sound_rabbit_mq.base_amqp', $multipleConsumer); + + $batchConsumer = $this->createMock(BatchConsumer::class); + $batchConsumer->expects($this->once())->method('setupFabric'); + $partsHolder->addPart('old_sound_rabbit_mq.base_amqp', $batchConsumer); + + $anonConsumer = $this->createMock(AnonConsumer::class); + $anonConsumer->expects($this->never())->method('setupFabric'); + $partsHolder->addPart('old_sound_rabbit_mq.base_amqp', $anonConsumer); + + $dynamicConsumer = $this->createMock(DynamicConsumer::class); + $dynamicConsumer->expects($this->never())->method('setupFabric'); + $partsHolder->addPart('old_sound_rabbit_mq.base_amqp', $dynamicConsumer); + + $container->set('old_sound_rabbit_mq.parts_holder', $partsHolder); + + $command->setContainer($container); + + // TODO: Use addCommand() once Symfony Support for < 7.4 is dropped + $application->add($command); + + $registeredCommand = $application->find('rabbitmq:setup-fabric'); + + $commandTester = new CommandTester($registeredCommand); + + $commandTester->execute([ + 'command' => $registeredCommand->getName(), + '--skip-anon-consumers' => true, + ], [ + 'verbosity' => OutputInterface::VERBOSITY_VERBOSE, + ]); + + self::assertSame(0, $commandTester->getStatusCode()); + } + + private function createApplication(): Application + { + $kernel = self::createKernel(); + $kernel->boot(); + + return new Application($kernel); + } +} diff --git a/Tests/TestKernel.php b/Tests/TestKernel.php new file mode 100644 index 00000000..de765420 --- /dev/null +++ b/Tests/TestKernel.php @@ -0,0 +1,25 @@ + + + + +