Skip to content

[bundle] Set null transport as default. Prevent errors on bundle install. #77

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
May 15, 2017
Merged
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
5 changes: 5 additions & 0 deletions pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

use Enqueue\Client\TraceableProducer;
use Enqueue\JobQueue\Job;
use Enqueue\Null\Symfony\NullTransportFactory;
use Enqueue\Symfony\DefaultTransportFactory;
use Enqueue\Symfony\TransportFactoryInterface;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\Config\Resource\FileResource;
Expand All @@ -23,6 +25,9 @@ class EnqueueExtension extends Extension implements PrependExtensionInterface
public function __construct()
{
$this->factories = [];

$this->addTransportFactory(new DefaultTransportFactory());
$this->addTransportFactory(new NullTransportFactory());
}

/**
Expand Down
2 changes: 0 additions & 2 deletions pkg/enqueue-bundle/EnqueueBundle.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,6 @@ public function build(ContainerBuilder $container)

/** @var EnqueueExtension $extension */
$extension = $container->getExtension('enqueue');
$extension->addTransportFactory(new DefaultTransportFactory());
$extension->addTransportFactory(new NullTransportFactory());

if (class_exists(StompContext::class)) {
$extension->addTransportFactory(new StompTransportFactory());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use Enqueue\Null\NullContext;
use Enqueue\Null\Symfony\NullTransportFactory;
use Enqueue\Symfony\DefaultTransportFactory;
use Enqueue\Symfony\TransportFactoryInterface;
use Enqueue\Test\ClassExtensionTrait;
use PHPUnit\Framework\TestCase;
use Symfony\Component\DependencyInjection\ContainerBuilder;
Expand All @@ -30,6 +31,25 @@ public function testCouldBeConstructedWithoutAnyArguments()
new EnqueueExtension();
}

public function testShouldRegisterDefaultAndNullTransportFactoriesInConstructor()
{
$extension = new EnqueueExtension();

/** @var TransportFactoryInterface[] $factories */
$factories = $this->readAttribute($extension, 'factories');

$this->assertInternalType('array', $factories);
$this->assertCount(2, $factories);

$this->assertArrayHasKey('default', $factories);
$this->assertInstanceOf(DefaultTransportFactory::class, $factories['default']);
$this->assertEquals('default', $factories['default']->getName());

$this->assertArrayHasKey('null', $factories);
$this->assertInstanceOf(NullTransportFactory::class, $factories['null']);
$this->assertEquals('null', $factories['null']->getName());
}

public function testThrowIfTransportFactoryNameEmpty()
{
$extension = new EnqueueExtension();
Expand All @@ -52,31 +72,32 @@ public function testThrowIfTransportFactoryWithSameNameAlreadyAdded()
$extension->addTransportFactory(new FooTransportFactory('foo'));
}

public function testShouldConfigureNullTransport()
public function testShouldEnabledNullTransportAndSetItAsDefault()
{
$container = new ContainerBuilder();

$extension = new EnqueueExtension();
$extension->addTransportFactory(new NullTransportFactory());

$extension->load([[
'transport' => [
'default' => 'null',
'null' => true,
],
]], $container);

self::assertTrue($container->hasAlias('enqueue.transport.default.context'));
self::assertEquals('enqueue.transport.null.context', (string) $container->getAlias('enqueue.transport.default.context'));

self::assertTrue($container->hasDefinition('enqueue.transport.null.context'));
$context = $container->getDefinition('enqueue.transport.null.context');
self::assertEquals(NullContext::class, $context->getClass());
}

