FOSElasticaBundle/Tests/DependencyInjection/Compiler/RegisterProvidersPassTest.php
Jeremy Mikola b360a36737 [Provider] Create ProviderRegistry service (BC break)
This introduces a registry service for persistence providers.

Previously, tagging one or more provider services would cause AddProviderPass to clobber the default providers created by the bundle's extension class. Now, the extension class tags its created providers and allows them to be registered via RegisterProvidersPass just like custom providers.

BC break: Custom providers tagged "foq_elastica.provider" must now specify a "type" attribute on their tag. An "index" attribute is optional (the default ES index will be used by default).
2012-03-12 12:07:51 -04:00

79 lines
2.9 KiB
PHP

<?php
namespace FOQ\ElasticaBundle\Tests\DependencyInjection\Compiler;
use FOQ\ElasticaBundle\DependencyInjection\Compiler\RegisterProvidersPass;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\ContainerBuilder;
class RegisterProvidersPassTest extends \PHPUnit_Framework_TestCase
{
public function testProcessShouldRegisterTaggedProviders()
{
$container = new ContainerBuilder();
$pass = new RegisterProvidersPass();
$registryDefinition = new Definition();
$container->setDefinition('foq_elastica.provider_registry', $registryDefinition);
$container->setAlias('foq_elastica.index', 'foq_elastica.index.foo');
$container->setDefinition('provider.foo.a', $this->createProviderDefinition(array('type' => 'a')));
$container->setDefinition('provider.foo.b', $this->createProviderDefinition(array('index' => 'foo', 'type' => 'b')));
$container->setDefinition('provider.bar.a', $this->createProviderDefinition(array('index' => 'bar', 'type' => 'a')));
$pass->process($container);
$calls = $registryDefinition->getMethodCalls();
$this->assertEquals(array('addProvider', array('foo', 'a', 'provider.foo.a')), $calls[0]);
$this->assertEquals(array('addProvider', array('foo', 'b', 'provider.foo.b')), $calls[1]);
$this->assertEquals(array('addProvider', array('bar', 'a', 'provider.bar.a')), $calls[2]);
}
/**
* @expectedException InvalidArgumentException
*/
public function testProcessShouldRequireProviderImplementation()
{
$container = new ContainerBuilder();
$pass = new RegisterProvidersPass();
$container->setDefinition('foq_elastica.provider_registry', new Definition());
$container->setAlias('foq_elastica.index', 'foq_elastica.index.foo');
$providerDef = $this->createProviderDefinition();
$providerDef->setClass('stdClass');
$container->setDefinition('provider.foo.a', $providerDef);
$pass->process($container);
}
/**
* @expectedException InvalidArgumentException
*/
public function testProcessShouldRequireTypeAttribute()
{
$container = new ContainerBuilder();
$pass = new RegisterProvidersPass();
$container->setDefinition('foq_elastica.provider_registry', new Definition());
$container->setAlias('foq_elastica.index', 'foq_elastica.index.foo');
$container->setDefinition('provider.foo.a', $this->createProviderDefinition());
$pass->process($container);
}
private function createProviderDefinition(array $attributes = array())
{
$provider = $this->getMock('FOQ\ElasticaBundle\Provider\ProviderInterface');
$definition = new Definition(get_class($provider));
$definition->addTag('foq_elastica.provider', $attributes);
return $definition;
}
}