PageRenderTime 43ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php

https://gitlab.com/Jlb/jlbdigitalserviceswebsiteproject
PHP | 511 lines | 374 code | 107 blank | 30 comment | 9 complexity | 405aff63b87a62784770e76b97f33c5b MD5 | raw file
Possible License(s): BSD-3-Clause
  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. use Symfony\Component\DependencyInjection\Reference;
  16. use Symfony\Component\Validator\Validation;
  17. abstract class FrameworkExtensionTest extends TestCase
  18. {
  19. abstract protected function loadFromFile(ContainerBuilder $container, $file);
  20. public function testCsrfProtection()
  21. {
  22. $container = $this->createContainerFromFile('full');
  23. $def = $container->getDefinition('form.type_extension.csrf');
  24. $this->assertTrue($container->getParameter('form.type_extension.csrf.enabled'));
  25. $this->assertEquals('%form.type_extension.csrf.enabled%', $def->getArgument(1));
  26. $this->assertEquals('_csrf', $container->getParameter('form.type_extension.csrf.field_name'));
  27. $this->assertEquals('%form.type_extension.csrf.field_name%', $def->getArgument(2));
  28. }
  29. /**
  30. * @expectedException \LogicException
  31. * @expectedExceptionMessage CSRF protection needs sessions to be enabled.
  32. */
  33. public function testCsrfProtectionNeedsSessionToBeEnabled()
  34. {
  35. $this->createContainerFromFile('csrf_needs_session');
  36. }
  37. public function testCsrfProtectionForFormsEnablesCsrfProtectionAutomatically()
  38. {
  39. $container = $this->createContainerFromFile('csrf');
  40. $this->assertTrue($container->hasDefinition('security.csrf.token_manager'));
  41. }
  42. public function testSecureRandomIsAvailableIfCsrfIsDisabled()
  43. {
  44. $container = $this->createContainerFromFile('csrf_disabled');
  45. $this->assertTrue($container->hasDefinition('security.secure_random'));
  46. }
  47. public function testProxies()
  48. {
  49. $container = $this->createContainerFromFile('full');
  50. $this->assertEquals(array('127.0.0.1', '10.0.0.1'), $container->getParameter('kernel.trusted_proxies'));
  51. }
  52. public function testHttpMethodOverride()
  53. {
  54. $container = $this->createContainerFromFile('full');
  55. $this->assertFalse($container->getParameter('kernel.http_method_override'));
  56. }
  57. public function testEsi()
  58. {
  59. $container = $this->createContainerFromFile('full');
  60. $this->assertTrue($container->hasDefinition('esi'), '->registerEsiConfiguration() loads esi.xml');
  61. }
  62. public function testEnabledProfiler()
  63. {
  64. $container = $this->createContainerFromFile('profiler');
  65. $this->assertTrue($container->hasDefinition('profiler'), '->registerProfilerConfiguration() loads profiling.xml');
  66. $this->assertTrue($container->hasDefinition('data_collector.config'), '->registerProfilerConfiguration() loads collectors.xml');
  67. }
  68. public function testDisabledProfiler()
  69. {
  70. $container = $this->createContainerFromFile('full');
  71. $this->assertFalse($container->hasDefinition('profiler'), '->registerProfilerConfiguration() does not load profiling.xml');
  72. $this->assertFalse($container->hasDefinition('data_collector.config'), '->registerProfilerConfiguration() does not load collectors.xml');
  73. }
  74. public function testRouter()
  75. {
  76. $container = $this->createContainerFromFile('full');
  77. $this->assertTrue($container->has('router'), '->registerRouterConfiguration() loads routing.xml');
  78. $arguments = $container->findDefinition('router')->getArguments();
  79. $this->assertEquals($container->getParameter('kernel.root_dir').'/config/routing.xml', $container->getParameter('router.resource'), '->registerRouterConfiguration() sets routing resource');
  80. $this->assertEquals('%router.resource%', $arguments[1], '->registerRouterConfiguration() sets routing resource');
  81. $this->assertEquals('xml', $arguments[2]['resource_type'], '->registerRouterConfiguration() sets routing resource type');
  82. }
  83. /**
  84. * @expectedException \Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
  85. */
  86. public function testRouterRequiresResourceOption()
  87. {
  88. $container = $this->createContainer();
  89. $loader = new FrameworkExtension();
  90. $loader->load(array(array('router' => true)), $container);
  91. }
  92. public function testSession()
  93. {
  94. $container = $this->createContainerFromFile('full');
  95. $this->assertTrue($container->hasDefinition('session'), '->registerSessionConfiguration() loads session.xml');
  96. $this->assertEquals('fr', $container->getParameter('kernel.default_locale'));
  97. $this->assertEquals('session.storage.native', (string) $container->getAlias('session.storage'));
  98. $this->assertEquals('session.handler.native_file', (string) $container->getAlias('session.handler'));
  99. $options = $container->getParameter('session.storage.options');
  100. $this->assertEquals('_SYMFONY', $options['name']);
  101. $this->assertEquals(86400, $options['cookie_lifetime']);
  102. $this->assertEquals('/', $options['cookie_path']);
  103. $this->assertEquals('example.com', $options['cookie_domain']);
  104. $this->assertTrue($options['cookie_secure']);
  105. $this->assertTrue($options['cookie_httponly']);
  106. $this->assertEquals(108, $options['gc_divisor']);
  107. $this->assertEquals(1, $options['gc_probability']);
  108. $this->assertEquals(90000, $options['gc_maxlifetime']);
  109. $this->assertEquals('/path/to/sessions', $container->getParameter('session.save_path'));
  110. }
  111. public function testNullSessionHandler()
  112. {
  113. $container = $this->createContainerFromFile('session');
  114. $this->assertTrue($container->hasDefinition('session'), '->registerSessionConfiguration() loads session.xml');
  115. $this->assertNull($container->getDefinition('session.storage.native')->getArgument(1));
  116. $this->assertNull($container->getDefinition('session.storage.php_bridge')->getArgument(0));
  117. }
  118. public function testRequest()
  119. {
  120. $container = $this->createContainerFromFile('full');
  121. $this->assertTrue($container->hasDefinition('request.add_request_formats_listener'), '->registerRequestConfiguration() loads request.xml');
  122. $listenerDef = $container->getDefinition('request.add_request_formats_listener');
  123. $this->assertEquals(array('csv' => array('text/csv', 'text/plain'), 'pdf' => array('application/pdf')), $listenerDef->getArgument(0));
  124. }
  125. public function testEmptyRequestFormats()
  126. {
  127. $container = $this->createContainerFromFile('request');
  128. $this->assertFalse($container->hasDefinition('request.add_request_formats_listener'), '->registerRequestConfiguration() does not load request.xml when no request formats are defined');
  129. }
  130. public function testTemplating()
  131. {
  132. $container = $this->createContainerFromFile('full');
  133. $this->assertTrue($container->hasDefinition('templating.name_parser'), '->registerTemplatingConfiguration() loads templating.xml');
  134. $this->assertEquals('request', $container->getDefinition('templating.helper.assets')->getScope(), '->registerTemplatingConfiguration() sets request scope on assets helper if one or more packages are request-scoped');
  135. // default package should have one HTTP base URL and path package SSL URL
  136. $this->assertTrue($container->hasDefinition('templating.asset.default_package.http'));
  137. $package = $container->getDefinition('templating.asset.default_package.http');
  138. $this->assertInstanceOf('Symfony\\Component\\DependencyInjection\\DefinitionDecorator', $package);
  139. $this->assertEquals('templating.asset.url_package', $package->getParent());
  140. $arguments = array_values($package->getArguments());
  141. $this->assertEquals(array('http://cdn.example.com'), $arguments[0]);
  142. $this->assertEquals('SomeVersionScheme', $arguments[1]);
  143. $this->assertEquals('%%s?%%s', $arguments[2]);
  144. $this->assertTrue($container->hasDefinition('templating.asset.default_package.ssl'));
  145. $package = $container->getDefinition('templating.asset.default_package.ssl');
  146. $this->assertInstanceOf('Symfony\\Component\\DependencyInjection\\DefinitionDecorator', $package);
  147. $this->assertEquals('templating.asset.path_package', $package->getParent());
  148. $this->assertEquals('templating.engine.delegating', (string) $container->getAlias('templating'), '->registerTemplatingConfiguration() configures delegating loader if multiple engines are provided');
  149. $this->assertEquals($container->getDefinition('templating.loader.chain'), $container->getDefinition('templating.loader.wrapped'), '->registerTemplatingConfiguration() configures loader chain if multiple loaders are provided');
  150. $this->assertEquals($container->getDefinition('templating.loader'), $container->getDefinition('templating.loader.cache'), '->registerTemplatingConfiguration() configures the loader to use cache');
  151. $this->assertEquals('%templating.loader.cache.path%', $container->getDefinition('templating.loader.cache')->getArgument(1));
  152. $this->assertEquals('/path/to/cache', $container->getParameter('templating.loader.cache.path'));
  153. $this->assertEquals(array('php', 'twig'), $container->getParameter('templating.engines'), '->registerTemplatingConfiguration() sets a templating.engines parameter');
  154. $this->assertEquals(array('FrameworkBundle:Form', 'theme1', 'theme2'), $container->getParameter('templating.helper.form.resources'), '->registerTemplatingConfiguration() registers the theme and adds the base theme');
  155. $this->assertEquals('global_hinclude_template', $container->getParameter('fragment.renderer.hinclude.global_template'), '->registerTemplatingConfiguration() registers the global hinclude.js template');
  156. }
  157. public function testTemplatingAssetsHelperScopeDependsOnPackageArgumentScopes()
  158. {
  159. $container = $this->createContainerFromFile('templating_url_package');
  160. $this->assertNotEquals('request', $container->getDefinition('templating.helper.assets')->getScope(), '->registerTemplatingConfiguration() does not set request scope on assets helper if no packages are request-scoped');
  161. }
  162. public function testTranslator()
  163. {
  164. $container = $this->createContainerFromFile('full');
  165. $this->assertTrue($container->hasDefinition('translator.default'), '->registerTranslatorConfiguration() loads translation.xml');
  166. $this->assertEquals('translator.default', (string) $container->getAlias('translator'), '->registerTranslatorConfiguration() redefines translator service from identity to real translator');
  167. $resources = array();
  168. foreach ($container->getDefinition('translator.default')->getMethodCalls() as $call) {
  169. if ('addResource' == $call[0]) {
  170. $resources[] = $call[1];
  171. }
  172. }
  173. $files = array_map(function ($resource) { return realpath($resource[1]); }, $resources);
  174. $ref = new \ReflectionClass('Symfony\Component\Validator\Validator');
  175. $this->assertContains(
  176. strtr(dirname($ref->getFileName()).'/Resources/translations/validators.en.xlf', '/', DIRECTORY_SEPARATOR),
  177. $files,
  178. '->registerTranslatorConfiguration() finds Validator translation resources'
  179. );
  180. $ref = new \ReflectionClass('Symfony\Component\Form\Form');
  181. $this->assertContains(
  182. strtr(dirname($ref->getFileName()).'/Resources/translations/validators.en.xlf', '/', DIRECTORY_SEPARATOR),
  183. $files,
  184. '->registerTranslatorConfiguration() finds Form translation resources'
  185. );
  186. $ref = new \ReflectionClass('Symfony\Component\Security\Core\SecurityContext');
  187. $this->assertContains(
  188. strtr(dirname($ref->getFileName()).'/Resources/translations/security.en.xlf', '/', DIRECTORY_SEPARATOR),
  189. $files,
  190. '->registerTranslatorConfiguration() finds Security translation resources'
  191. );
  192. $calls = $container->getDefinition('translator.default')->getMethodCalls();
  193. $this->assertEquals(array('fr'), $calls[0][1][0]);
  194. }
  195. /**
  196. * @expectedException \Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
  197. */
  198. public function testTemplatingRequiresAtLeastOneEngine()
  199. {
  200. $container = $this->createContainer();
  201. $loader = new FrameworkExtension();
  202. $loader->load(array(array('templating' => null)), $container);
  203. }
  204. public function testValidation()
  205. {
  206. $container = $this->createContainerFromFile('full');
  207. $ref = new \ReflectionClass('Symfony\Component\Form\Form');
  208. $xmlMappings = array(realpath(dirname($ref->getFileName()).'/Resources/config/validation.xml'));
  209. $calls = $container->getDefinition('validator.builder')->getMethodCalls();
  210. $this->assertCount(7, $calls);
  211. $this->assertSame('setConstraintValidatorFactory', $calls[0][0]);
  212. $this->assertEquals(array(new Reference('validator.validator_factory')), $calls[0][1]);
  213. $this->assertSame('setTranslator', $calls[1][0]);
  214. $this->assertEquals(array(new Reference('translator')), $calls[1][1]);
  215. $this->assertSame('setTranslationDomain', $calls[2][0]);
  216. $this->assertSame(array('%validator.translation_domain%'), $calls[2][1]);
  217. $this->assertSame('addXmlMappings', $calls[3][0]);
  218. $this->assertSame(array($xmlMappings), $calls[3][1]);
  219. $this->assertSame('addMethodMapping', $calls[4][0]);
  220. $this->assertSame(array('loadValidatorMetadata'), $calls[4][1]);
  221. $this->assertSame('setMetadataCache', $calls[5][0]);
  222. $this->assertEquals(array(new Reference('validator.mapping.cache.apc')), $calls[5][1]);
  223. $this->assertSame('setApiVersion', $calls[6][0]);
  224. if (version_compare(PHP_VERSION, '5.3.9', '<')) {
  225. $this->assertEquals(array(Validation::API_VERSION_2_4), $calls[6][1]);
  226. } else {
  227. $this->assertEquals(array(Validation::API_VERSION_2_5_BC), $calls[6][1]);
  228. }
  229. }
  230. public function testFullyConfiguredValidationService()
  231. {
  232. if (!extension_loaded('apc')) {
  233. $this->markTestSkipped('The apc extension is not available.');
  234. }
  235. $container = $this->createContainerFromFile('full');
  236. $this->assertInstanceOf('Symfony\Component\Validator\ValidatorInterface', $container->get('validator'));
  237. }
  238. public function testValidationService()
  239. {
  240. $container = $this->createContainerFromFile('validation_annotations');
  241. $this->assertInstanceOf('Symfony\Component\Validator\ValidatorInterface', $container->get('validator'));
  242. }
  243. public function testAnnotations()
  244. {
  245. $container = $this->createContainerFromFile('full');
  246. $this->assertEquals($container->getParameter('kernel.cache_dir').'/annotations', $container->getDefinition('annotations.file_cache_reader')->getArgument(1));
  247. $this->assertInstanceOf('Doctrine\Common\Annotations\FileCacheReader', $container->get('annotation_reader'));
  248. }
  249. public function testFileLinkFormat()
  250. {
  251. $container = $this->createContainerFromFile('full');
  252. $this->assertEquals('file%link%format', $container->getParameter('templating.helper.code.file_link_format'));
  253. }
  254. public function testValidationAnnotations()
  255. {
  256. $container = $this->createContainerFromFile('validation_annotations');
  257. $calls = $container->getDefinition('validator.builder')->getMethodCalls();
  258. $this->assertCount(7, $calls);
  259. $this->assertSame('enableAnnotationMapping', $calls[4][0]);
  260. $this->assertEquals(array(new Reference('annotation_reader')), $calls[4][1]);
  261. $this->assertSame('addMethodMapping', $calls[5][0]);
  262. $this->assertSame(array('loadValidatorMetadata'), $calls[5][1]);
  263. // no cache this time
  264. }
  265. public function testValidationPaths()
  266. {
  267. require_once __DIR__."/Fixtures/TestBundle/TestBundle.php";
  268. $container = $this->createContainerFromFile('validation_annotations', array(
  269. 'kernel.bundles' => array('TestBundle' => 'Symfony\Bundle\FrameworkBundle\Tests\TestBundle'),
  270. ));
  271. $calls = $container->getDefinition('validator.builder')->getMethodCalls();
  272. $this->assertCount(8, $calls);
  273. $this->assertSame('addXmlMappings', $calls[3][0]);
  274. $this->assertSame('addYamlMappings', $calls[4][0]);
  275. $this->assertSame('enableAnnotationMapping', $calls[5][0]);
  276. $this->assertSame('addMethodMapping', $calls[6][0]);
  277. $this->assertSame(array('loadValidatorMetadata'), $calls[6][1]);
  278. $xmlMappings = $calls[3][1][0];
  279. $this->assertCount(2, $xmlMappings);
  280. $this->assertStringEndsWith('Component'.DIRECTORY_SEPARATOR.'Form/Resources/config/validation.xml', $xmlMappings[0]);
  281. $this->assertStringEndsWith('TestBundle'.DIRECTORY_SEPARATOR.'Resources'.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'validation.xml', $xmlMappings[1]);
  282. $yamlMappings = $calls[4][1][0];
  283. $this->assertCount(1, $yamlMappings);
  284. $this->assertStringEndsWith('TestBundle'.DIRECTORY_SEPARATOR.'Resources'.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'validation.yml', $yamlMappings[0]);
  285. }
  286. public function testValidationNoStaticMethod()
  287. {
  288. $container = $this->createContainerFromFile('validation_no_static_method');
  289. $calls = $container->getDefinition('validator.builder')->getMethodCalls();
  290. $this->assertCount(5, $calls);
  291. $this->assertSame('addXmlMappings', $calls[3][0]);
  292. // no cache, no annotations, no static methods
  293. }
  294. public function testValidation2Dot4Api()
  295. {
  296. $container = $this->createContainerFromFile('validation_2_4_api');
  297. $calls = $container->getDefinition('validator.builder')->getMethodCalls();
  298. $this->assertCount(6, $calls);
  299. $this->assertSame('addXmlMappings', $calls[3][0]);
  300. $this->assertSame('addMethodMapping', $calls[4][0]);
  301. $this->assertSame(array('loadValidatorMetadata'), $calls[4][1]);
  302. $this->assertSame('setApiVersion', $calls[5][0]);
  303. $this->assertSame(array(Validation::API_VERSION_2_4), $calls[5][1]);
  304. // no cache, no annotations
  305. }
  306. public function testValidation2Dot5Api()
  307. {
  308. $container = $this->createContainerFromFile('validation_2_5_api');
  309. $calls = $container->getDefinition('validator.builder')->getMethodCalls();
  310. $this->assertCount(6, $calls);
  311. $this->assertSame('addXmlMappings', $calls[3][0]);
  312. $this->assertSame('addMethodMapping', $calls[4][0]);
  313. $this->assertSame(array('loadValidatorMetadata'), $calls[4][1]);
  314. $this->assertSame('setApiVersion', $calls[5][0]);
  315. $this->assertSame(array(Validation::API_VERSION_2_5), $calls[5][1]);
  316. // no cache, no annotations
  317. }
  318. public function testValidation2Dot5BcApi()
  319. {
  320. $container = $this->createContainerFromFile('validation_2_5_bc_api');
  321. $calls = $container->getDefinition('validator.builder')->getMethodCalls();
  322. $this->assertCount(6, $calls);
  323. $this->assertSame('addXmlMappings', $calls[3][0]);
  324. $this->assertSame('addMethodMapping', $calls[4][0]);
  325. $this->assertSame(array('loadValidatorMetadata'), $calls[4][1]);
  326. $this->assertSame('setApiVersion', $calls[5][0]);
  327. $this->assertSame(array(Validation::API_VERSION_2_5_BC), $calls[5][1]);
  328. // no cache, no annotations
  329. }
  330. public function testValidationImplicitApi()
  331. {
  332. $container = $this->createContainerFromFile('validation_implicit_api');
  333. $calls = $container->getDefinition('validator.builder')->getMethodCalls();
  334. $this->assertCount(6, $calls);
  335. $this->assertSame('addXmlMappings', $calls[3][0]);
  336. $this->assertSame('addMethodMapping', $calls[4][0]);
  337. $this->assertSame(array('loadValidatorMetadata'), $calls[4][1]);
  338. $this->assertSame('setApiVersion', $calls[5][0]);
  339. // no cache, no annotations
  340. if (version_compare(PHP_VERSION, '5.3.9', '<')) {
  341. $this->assertSame(array(Validation::API_VERSION_2_4), $calls[5][1]);
  342. } else {
  343. $this->assertSame(array(Validation::API_VERSION_2_5_BC), $calls[5][1]);
  344. }
  345. }
  346. /**
  347. * This feature is equivalent to the implicit api, only that the "api"
  348. * key is explicitly set to "auto".
  349. */
  350. public function testValidationAutoApi()
  351. {
  352. $container = $this->createContainerFromFile('validation_auto_api');
  353. $calls = $container->getDefinition('validator.builder')->getMethodCalls();
  354. $this->assertCount(6, $calls);
  355. $this->assertSame('addXmlMappings', $calls[3][0]);
  356. $this->assertSame('addMethodMapping', $calls[4][0]);
  357. $this->assertSame(array('loadValidatorMetadata'), $calls[4][1]);
  358. $this->assertSame('setApiVersion', $calls[5][0]);
  359. // no cache, no annotations
  360. if (version_compare(PHP_VERSION, '5.3.9', '<')) {
  361. $this->assertSame(array(Validation::API_VERSION_2_4), $calls[5][1]);
  362. } else {
  363. $this->assertSame(array(Validation::API_VERSION_2_5_BC), $calls[5][1]);
  364. }
  365. }
  366. public function testFormsCanBeEnabledWithoutCsrfProtection()
  367. {
  368. $container = $this->createContainerFromFile('form_no_csrf');
  369. $this->assertFalse($container->getParameter('form.type_extension.csrf.enabled'));
  370. }
  371. public function testFormCsrfFieldNameCanBeSetUnderCsrfSettings()
  372. {
  373. $container = $this->createContainerFromFile('form_csrf_sets_field_name');
  374. $this->assertTrue($container->getParameter('form.type_extension.csrf.enabled'));
  375. $this->assertEquals('_custom', $container->getParameter('form.type_extension.csrf.field_name'));
  376. }
  377. public function testFormCsrfFieldNameUnderFormSettingsTakesPrecedence()
  378. {
  379. $container = $this->createContainerFromFile('form_csrf_under_form_sets_field_name');
  380. $this->assertTrue($container->getParameter('form.type_extension.csrf.enabled'));
  381. $this->assertEquals('_custom_form', $container->getParameter('form.type_extension.csrf.field_name'));
  382. }
  383. protected function createContainer(array $data = array())
  384. {
  385. return new ContainerBuilder(new ParameterBag(array_merge(array(
  386. 'kernel.bundles' => array('FrameworkBundle' => 'Symfony\\Bundle\\FrameworkBundle\\FrameworkBundle'),
  387. 'kernel.cache_dir' => __DIR__,
  388. 'kernel.debug' => false,
  389. 'kernel.environment' => 'test',
  390. 'kernel.name' => 'kernel',
  391. 'kernel.root_dir' => __DIR__,
  392. ), $data)));
  393. }
  394. protected function createContainerFromFile($file, $data = array())
  395. {
  396. $container = $this->createContainer($data);
  397. $container->registerExtension(new FrameworkExtension());
  398. $this->loadFromFile($container, $file);
  399. $container->getCompilerPassConfig()->setOptimizationPasses(array());
  400. $container->getCompilerPassConfig()->setRemovingPasses(array());
  401. $container->compile();
  402. return $container;
  403. }
  404. }