3ebd3f5e5c981b8ca9b81f1c837aaa8906b739b6
[yaffs-website] / vendor / symfony / dependency-injection / Tests / Compiler / MergeExtensionConfigurationPassTest.php
1 <?php
2
3 /*
4  * This file is part of the Symfony package.
5  *
6  * (c) Fabien Potencier <fabien@symfony.com>
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11
12 namespace Symfony\Component\DependencyInjection\Tests\Compiler;
13
14 use PHPUnit\Framework\TestCase;
15 use Symfony\Component\Config\Definition\Builder\TreeBuilder;
16 use Symfony\Component\Config\Definition\ConfigurationInterface;
17 use Symfony\Component\Config\Resource\FileResource;
18 use Symfony\Component\DependencyInjection\Compiler\MergeExtensionConfigurationContainerBuilder;
19 use Symfony\Component\DependencyInjection\Compiler\MergeExtensionConfigurationPass;
20 use Symfony\Component\DependencyInjection\ContainerBuilder;
21 use Symfony\Component\DependencyInjection\Extension\Extension;
22 use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
23
24 class MergeExtensionConfigurationPassTest extends TestCase
25 {
26     public function testExpressionLanguageProviderForwarding()
27     {
28         $tmpProviders = array();
29
30         $extension = $this->getMockBuilder('Symfony\\Component\\DependencyInjection\\Extension\\ExtensionInterface')->getMock();
31         $extension->expects($this->any())
32             ->method('getXsdValidationBasePath')
33             ->will($this->returnValue(false));
34         $extension->expects($this->any())
35             ->method('getNamespace')
36             ->will($this->returnValue('http://example.org/schema/dic/foo'));
37         $extension->expects($this->any())
38             ->method('getAlias')
39             ->will($this->returnValue('foo'));
40         $extension->expects($this->once())
41             ->method('load')
42             ->will($this->returnCallback(function (array $config, ContainerBuilder $container) use (&$tmpProviders) {
43                 $tmpProviders = $container->getExpressionLanguageProviders();
44             }));
45
46         $provider = $this->getMockBuilder('Symfony\\Component\\ExpressionLanguage\\ExpressionFunctionProviderInterface')->getMock();
47         $container = new ContainerBuilder(new ParameterBag());
48         $container->registerExtension($extension);
49         $container->prependExtensionConfig('foo', array('bar' => true));
50         $container->addExpressionLanguageProvider($provider);
51
52         $pass = new MergeExtensionConfigurationPass();
53         $pass->process($container);
54
55         $this->assertEquals(array($provider), $tmpProviders);
56     }
57
58     public function testExtensionLoadGetAMergeExtensionConfigurationContainerBuilderInstance()
59     {
60         $extension = $this->getMockBuilder(FooExtension::class)->setMethods(array('load'))->getMock();
61         $extension->expects($this->once())
62             ->method('load')
63             ->with($this->isType('array'), $this->isInstanceOf(MergeExtensionConfigurationContainerBuilder::class))
64         ;
65
66         $container = new ContainerBuilder(new ParameterBag());
67         $container->registerExtension($extension);
68         $container->prependExtensionConfig('foo', array());
69
70         $pass = new MergeExtensionConfigurationPass();
71         $pass->process($container);
72     }
73
74     public function testExtensionConfigurationIsTrackedByDefault()
75     {
76         $extension = $this->getMockBuilder(FooExtension::class)->setMethods(array('getConfiguration'))->getMock();
77         $extension->expects($this->exactly(2))
78             ->method('getConfiguration')
79             ->will($this->returnValue(new FooConfiguration()));
80
81         $container = new ContainerBuilder(new ParameterBag());
82         $container->registerExtension($extension);
83         $container->prependExtensionConfig('foo', array('bar' => true));
84
85         $pass = new MergeExtensionConfigurationPass();
86         $pass->process($container);
87
88         $this->assertContains(new FileResource(__FILE__), $container->getResources(), '', false, false);
89     }
90
91     public function testOverriddenEnvsAreMerged()
92     {
93         $container = new ContainerBuilder();
94         $container->registerExtension(new FooExtension());
95         $container->prependExtensionConfig('foo', array('bar' => '%env(FOO)%'));
96         $container->prependExtensionConfig('foo', array('bar' => '%env(BAR)%', 'baz' => '%env(BAZ)%'));
97
98         $pass = new MergeExtensionConfigurationPass();
99         $pass->process($container);
100
101         $this->assertSame(array('BAZ', 'FOO'), array_keys($container->getParameterBag()->getEnvPlaceholders()));
102         $this->assertSame(array('BAZ' => 1, 'FOO' => 0), $container->getEnvCounters());
103     }
104
105     /**
106      * @expectedException \Symfony\Component\DependencyInjection\Exception\RuntimeException
107      * @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.
108      */
109     public function testProcessedEnvsAreIncompatibleWithResolve()
110     {
111         $container = new ContainerBuilder();
112         $container->registerExtension(new BarExtension());
113         $container->prependExtensionConfig('bar', array());
114
115         (new MergeExtensionConfigurationPass())->process($container);
116     }
117
118     public function testThrowingExtensionsGetMergedBag()
119     {
120         $container = new ContainerBuilder();
121         $container->registerExtension(new ThrowingExtension());
122         $container->prependExtensionConfig('throwing', array('bar' => '%env(FOO)%'));
123
124         try {
125             $pass = new MergeExtensionConfigurationPass();
126             $pass->process($container);
127             $this->fail('An exception should have been thrown.');
128         } catch (\Exception $e) {
129         }
130
131         $this->assertSame(array('FOO'), array_keys($container->getParameterBag()->getEnvPlaceholders()));
132     }
133 }
134
135 class FooConfiguration implements ConfigurationInterface
136 {
137     public function getConfigTreeBuilder()
138     {
139         $treeBuilder = new TreeBuilder();
140         $rootNode = $treeBuilder->root('foo');
141         $rootNode
142             ->children()
143                 ->scalarNode('bar')->end()
144                 ->scalarNode('baz')->end()
145             ->end();
146
147         return $treeBuilder;
148     }
149 }
150
151 class FooExtension extends Extension
152 {
153     public function getAlias()
154     {
155         return 'foo';
156     }
157
158     public function getConfiguration(array $config, ContainerBuilder $container)
159     {
160         return new FooConfiguration();
161     }
162
163     public function load(array $configs, ContainerBuilder $container)
164     {
165         $configuration = $this->getConfiguration($configs, $container);
166         $config = $this->processConfiguration($configuration, $configs);
167
168         if (isset($config['baz'])) {
169             $container->getParameterBag()->get('env(BOZ)');
170             $container->resolveEnvPlaceholders($config['baz']);
171         }
172     }
173 }
174
175 class BarExtension extends Extension
176 {
177     public function load(array $configs, ContainerBuilder $container)
178     {
179         $container->resolveEnvPlaceholders('%env(int:FOO)%', true);
180     }
181 }
182
183 class ThrowingExtension extends Extension
184 {
185     public function getAlias()
186     {
187         return 'throwing';
188     }
189
190     public function getConfiguration(array $config, ContainerBuilder $container)
191     {
192         return new FooConfiguration();
193     }
194
195     public function load(array $configs, ContainerBuilder $container)
196     {
197         throw new \Exception();
198     }
199 }