Updated to Drupal 8.5. Core Media not yet in use.
[yaffs-website] / vendor / symfony / dependency-injection / Tests / Compiler / MergeExtensionConfigurationPassTest.php
index b35521d206204f24e1485fa0a00c0fb6aa13a824..77872720aa4fb7e9f3628b50b31983025de58a74 100644 (file)
@@ -16,7 +16,9 @@ use Symfony\Component\Config\Definition\Builder\TreeBuilder;
 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
@@ -53,15 +55,28 @@ 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);
@@ -72,12 +87,113 @@ class MergeExtensionConfigurationPassTest extends TestCase
 
         $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();
     }
 }