public function testShouldUseNullTransportAsDefault()
public function testShouldUseNullTransportAsDefaultWhenExplicitlyConfigured()
{
$container = new ContainerBuilder();

$extension = new EnqueueExtension();
$extension->addTransportFactory(new NullTransportFactory());
$extension->addTransportFactory(new DefaultTransportFactory());

$extension->load([[
'transport' => [
Expand All @@ -95,30 +116,6 @@ public function testShouldUseNullTransportAsDefault()
);
}

public function testShouldUseNullTransportAsDefaultConfiguredViaDSN()
{
$container = new ContainerBuilder();

$extension = new EnqueueExtension();
$extension->addTransportFactory(new NullTransportFactory());
$extension->addTransportFactory(new DefaultTransportFactory());

$extension->load([[
'transport' => [
'default' => 'null://',
],
]], $container);

self::assertEquals(
'enqueue.transport.default.context',
(string) $container->getAlias('enqueue.transport.context')
);
self::assertEquals(
'enqueue.transport.default_null.context',
(string) $container->getAlias('enqueue.transport.default.context')
);
}

public function testShouldConfigureFooTransport()
{
$container = new ContainerBuilder();
Expand All @@ -144,7 +141,6 @@ public function testShouldUseFooTransportAsDefault()

$extension = new EnqueueExtension();
$extension->addTransportFactory(new FooTransportFactory());
$extension->addTransportFactory(new DefaultTransportFactory());

$extension->load([[
'transport' => [
Expand All @@ -168,7 +164,6 @@ public function testShouldLoadClientServicesWhenEnabled()
$container = new ContainerBuilder();

$extension = new EnqueueExtension();
$extension->addTransportFactory(new DefaultTransportFactory());
$extension->addTransportFactory(new FooTransportFactory());

$extension->load([[
Expand All @@ -191,7 +186,6 @@ public function testShouldUseProducerByDefault()
$container->setParameter('kernel.debug', false);

$extension = new EnqueueExtension();
$extension->addTransportFactory(new DefaultTransportFactory());
$extension->addTransportFactory(new FooTransportFactory());

$extension->load([[
Expand All @@ -214,7 +208,6 @@ public function testShouldUseMessageProducerIfTraceableProducerOptionSetToFalseE
$container->setParameter('kernel.debug', false);

$extension = new EnqueueExtension();
$extension->addTransportFactory(new DefaultTransportFactory());
$extension->addTransportFactory(new FooTransportFactory());

$extension->load([[
Expand All @@ -239,7 +232,6 @@ public function testShouldUseTraceableMessageProducerIfTraceableProducerOptionSe
$container->setParameter('kernel.debug', true);

$extension = new EnqueueExtension();
$extension->addTransportFactory(new DefaultTransportFactory());
$extension->addTransportFactory(new FooTransportFactory());

$extension->load([[
Expand Down Expand Up @@ -274,7 +266,6 @@ public function testShouldLoadDelayRedeliveredMessageExtensionIfRedeliveredDelay
$container->setParameter('kernel.debug', true);

$extension = new EnqueueExtension();
$extension->addTransportFactory(new DefaultTransportFactory());
$extension->addTransportFactory(new FooTransportFactory());

$extension->load([[
Expand All @@ -300,7 +291,6 @@ public function testShouldNotLoadDelayRedeliveredMessageExtensionIfRedeliveredDe
$container->setParameter('kernel.debug', true);

$extension = new EnqueueExtension();
$extension->addTransportFactory(new DefaultTransportFactory());
$extension->addTransportFactory(new FooTransportFactory());

$extension->load([[
Expand Down
38 changes: 8 additions & 30 deletions pkg/enqueue-bundle/Tests/Unit/EnqueueBundleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -84,28 +84,6 @@ public function testShouldRegisterExpectedCompilerPasses()
$bundle->build($container);
}

public function testShouldRegisterDefaultAndNullTransportFactories()
{
$extensionMock = $this->createEnqueueExtensionMock();

$container = new ContainerBuilder();
$container->registerExtension($extensionMock);

$extensionMock
->expects($this->at(0))
->method('addTransportFactory')
->with($this->isInstanceOf(DefaultTransportFactory::class))
;
$extensionMock
->expects($this->at(1))
->method('addTransportFactory')
->with($this->isInstanceOf(NullTransportFactory::class))
;

$bundle = new EnqueueBundle();
$bundle->build($container);
}

public function testShouldRegisterStompAndRabbitMqStompTransportFactories()
{
$extensionMock = $this->createEnqueueExtensionMock();
Expand All @@ -114,12 +92,12 @@ public function testShouldRegisterStompAndRabbitMqStompTransportFactories()
$container->registerExtension($extensionMock);

$extensionMock
->expects($this->at(2))
->expects($this->at(0))
->method('addTransportFactory')
->with($this->isInstanceOf(StompTransportFactory::class))
;
$extensionMock
->expects($this->at(3))
->expects($this->at(1))
->method('addTransportFactory')
->with($this->isInstanceOf(RabbitMqStompTransportFactory::class))
;
Expand All @@ -136,12 +114,12 @@ public function testShouldRegisterAmqpAndRabbitMqAmqpTransportFactories()
$container->registerExtension($extensionMock);

$extensionMock
->expects($this->at(4))
->expects($this->at(2))
->method('addTransportFactory')
->with($this->isInstanceOf(AmqpTransportFactory::class))
;
$extensionMock
->expects($this->at(5))
->expects($this->at(3))
->method('addTransportFactory')
->with($this->isInstanceOf(RabbitMqAmqpTransportFactory::class))
;
Expand All @@ -158,7 +136,7 @@ public function testShouldRegisterFSTransportFactory()
$container->registerExtension($extensionMock);

$extensionMock
->expects($this->at(6))
->expects($this->at(4))
->method('addTransportFactory')
->with($this->isInstanceOf(FsTransportFactory::class))
;
Expand All @@ -175,7 +153,7 @@ public function testShouldRegisterRedisTransportFactory()
$container->registerExtension($extensionMock);

$extensionMock
->expects($this->at(7))
->expects($this->at(5))
->method('addTransportFactory')
->with($this->isInstanceOf(RedisTransportFactory::class))
;
Expand All @@ -192,7 +170,7 @@ public function testShouldRegisterDbalTransportFactory()
$container->registerExtension($extensionMock);

$extensionMock
->expects($this->at(8))
->expects($this->at(6))
->method('addTransportFactory')
->with($this->isInstanceOf(DbalTransportFactory::class))
;
Expand All @@ -209,7 +187,7 @@ public function testShouldRegisterSqsTransportFactory()
$container->registerExtension($extensionMock);

$extensionMock
->expects($this->at(9))
->expects($this->at(7))
->method('addTransportFactory')
->with($this->isInstanceOf(SqsTransportFactory::class))
;
Expand Down
37 changes: 22 additions & 15 deletions pkg/enqueue/Symfony/DefaultTransportFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,29 +34,40 @@ public function addConfiguration(ArrayNodeDefinition $builder)
{
$builder
->beforeNormalization()
->ifString()
->then(function ($v) {
if (false === strpos($v, '://')) {
return ['alias' => $v];
->always(function ($v) {
if (is_array($v)) {
if (empty($v['dsn']) && empty($v['alias'])) {
throw new \LogicException('Either dsn or alias option must be set');
}

return $v;
}

if (empty($v)) {
return ['dsn' => 'null://'];
}

return ['dsn' => $v];
if (is_string($v)) {
return false !== strpos($v, '://') ?
['dsn' => $v] :
['alias' => $v];
}
})
->end()
->children()
->scalarNode('alias')->cannotBeEmpty()->end()
->scalarNode('dsn')->cannotBeEmpty()->end()
;
->end()
->end()
;
}

public function createConnectionFactory(ContainerBuilder $container, array $config)
{
if (isset($config['alias'])) {
$aliasId = sprintf('enqueue.transport.%s.connection_factory', $config['alias']);
} elseif (isset($config['dsn'])) {
$aliasId = $this->findFactory($config['dsn'])->createConnectionFactory($container, $config);
} else {
throw new \LogicException('Either dsn or alias option must be set.');
$aliasId = $this->findFactory($config['dsn'])->createConnectionFactory($container, $config);
}

$factoryId = sprintf('enqueue.transport.%s.connection_factory', $this->getName());
Expand All @@ -74,10 +85,8 @@ public function createContext(ContainerBuilder $container, array $config)
{
if (isset($config['alias'])) {
$aliasId = sprintf('enqueue.transport.%s.context', $config['alias']);
} elseif (isset($config['dsn'])) {
$aliasId = $this->findFactory($config['dsn'])->createContext($container, $config);
} else {
throw new \LogicException('Either dsn or alias option must be set.');
$aliasId = $this->findFactory($config['dsn'])->createContext($container, $config);
}

$contextId = sprintf('enqueue.transport.%s.context', $this->getName());
Expand All @@ -95,10 +104,8 @@ public function createDriver(ContainerBuilder $container, array $config)
{
if (isset($config['alias'])) {
$aliasId = sprintf('enqueue.client.%s.driver', $config['alias']);
} elseif (isset($config['dsn'])) {
$aliasId = $this->findFactory($config['dsn'])->createDriver($container, $config);
} else {
throw new \LogicException('Either dsn or alias option must be set.');
$aliasId = $this->findFactory($config['dsn'])->createDriver($container, $config);
}

$driverId = sprintf('enqueue.client.%s.driver', $this->getName());
Expand Down
Loading