MergeExtensionConfigurationPassTest.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Component\DependencyInjection\Tests\Compiler;
  11. use PHPUnit\Framework\TestCase;
  12. use Symfony\Component\Config\Definition\Builder\TreeBuilder;
  13. use Symfony\Component\Config\Definition\ConfigurationInterface;
  14. use Symfony\Component\Config\Resource\FileResource;
  15. use Symfony\Component\DependencyInjection\Compiler\MergeExtensionConfigurationPass;
  16. use Symfony\Component\DependencyInjection\ContainerBuilder;
  17. use Symfony\Component\DependencyInjection\Extension\Extension;
  18. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
  19. class MergeExtensionConfigurationPassTest extends TestCase
  20. {
  21. public function testExpressionLanguageProviderForwarding()
  22. {
  23. $tmpProviders = array();
  24. $extension = $this->getMockBuilder('Symfony\\Component\\DependencyInjection\\Extension\\ExtensionInterface')->getMock();
  25. $extension->expects($this->any())
  26. ->method('getXsdValidationBasePath')
  27. ->will($this->returnValue(false));
  28. $extension->expects($this->any())
  29. ->method('getNamespace')
  30. ->will($this->returnValue('http://example.org/schema/dic/foo'));
  31. $extension->expects($this->any())
  32. ->method('getAlias')
  33. ->will($this->returnValue('foo'));
  34. $extension->expects($this->once())
  35. ->method('load')
  36. ->will($this->returnCallback(function (array $config, ContainerBuilder $container) use (&$tmpProviders) {
  37. $tmpProviders = $container->getExpressionLanguageProviders();
  38. }));
  39. $provider = $this->getMockBuilder('Symfony\\Component\\ExpressionLanguage\\ExpressionFunctionProviderInterface')->getMock();
  40. $container = new ContainerBuilder(new ParameterBag());
  41. $container->registerExtension($extension);
  42. $container->prependExtensionConfig('foo', array('bar' => true));
  43. $container->addExpressionLanguageProvider($provider);
  44. $pass = new MergeExtensionConfigurationPass();
  45. $pass->process($container);
  46. $this->assertEquals(array($provider), $tmpProviders);
  47. }
  48. public function testExtensionConfigurationIsTrackedByDefault()
  49. {
  50. $extension = $this->getMockBuilder(FooExtension::class)->setMethods(array('getConfiguration'))->getMock();
  51. $extension->expects($this->exactly(2))
  52. ->method('getConfiguration')
  53. ->will($this->returnValue(new FooConfiguration()));
  54. $container = new ContainerBuilder(new ParameterBag());
  55. $container->registerExtension($extension);
  56. $container->prependExtensionConfig('foo', array('bar' => true));
  57. $pass = new MergeExtensionConfigurationPass();
  58. $pass->process($container);
  59. $this->assertContains(new FileResource(__FILE__), $container->getResources(), '', false, false);
  60. }
  61. public function testOverriddenEnvsAreMerged()
  62. {
  63. $container = new ContainerBuilder();
  64. $container->registerExtension(new FooExtension());
  65. $container->prependExtensionConfig('foo', array('bar' => '%env(FOO)%'));
  66. $container->prependExtensionConfig('foo', array('bar' => '%env(BAR)%', 'baz' => '%env(BAZ)%'));
  67. $pass = new MergeExtensionConfigurationPass();
  68. $pass->process($container);
  69. $this->assertSame(array('BAZ', 'FOO'), array_keys($container->getParameterBag()->getEnvPlaceholders()));
  70. $this->assertSame(array('BAZ' => 1, 'FOO' => 0), $container->getEnvCounters());
  71. }
  72. public function testThrowingExtensionsGetMergedBag()
  73. {
  74. $container = new ContainerBuilder();
  75. $container->registerExtension(new ThrowingExtension());
  76. $container->prependExtensionConfig('throwing', array('bar' => '%env(FOO)%'));
  77. try {
  78. $pass = new MergeExtensionConfigurationPass();
  79. $pass->process($container);
  80. $this->fail('An exception should have been thrown.');
  81. } catch (\Exception $e) {
  82. }
  83. $this->assertSame(array('FOO'), array_keys($container->getParameterBag()->getEnvPlaceholders()));
  84. }
  85. }
  86. class FooConfiguration implements ConfigurationInterface
  87. {
  88. public function getConfigTreeBuilder()
  89. {
  90. $treeBuilder = new TreeBuilder();
  91. $rootNode = $treeBuilder->root('foo');
  92. $rootNode
  93. ->children()
  94. ->scalarNode('bar')->end()
  95. ->scalarNode('baz')->end()
  96. ->end();
  97. return $treeBuilder;
  98. }
  99. }
  100. class FooExtension extends Extension
  101. {
  102. public function getAlias()
  103. {
  104. return 'foo';
  105. }
  106. public function getConfiguration(array $config, ContainerBuilder $container)
  107. {
  108. return new FooConfiguration();
  109. }
  110. public function load(array $configs, ContainerBuilder $container)
  111. {
  112. $configuration = $this->getConfiguration($configs, $container);
  113. $config = $this->processConfiguration($configuration, $configs);
  114. if (isset($config['baz'])) {
  115. $container->getParameterBag()->get('env(BOZ)');
  116. $container->resolveEnvPlaceholders($config['baz']);
  117. }
  118. }
  119. }
  120. class ThrowingExtension extends Extension
  121. {
  122. public function getAlias()
  123. {
  124. return 'throwing';
  125. }
  126. public function getConfiguration(array $config, ContainerBuilder $container)
  127. {
  128. return new FooConfiguration();
  129. }
  130. public function load(array $configs, ContainerBuilder $container)
  131. {
  132. throw new \Exception();
  133. }
  134. }