use Symfony\Component\Config\Definition\ConfigurationInterface;
use Symfony\Component\Config\Resource\FileResource;
use Symfony\Component\DependencyInjection\Compiler\MergeExtensionConfigurationPass;
+use Symfony\Component\DependencyInjection\Compiler\MergeExtensionConfigurationContainerBuilder;
use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Extension\Extension;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
class MergeExtensionConfigurationPassTest extends TestCase
$this->assertEquals(array($provider), $tmpProviders);
}
- public function testExtensionConfigurationIsTrackedByDefault()
+ public function testExtensionLoadGetAMergeExtensionConfigurationContainerBuilderInstance()
{
- $extension = $this->getMockBuilder('Symfony\\Component\\DependencyInjection\\Extension\\Extension')->getMock();
+ $extension = $this->getMockBuilder(FooExtension::class)->setMethods(array('load'))->getMock();
$extension->expects($this->once())
+ ->method('load')
+ ->with($this->isType('array'), $this->isInstanceOf(MergeExtensionConfigurationContainerBuilder::class))
+ ;
+
+ $container = new ContainerBuilder(new ParameterBag());
+ $container->registerExtension($extension);
+ $container->prependExtensionConfig('foo', array());
+
+ $pass = new MergeExtensionConfigurationPass();
+ $pass->process($container);
+ }
+
+ public function testExtensionConfigurationIsTrackedByDefault()
+ {
+ $extension = $this->getMockBuilder(FooExtension::class)->setMethods(array('getConfiguration'))->getMock();
+ $extension->expects($this->exactly(2))
->method('getConfiguration')
->will($this->returnValue(new FooConfiguration()));
- $extension->expects($this->any())
- ->method('getAlias')
- ->will($this->returnValue('foo'));
$container = new ContainerBuilder(new ParameterBag());
$container->registerExtension($extension);
$this->assertContains(new FileResource(__FILE__), $container->getResources(), '', false, false);
}
+
+ public function testOverriddenEnvsAreMerged()
+ {
+ $container = new ContainerBuilder();
+ $container->registerExtension(new FooExtension());
+ $container->prependExtensionConfig('foo', array('bar' => '%env(FOO)%'));
+ $container->prependExtensionConfig('foo', array('bar' => '%env(BAR)%', 'baz' => '%env(BAZ)%'));
+
+ $pass = new MergeExtensionConfigurationPass();
+ $pass->process($container);
+
+ $this->assertSame(array('BAZ', 'FOO'), array_keys($container->getParameterBag()->getEnvPlaceholders()));
+ $this->assertSame(array('BAZ' => 1, 'FOO' => 0), $container->getEnvCounters());
+ }
+
+ /**
+ * @expectedException \Symfony\Component\DependencyInjection\Exception\RuntimeException
+ * @expectedExceptionMessage Using a cast in "env(int:FOO)" is incompatible with resolution at compile time in "Symfony\Component\DependencyInjection\Tests\Compiler\BarExtension". The logic in the extension should be moved to a compiler pass, or an env parameter with no cast should be used instead.
+ */
+ public function testProcessedEnvsAreIncompatibleWithResolve()
+ {
+ $container = new ContainerBuilder();
+ $container->registerExtension(new BarExtension());
+ $container->prependExtensionConfig('bar', array());
+
+ (new MergeExtensionConfigurationPass())->process($container);
+ }
+
+ public function testThrowingExtensionsGetMergedBag()
+ {
+ $container = new ContainerBuilder();
+ $container->registerExtension(new ThrowingExtension());
+ $container->prependExtensionConfig('throwing', array('bar' => '%env(FOO)%'));
+
+ try {
+ $pass = new MergeExtensionConfigurationPass();
+ $pass->process($container);
+ $this->fail('An exception should have been thrown.');
+ } catch (\Exception $e) {
+ }
+
+ $this->assertSame(array('FOO'), array_keys($container->getParameterBag()->getEnvPlaceholders()));
+ }
}
class FooConfiguration implements ConfigurationInterface
{
public function getConfigTreeBuilder()
{
- return new TreeBuilder();
+ $treeBuilder = new TreeBuilder();
+ $rootNode = $treeBuilder->root('foo');
+ $rootNode
+ ->children()
+ ->scalarNode('bar')->end()
+ ->scalarNode('baz')->end()
+ ->end();
+
+ return $treeBuilder;
+ }
+}
+
+class FooExtension extends Extension
+{
+ public function getAlias()
+ {
+ return 'foo';
+ }
+
+ public function getConfiguration(array $config, ContainerBuilder $container)
+ {
+ return new FooConfiguration();
+ }
+
+ public function load(array $configs, ContainerBuilder $container)
+ {
+ $configuration = $this->getConfiguration($configs, $container);
+ $config = $this->processConfiguration($configuration, $configs);
+
+ if (isset($config['baz'])) {
+ $container->getParameterBag()->get('env(BOZ)');
+ $container->resolveEnvPlaceholders($config['baz']);
+ }
+ }
+}
+
+class BarExtension extends Extension
+{
+ public function load(array $configs, ContainerBuilder $container)
+ {
+ $container->resolveEnvPlaceholders('%env(int:FOO)%', true);
+ }
+}
+
+class ThrowingExtension extends Extension
+{
+ public function getAlias()
+ {
+ return 'throwing';
+ }
+
+ public function getConfiguration(array $config, ContainerBuilder $container)
+ {
+ return new FooConfiguration();
+ }
+
+ public function load(array $configs, ContainerBuilder $container)
+ {
+ throw new \Exception();
}
}