Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion Command/SetupFabricCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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')
;
}

Expand All @@ -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();
Expand Down
128 changes: 128 additions & 0 deletions Tests/Command/SetupFabricCommandTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
<?php

declare(strict_types=1);

namespace OldSound\RabbitMqBundle\Tests\Command;

use OldSound\RabbitMqBundle\Command\SetupFabricCommand;
use OldSound\RabbitMqBundle\RabbitMq\AmqpPartsHolder;
use OldSound\RabbitMqBundle\RabbitMq\AnonConsumer;
use OldSound\RabbitMqBundle\RabbitMq\BatchConsumer;
use OldSound\RabbitMqBundle\RabbitMq\Consumer;
use OldSound\RabbitMqBundle\RabbitMq\DynamicConsumer;
use OldSound\RabbitMqBundle\RabbitMq\MultipleConsumer;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Tester\CommandTester;

/**
* @covers \OldSound\RabbitMqBundle\Command\SetupFabricCommand
*/
class SetupFabricCommandTest extends KernelTestCase
{
public function testExecute(): 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->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);
}
}
25 changes: 25 additions & 0 deletions Tests/TestKernel.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

declare(strict_types=1);

namespace OldSound\RabbitMqBundle\Tests;

use OldSound\RabbitMqBundle\OldSoundRabbitMqBundle;
use Symfony\Bundle\FrameworkBundle\FrameworkBundle;
use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\HttpKernel\Kernel;

final class TestKernel extends Kernel
{
public function registerBundles(): iterable
{
return [
new FrameworkBundle(),
new OldSoundRabbitMqBundle(),
];
}

public function registerContainerConfiguration(LoaderInterface $loader): void
{
}
}
4 changes: 4 additions & 0 deletions phpunit.xml.dist
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,8 @@
</exclude>
</whitelist>
</filter>

<php>
<server name="KERNEL_CLASS" value="\OldSound\RabbitMqBundle\Tests\TestKernel"/>
</php>
</phpunit>