FrameworkExtensionTest.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  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\Bundle\FrameworkBundle\Tests\DependencyInjection;
  11. use Symfony\Bundle\FrameworkBundle\Tests\TestCase;
  12. use Symfony\Bundle\FrameworkBundle\DependencyInjection\FrameworkExtension;
  13. use Symfony\Component\DependencyInjection\ContainerBuilder;
  14. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
  15. abstract class FrameworkExtensionTest extends TestCase
  16. {
  17. abstract protected function loadFromFile(ContainerBuilder $container, $file);
  18. public function testCsrfProtection()
  19. {
  20. $container = $this->createContainerFromFile('full');
  21. $def = $container->getDefinition('form.type_extension.csrf');
  22. $this->assertTrue($container->getParameter('form.type_extension.csrf.enabled'));
  23. $this->assertEquals('%form.type_extension.csrf.enabled%', $def->getArgument(0));
  24. $this->assertEquals('_csrf', $container->getParameter('form.type_extension.csrf.field_name'));
  25. $this->assertEquals('%form.type_extension.csrf.field_name%', $def->getArgument(1));
  26. $this->assertEquals('s3cr3t', $container->getParameterBag()->resolveValue($container->findDefinition('form.csrf_provider')->getArgument(1)));
  27. }
  28. public function testEsi()
  29. {
  30. $container = $this->createContainerFromFile('full');
  31. $this->assertTrue($container->hasDefinition('esi'), '->registerEsiConfiguration() loads esi.xml');
  32. }
  33. public function testProfiler()
  34. {
  35. $container = $this->createContainerFromFile('full');
  36. $this->assertTrue($container->hasDefinition('profiler'), '->registerProfilerConfiguration() loads profiling.xml');
  37. $this->assertTrue($container->hasDefinition('data_collector.config'), '->registerProfilerConfiguration() loads collectors.xml');
  38. $this->assertTrue($container->getParameter('profiler_listener.only_exceptions'));
  39. $this->assertEquals('%profiler_listener.only_exceptions%', $container->getDefinition('profiler_listener')->getArgument(2));
  40. }
  41. public function testRouter()
  42. {
  43. $container = $this->createContainerFromFile('full');
  44. $this->assertTrue($container->has('router'), '->registerRouterConfiguration() loads routing.xml');
  45. $arguments = $container->findDefinition('router')->getArguments();
  46. $this->assertEquals($container->getParameter('kernel.root_dir').'/config/routing.xml', $container->getParameter('router.resource'), '->registerRouterConfiguration() sets routing resource');
  47. $this->assertEquals('%router.resource%', $arguments[1], '->registerRouterConfiguration() sets routing resource');
  48. $this->assertEquals('xml', $arguments[2]['resource_type'], '->registerRouterConfiguration() sets routing resource type');
  49. }
  50. /**
  51. * @expectedException Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
  52. */
  53. public function testRouterRequiresResourceOption()
  54. {
  55. $container = $this->createContainer();
  56. $loader = new FrameworkExtension();
  57. $loader->load(array(array('router' => true)), $container);
  58. }
  59. public function testSession()
  60. {
  61. $container = $this->createContainerFromFile('full');
  62. $this->assertTrue($container->hasDefinition('session'), '->registerSessionConfiguration() loads session.xml');
  63. $this->assertEquals('fr', $container->getParameter('session.default_locale'));
  64. $this->assertEquals('%session.default_locale%', $container->getDefinition('session')->getArgument(1));
  65. $this->assertTrue($container->getDefinition('session_listener')->getArgument(1));
  66. $this->assertEquals('session.storage.native', (string) $container->getAlias('session.storage'));
  67. $options = $container->getParameter('session.storage.options');
  68. $this->assertEquals('_SYMFONY', $options['name']);
  69. $this->assertEquals(86400, $options['lifetime']);
  70. $this->assertEquals('/', $options['path']);
  71. $this->assertEquals('example.com', $options['domain']);
  72. $this->assertTrue($options['secure']);
  73. $this->assertTrue($options['httponly']);
  74. }
  75. public function testTemplating()
  76. {
  77. $container = $this->createContainerFromFile('full');
  78. $this->assertTrue($container->hasDefinition('templating.name_parser'), '->registerTemplatingConfiguration() loads templating.xml');
  79. $this->assertEquals('request', $container->getDefinition('templating.helper.assets')->getScope(), '->registerTemplatingConfiguration() sets request scope on assets helper if one or more packages are request-scoped');
  80. // default package should have one http base url and path package ssl url
  81. $this->assertTrue($container->hasDefinition('templating.asset.default_package.http'));
  82. $package = $container->getDefinition('templating.asset.default_package.http');
  83. $this->assertInstanceOf('Symfony\\Component\\DependencyInjection\\DefinitionDecorator', $package);
  84. $this->assertEquals('templating.asset.url_package', $package->getParent());
  85. $arguments = array_values($package->getArguments());
  86. $this->assertEquals(array('http://cdn.example.com'), $arguments[0]);
  87. $this->assertEquals('SomeVersionScheme', $arguments[1]);
  88. $this->assertNull($arguments[2]);
  89. $this->assertTrue($container->hasDefinition('templating.asset.default_package.ssl'));
  90. $package = $container->getDefinition('templating.asset.default_package.ssl');
  91. $this->assertInstanceOf('Symfony\\Component\\DependencyInjection\\DefinitionDecorator', $package);
  92. $this->assertEquals('templating.asset.path_package', $package->getParent());
  93. $this->assertEquals('templating.engine.delegating', (string) $container->getAlias('templating'), '->registerTemplatingConfiguration() configures delegating loader if multiple engines are provided');
  94. $this->assertEquals($container->getDefinition('templating.loader.chain'), $container->getDefinition('templating.loader.wrapped'), '->registerTemplatingConfiguration() configures loader chain if multiple loaders are provided');
  95. $this->assertEquals($container->getDefinition('templating.loader'), $container->getDefinition('templating.loader.cache'), '->registerTemplatingConfiguration() configures the loader to use cache');
  96. $this->assertEquals('%templating.loader.cache.path%', $container->getDefinition('templating.loader.cache')->getArgument(1));
  97. $this->assertEquals('/path/to/cache', $container->getParameter('templating.loader.cache.path'));
  98. $this->assertEquals(array('php', 'twig'), $container->getParameter('templating.engines'), '->registerTemplatingConfiguration() sets a templating.engines parameter');
  99. $this->assertEquals(array('FrameworkBundle:Form', 'theme1', 'theme2'), $container->getParameter('templating.helper.form.resources'), '->registerTemplatingConfiguration() registers the theme and adds the base theme');
  100. }
  101. public function testTemplatingAssetsHelperScopeDependsOnPackageArgumentScopes()
  102. {
  103. $container = $this->createContainerFromFile('templating_url_package');
  104. $this->assertNotEquals('request', $container->getDefinition('templating.helper.assets')->getScope(), '->registerTemplatingConfiguration() does not set request scope on assets helper if no packages are request-scoped');
  105. }
  106. public function testTranslator()
  107. {
  108. $container = $this->createContainerFromFile('full');
  109. $this->assertTrue($container->hasDefinition('translator.default'), '->registerTranslatorConfiguration() loads translation.xml');
  110. $this->assertEquals('translator.default', (string) $container->getAlias('translator'), '->registerTranslatorConfiguration() redefines translator service from identity to real translator');
  111. $resources = array();
  112. foreach ($container->getDefinition('translator.default')->getMethodCalls() as $call) {
  113. if ('addResource' == $call[0]) {
  114. $resources[] = $call[1];
  115. }
  116. }
  117. $this->assertContains(
  118. realpath(__DIR__.'/../../Resources/translations/validators.fr.xliff'),
  119. array_map(function($resource) use ($resources) { return realpath($resource[1]); }, $resources),
  120. '->registerTranslatorConfiguration() finds FrameworkExtension translation resources'
  121. );
  122. $calls = $container->getDefinition('translator.default')->getMethodCalls();
  123. $this->assertEquals('fr', $calls[0][1][0]);
  124. }
  125. /**
  126. * @expectedException Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
  127. */
  128. public function testTemplatingRequiresAtLeastOneEngine()
  129. {
  130. $container = $this->createContainer();
  131. $loader = new FrameworkExtension();
  132. $loader->load(array(array('templating' => null)), $container);
  133. }
  134. public function testValidation()
  135. {
  136. $container = $this->createContainerFromFile('full');
  137. $this->assertTrue($container->hasDefinition('validator'), '->registerValidationConfiguration() loads validator.xml');
  138. $this->assertTrue($container->hasDefinition('validator.mapping.loader.xml_files_loader'), '->registerValidationConfiguration() defines the XML loader');
  139. $this->assertTrue($container->hasDefinition('validator.mapping.loader.yaml_files_loader'), '->registerValidationConfiguration() defines the YAML loader');
  140. $xmlFiles = $container->getParameter('validator.mapping.loader.xml_files_loader.mapping_files');
  141. $this->assertContains(
  142. realpath(__DIR__.'/../../../../Component/Form/Resources/config/validation.xml'),
  143. array_map('realpath', $xmlFiles),
  144. '->registerValidationConfiguration() adds Form validation.xml to XML loader'
  145. );
  146. }
  147. public function testAnnotations()
  148. {
  149. if (!class_exists('Doctrine\\Common\\Version')) {
  150. $this->markTestSkipped('Doctrine is not available.');
  151. }
  152. $container = $this->createContainerFromFile('full');
  153. $this->assertEquals($container->getParameter('kernel.cache_dir').'/annotations', $container->getDefinition('annotations.file_cache_reader')->getArgument(1));
  154. $this->assertInstanceOf('Doctrine\Common\Annotations\FileCacheReader', $container->get('annotation_reader'));
  155. }
  156. public function testFileLinkFormat()
  157. {
  158. $container = $this->createContainerFromFile('full');
  159. $this->assertEquals('file%link%format', $container->getParameter('templating.helper.code.file_link_format'));
  160. }
  161. public function testValidationAnnotations()
  162. {
  163. $container = $this->createContainerFromFile('validation_annotations');
  164. $this->assertTrue($container->hasDefinition('validator.mapping.loader.annotation_loader'), '->registerValidationConfiguration() defines the annotation loader');
  165. $loaders = $container->getDefinition('validator.mapping.loader.loader_chain')->getArgument(0);
  166. $found = false;
  167. foreach ($loaders as $loader) {
  168. if ('validator.mapping.loader.annotation_loader' === (string) $loader) {
  169. $found = true;
  170. }
  171. }
  172. $this->assertTrue($found, 'validator.mapping.loader.annotation_loader is added to the loader chain.');
  173. }
  174. public function testValidationPaths()
  175. {
  176. require_once __DIR__."/Fixtures/TestBundle/TestBundle.php";
  177. $container = $this->createContainerFromFile('validation_annotations', array(
  178. 'kernel.bundles' => array('TestBundle' => 'Symfony\Bundle\FrameworkBundle\Tests\TestBundle'),
  179. ));
  180. $yamlArgs = $container->getParameter('validator.mapping.loader.yaml_files_loader.mapping_files');
  181. $this->assertEquals(1, count($yamlArgs));
  182. $this->assertStringEndsWith('TestBundle'.DIRECTORY_SEPARATOR.'Resources'.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'validation.yml', $yamlArgs[0]);
  183. $xmlArgs = $container->getParameter('validator.mapping.loader.xml_files_loader.mapping_files');
  184. $this->assertEquals(2, count($xmlArgs));
  185. $this->assertStringEndsWith('Component'.DIRECTORY_SEPARATOR.'Form/Resources/config/validation.xml', $xmlArgs[0]);
  186. $this->assertStringEndsWith('TestBundle'.DIRECTORY_SEPARATOR.'Resources'.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'validation.xml', $xmlArgs[1]);
  187. }
  188. protected function createContainer(array $data = array())
  189. {
  190. return new ContainerBuilder(new ParameterBag(array_merge(array(
  191. 'kernel.bundles' => array('FrameworkBundle' => 'Symfony\\Bundle\\FrameworkBundle\\FrameworkBundle'),
  192. 'kernel.cache_dir' => __DIR__,
  193. 'kernel.compiled_classes' => array(),
  194. 'kernel.debug' => false,
  195. 'kernel.environment' => 'test',
  196. 'kernel.name' => 'kernel',
  197. 'kernel.root_dir' => __DIR__,
  198. ), $data)));
  199. }
  200. protected function createContainerFromFile($file, $data = array())
  201. {
  202. $container = $this->createContainer($data);
  203. $container->registerExtension(new FrameworkExtension());
  204. $this->loadFromFile($container, $file);
  205. $container->getCompilerPassConfig()->setOptimizationPasses(array());
  206. $container->getCompilerPassConfig()->setRemovingPasses(array());
  207. $container->compile();
  208. return $container;
  209. }
  210. }