FrameworkExtensionTest.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  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. $this->assertTrue($container->getParameter('form.csrf_protection.enabled'));
  22. $this->assertEquals('_csrf', $container->getParameter('form.csrf_protection.field_name'));
  23. $this->assertEquals('s3cr3t', $container->getParameter('form.csrf_protection.secret'));
  24. }
  25. public function testEsi()
  26. {
  27. $container = $this->createContainerFromFile('full');
  28. $this->assertTrue($container->hasDefinition('esi'), '->registerEsiConfiguration() loads esi.xml');
  29. }
  30. public function testProfiler()
  31. {
  32. $container = $this->createContainerFromFile('full');
  33. $this->assertTrue($container->hasDefinition('profiler'), '->registerProfilerConfiguration() loads profiling.xml');
  34. $this->assertTrue($container->hasDefinition('data_collector.config'), '->registerProfilerConfiguration() loads collectors.xml');
  35. $arguments = $container->getDefinition('profiler_listener')->getArguments();
  36. $this->assertTrue($arguments[2]);
  37. }
  38. public function testRouter()
  39. {
  40. $container = $this->createContainerFromFile('full');
  41. $this->assertTrue($container->hasDefinition('router.real'), '->registerRouterConfiguration() loads routing.xml');
  42. $this->assertEquals($container->getParameter('kernel.root_dir').'/config/routing.xml', $container->getParameter('routing.resource'), '->registerRouterConfiguration() sets routing resource');
  43. $this->assertEquals('xml', $container->getParameter('router.options.resource_type'), '->registerRouterConfiguration() sets routing resource type');
  44. $this->assertTrue($container->getDefinition('router.cache_warmer')->hasTag('kernel.cache_warmer'), '->registerRouterConfiguration() tags router cache warmer if cache warming is set');
  45. $this->assertEquals('router.cached', (string) $container->getAlias('router'), '->registerRouterConfiguration() changes router alias to cached if cache warming is set');
  46. }
  47. /**
  48. * @expectedException Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
  49. */
  50. public function testRouterRequiresResourceOption()
  51. {
  52. $container = $this->createContainer();
  53. $loader = new FrameworkExtension();
  54. $loader->load(array(array('router' => true)), $container);
  55. }
  56. public function testSession()
  57. {
  58. $container = $this->createContainerFromFile('full');
  59. $this->assertTrue($container->hasDefinition('session'), '->registerSessionConfiguration() loads session.xml');
  60. $arguments = $container->getDefinition('session')->getArguments();
  61. $this->assertEquals('fr', $arguments[1]);
  62. $this->assertTrue($container->getDefinition('session')->hasMethodCall('start'));
  63. $this->assertEquals('Session', $container->getParameter('session.class'));
  64. $this->assertEquals('session.storage.native', (string) $container->getAlias('session.storage'));
  65. $options = $container->getParameter('session.storage.native.options');
  66. $this->assertEquals('_SYMFONY', $options['name']);
  67. $this->assertEquals(86400, $options['lifetime']);
  68. $this->assertEquals('/', $options['path']);
  69. $this->assertEquals('example.com', $options['domain']);
  70. $this->assertTrue($options['secure']);
  71. $this->assertTrue($options['httponly']);
  72. }
  73. public function testSessionPdo()
  74. {
  75. $container = $this->createContainerFromFile('session_pdo');
  76. $options = $container->getParameter('session.storage.pdo.options');
  77. $this->assertEquals('session.storage.pdo', (string) $container->getAlias('session.storage'));
  78. $this->assertEquals('table', $options['db_table']);
  79. $this->assertEquals('id', $options['db_id_col']);
  80. $this->assertEquals('data', $options['db_data_col']);
  81. $this->assertEquals('time', $options['db_time_col']);
  82. }
  83. public function testTemplating()
  84. {
  85. $container = $this->createContainerFromFile('full');
  86. $this->assertTrue($container->hasDefinition('templating.name_parser'), '->registerTemplatingConfiguration() loads templating.xml');
  87. $arguments = $container->getDefinition('templating.helper.assets')->getArguments();
  88. $this->assertEquals('SomeVersionScheme', $arguments[2]);
  89. $this->assertEquals(array('http://cdn.example.com'), $arguments[1]);
  90. $this->assertTrue($container->getDefinition('templating.cache_warmer.template_paths')->hasTag('kernel.cache_warmer'), '->registerTemplatingConfiguration() tags templating cache warmer if cache warming is set');
  91. $this->assertEquals('templating.locator.cached', (string) $container->getAlias('templating.locator'), '->registerTemplatingConfiguration() changes templating.locator alias to cached if cache warming is set');
  92. $this->assertEquals('templating.engine.delegating', (string) $container->getAlias('templating'), '->registerTemplatingConfiguration() configures delegating loader if multiple engines are provided');
  93. $this->assertEquals($container->getDefinition('templating.loader.chain'), $container->getDefinition('templating.loader.wrapped'), '->registerTemplatingConfiguration() configures loader chain if multiple loaders are provided');
  94. $this->assertEquals($container->getDefinition('templating.loader'), $container->getDefinition('templating.loader.cache'), '->registerTemplatingConfiguration() configures the loader to use cache');
  95. $arguments = $container->getDefinition('templating.loader.cache')->getArguments();
  96. $this->assertEquals('/path/to/cache', $arguments[1]);
  97. $this->assertEquals(array('php', 'twig'), $container->getParameter('templating.engines'), '->registerTemplatingConfiguration() sets a templating.engines parameter');
  98. }
  99. public function testTranslator()
  100. {
  101. $container = $this->createContainerFromFile('full');
  102. $this->assertTrue($container->hasDefinition('translator.real'), '->registerTranslatorConfiguration() loads translation.xml');
  103. $this->assertSame($container->getDefinition('translator.real'), $container->getDefinition('translator'), '->registerTranslatorConfiguration() redefines translator service from identity to real translator');
  104. $this->assertContains(
  105. realpath(__DIR__.'/../../Resources/translations/validators.fr.xliff'),
  106. array_map(function($resource) { return realpath($resource[1]); }, $container->getParameter('translation.resources')),
  107. '->registerTranslatorConfiguration() finds FrameworkExtension translation resources'
  108. );
  109. $calls = $container->getDefinition('translator.real')->getMethodCalls();
  110. $this->assertEquals('fr', $calls[0][1][0]);
  111. }
  112. /**
  113. * @expectedException Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
  114. */
  115. public function testTemplatingRequiresAtLeastOneEngine()
  116. {
  117. $container = $this->createContainer();
  118. $loader = new FrameworkExtension();
  119. $loader->load(array(array('templating' => null)), $container);
  120. }
  121. public function testValidation()
  122. {
  123. $container = $this->createContainerFromFile('full');
  124. $this->assertTrue($container->hasDefinition('validator'), '->registerValidationConfiguration() loads validator.xml');
  125. $this->assertTrue($container->hasDefinition('validator.mapping.loader.xml_files_loader'), '->registerValidationConfiguration() defines the XML loader');
  126. $this->assertTrue($container->hasDefinition('validator.mapping.loader.yaml_files_loader'), '->registerValidationConfiguration() defines the YAML loader');
  127. $xmlLoaderArgs = $container->getDefinition('validator.mapping.loader.xml_files_loader')->getArguments();
  128. $xmlFiles = $xmlLoaderArgs[0];
  129. $this->assertContains(
  130. realpath(__DIR__.'/../../../../Component/Form/Resources/config/validation.xml'),
  131. array_map('realpath', $xmlFiles),
  132. '->registerValidationConfiguration() adds Form validation.xml to XML loader'
  133. );
  134. }
  135. public function testValidationAnnotations()
  136. {
  137. $container = $this->createContainerFromFile('validation_annotations');
  138. $this->assertTrue($container->hasDefinition('validator.mapping.loader.annotation_loader'), '->registerValidationConfiguration() defines the annotation loader');
  139. $arguments = $container->getDefinition('validator.mapping.loader.annotation_loader')->getArguments();
  140. $this->assertEquals('Symfony\\Component\\Validator\\Constraints\\', $arguments[0]['assert'], '->registerValidationConfiguration() loads the default "assert" prefix');
  141. $this->assertEquals('Application\\Validator\\Constraints\\', $arguments[0]['app'], '->registerValidationConfiguration() loads custom validation namespaces');
  142. }
  143. public function testValidationPaths()
  144. {
  145. require_once __DIR__ . "/Fixtures/TestBundle/TestBundle.php";
  146. $container = $this->createContainerFromFile('validation_annotations', array(
  147. 'kernel.bundles' => array('TestBundle' => 'Symfony\Bundle\FrameworkBundle\Tests\TestBundle'),
  148. ));
  149. $yamlArgs = $container->getDefinition('validator.mapping.loader.yaml_files_loader')->getArguments();
  150. $this->assertEquals(1, count($yamlArgs[0]));
  151. $this->assertStringEndsWith('TestBundle/Resources/config/validation.yml', $yamlArgs[0][0]);
  152. $xmlArgs = $container->getDefinition('validator.mapping.loader.xml_files_loader')->getArguments();
  153. $this->assertEquals(2, count($xmlArgs[0]));
  154. $this->assertStringEndsWith('Component/Form/Resources/config/validation.xml', $xmlArgs[0][0]);
  155. $this->assertStringEndsWith('TestBundle/Resources/config/validation.xml', $xmlArgs[0][1]);
  156. }
  157. protected function createContainer(array $data = array())
  158. {
  159. return new ContainerBuilder(new ParameterBag(array_merge(array(
  160. 'kernel.bundles' => array('FrameworkBundle' => 'Symfony\\Bundle\\FrameworkBundle\\FrameworkBundle'),
  161. 'kernel.cache_dir' => __DIR__,
  162. 'kernel.compiled_classes' => array(),
  163. 'kernel.debug' => false,
  164. 'kernel.environment' => 'test',
  165. 'kernel.name' => 'kernel',
  166. 'kernel.root_dir' => __DIR__,
  167. ), $data)));
  168. }
  169. protected function createContainerFromFile($file, $data = array())
  170. {
  171. $container = $this->createContainer($data);
  172. $container->registerExtension(new FrameworkExtension());
  173. $this->loadFromFile($container, $file);
  174. $container->getCompilerPassConfig()->setOptimizationPasses(array());
  175. $container->getCompilerPassConfig()->setRemovingPasses(array());
  176. $container->compile();
  177. return $container;
  178. }
  179. }