PageRenderTime 43ms CodeModel.GetById 10ms RepoModel.GetById 1ms app.codeStats 0ms

/tests/Silex/Tests/Provider/FormServiceProviderTest.php

http://github.com/fabpot/Silex
PHP | 355 lines | 256 code | 74 blank | 25 comment | 8 complexity | 78f568a246b3ddff52bdd486edffc224 MD5 | raw file
  1. <?php
  2. /*
  3. * This file is part of the Silex framework.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * This source file is subject to the MIT license that is bundled
  8. * with this source code in the file LICENSE.
  9. */
  10. namespace Silex\Tests\Provider;
  11. use Silex\Application;
  12. use Silex\Provider\FormServiceProvider;
  13. use Silex\Provider\CsrfServiceProvider;
  14. use Silex\Provider\SessionServiceProvider;
  15. use Silex\Provider\TranslationServiceProvider;
  16. use Silex\Provider\ValidatorServiceProvider;
  17. use Symfony\Component\Form\AbstractType;
  18. use Symfony\Component\Form\AbstractTypeExtension;
  19. use Symfony\Component\Form\FormTypeGuesserChain;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use Symfony\Component\OptionsResolver\OptionsResolver;
  22. use Symfony\Component\OptionsResolver\OptionsResolverInterface;
  23. use Symfony\Component\Translation\Exception\NotFoundResourceException;
  24. class FormServiceProviderTest extends \PHPUnit_Framework_TestCase
  25. {
  26. public function testFormFactoryServiceIsFormFactory()
  27. {
  28. $app = new Application();
  29. $app->register(new FormServiceProvider());
  30. $this->assertInstanceOf('Symfony\Component\Form\FormFactory', $app['form.factory']);
  31. }
  32. public function testFormServiceProviderWillLoadTypes()
  33. {
  34. $app = new Application();
  35. $app->register(new FormServiceProvider());
  36. $app->extend('form.types', function ($extensions) {
  37. $extensions[] = new DummyFormType();
  38. return $extensions;
  39. });
  40. $form = $app['form.factory']->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', array())
  41. ->add('dummy', 'Silex\Tests\Provider\DummyFormType')
  42. ->getForm();
  43. $this->assertInstanceOf('Symfony\Component\Form\Form', $form);
  44. }
  45. public function testFormServiceProviderWillLoadTypesServices()
  46. {
  47. $app = new Application();
  48. $app->register(new FormServiceProvider());
  49. $app['dummy'] = function () {
  50. return new DummyFormType();
  51. };
  52. $app->extend('form.types', function ($extensions) {
  53. $extensions[] = 'dummy';
  54. return $extensions;
  55. });
  56. $form = $app['form.factory']
  57. ->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', array())
  58. ->add('dummy', 'dummy')
  59. ->getForm();
  60. $this->assertInstanceOf('Symfony\Component\Form\Form', $form);
  61. }
  62. /**
  63. * @expectedException \Symfony\Component\Form\Exception\InvalidArgumentException
  64. * @expectedExceptionMessage Invalid form type. The silex service "dummy" does not exist.
  65. */
  66. public function testNonExistentTypeService()
  67. {
  68. $app = new Application();
  69. $app->register(new FormServiceProvider());
  70. $app->extend('form.types', function ($extensions) {
  71. $extensions[] = 'dummy';
  72. return $extensions;
  73. });
  74. $app['form.factory']
  75. ->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', array())
  76. ->add('dummy', 'dummy')
  77. ->getForm();
  78. }
  79. public function testFormServiceProviderWillLoadTypeExtensions()
  80. {
  81. $app = new Application();
  82. $app->register(new FormServiceProvider());
  83. $app->extend('form.type.extensions', function ($extensions) {
  84. $extensions[] = new DummyFormTypeExtension();
  85. return $extensions;
  86. });
  87. $form = $app['form.factory']->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', array())
  88. ->add('file', 'Symfony\Component\Form\Extension\Core\Type\FileType', array('image_path' => 'webPath'))
  89. ->getForm();
  90. $this->assertInstanceOf('Symfony\Component\Form\Form', $form);
  91. }
  92. public function testFormServiceProviderWillLoadTypeExtensionsServices()
  93. {
  94. $app = new Application();
  95. $app->register(new FormServiceProvider());
  96. $app['dummy.form.type.extension'] = function () {
  97. return new DummyFormTypeExtension();
  98. };
  99. $app->extend('form.type.extensions', function ($extensions) {
  100. $extensions[] = 'dummy.form.type.extension';
  101. return $extensions;
  102. });
  103. $form = $app['form.factory']
  104. ->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', array())
  105. ->add('file', 'Symfony\Component\Form\Extension\Core\Type\FileType', array('image_path' => 'webPath'))
  106. ->getForm();
  107. $this->assertInstanceOf('Symfony\Component\Form\Form', $form);
  108. }
  109. /**
  110. * @expectedException \Symfony\Component\Form\Exception\InvalidArgumentException
  111. * @expectedExceptionMessage Invalid form type extension. The silex service "dummy.form.type.extension" does not exist.
  112. */
  113. public function testNonExistentTypeExtensionService()
  114. {
  115. $app = new Application();
  116. $app->register(new FormServiceProvider());
  117. $app->extend('form.type.extensions', function ($extensions) {
  118. $extensions[] = 'dummy.form.type.extension';
  119. return $extensions;
  120. });
  121. $app['form.factory']
  122. ->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', array())
  123. ->add('dummy', 'dummy.form.type')
  124. ->getForm();
  125. }
  126. public function testFormServiceProviderWillLoadTypeGuessers()
  127. {
  128. $app = new Application();
  129. $app->register(new FormServiceProvider());
  130. $app->extend('form.type.guessers', function ($guessers) {
  131. $guessers[] = new FormTypeGuesserChain(array());
  132. return $guessers;
  133. });
  134. $this->assertInstanceOf('Symfony\Component\Form\FormFactory', $app['form.factory']);
  135. }
  136. public function testFormServiceProviderWillLoadTypeGuessersServices()
  137. {
  138. $app = new Application();
  139. $app->register(new FormServiceProvider());
  140. $app['dummy.form.type.guesser'] = function () {
  141. return new FormTypeGuesserChain(array());
  142. };
  143. $app->extend('form.type.guessers', function ($guessers) {
  144. $guessers[] = 'dummy.form.type.guesser';
  145. return $guessers;
  146. });
  147. $this->assertInstanceOf('Symfony\Component\Form\FormFactory', $app['form.factory']);
  148. }
  149. /**
  150. * @expectedException \Symfony\Component\Form\Exception\InvalidArgumentException
  151. * @expectedExceptionMessage Invalid form type guesser. The silex service "dummy.form.type.guesser" does not exist.
  152. */
  153. public function testNonExistentTypeGuesserService()
  154. {
  155. $app = new Application();
  156. $app->register(new FormServiceProvider());
  157. $app->extend('form.type.guessers', function ($extensions) {
  158. $extensions[] = 'dummy.form.type.guesser';
  159. return $extensions;
  160. });
  161. $factory = $app['form.factory'];
  162. }
  163. public function testFormServiceProviderWillUseTranslatorIfAvailable()
  164. {
  165. $app = new Application();
  166. $app->register(new FormServiceProvider());
  167. $app->register(new TranslationServiceProvider());
  168. $app['translator.domains'] = array(
  169. 'messages' => array(
  170. 'de' => array(
  171. 'The CSRF token is invalid. Please try to resubmit the form.' => 'German translation',
  172. ),
  173. ),
  174. );
  175. $app['locale'] = 'de';
  176. $app['csrf.token_manager'] = function () {
  177. return $this->getMockBuilder('Symfony\Component\Security\Csrf\CsrfTokenManagerInterface')->getMock();
  178. };
  179. $form = $app['form.factory']->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', array())
  180. ->getForm();
  181. $form->handleRequest($req = Request::create('/', 'POST', array('form' => array(
  182. '_token' => 'the wrong token',
  183. ))));
  184. $this->assertFalse($form->isValid());
  185. $r = new \ReflectionMethod($form, 'getErrors');
  186. if (!$r->getNumberOfParameters()) {
  187. $this->assertContains('ERROR: German translation', $form->getErrorsAsString());
  188. } else {
  189. // as of 2.5
  190. $this->assertContains('ERROR: German translation', (string) $form->getErrors(true, false));
  191. }
  192. }
  193. public function testFormServiceProviderWillNotAddNonexistentTranslationFiles()
  194. {
  195. $app = new Application(array(
  196. 'locale' => 'nonexistent',
  197. ));
  198. $app->register(new FormServiceProvider());
  199. $app->register(new ValidatorServiceProvider());
  200. $app->register(new TranslationServiceProvider(), array(
  201. 'locale_fallbacks' => array(),
  202. ));
  203. $app['form.factory'];
  204. $translator = $app['translator'];
  205. try {
  206. $translator->trans('test');
  207. } catch (NotFoundResourceException $e) {
  208. $this->fail('Form factory should not add a translation resource that does not exist');
  209. }
  210. }
  211. public function testFormCsrf()
  212. {
  213. $app = new Application();
  214. $app->register(new FormServiceProvider());
  215. $app->register(new SessionServiceProvider());
  216. $app->register(new CsrfServiceProvider());
  217. $app['session.test'] = true;
  218. $form = $app['form.factory']->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', array())->getForm();
  219. $this->assertTrue(isset($form->createView()['_token']));
  220. }
  221. public function testUserExtensionCanConfigureDefaultExtensions()
  222. {
  223. $app = new Application();
  224. $app->register(new FormServiceProvider());
  225. $app->register(new SessionServiceProvider());
  226. $app->register(new CsrfServiceProvider());
  227. $app['session.test'] = true;
  228. $app->extend('form.type.extensions', function ($extensions) {
  229. $extensions[] = new FormServiceProviderTest\DisableCsrfExtension();
  230. return $extensions;
  231. });
  232. $form = $app['form.factory']->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', array())->getForm();
  233. $this->assertFalse($form->getConfig()->getOption('csrf_protection'));
  234. }
  235. }
  236. if (!class_exists('Symfony\Component\Form\Deprecated\FormEvents')) {
  237. class DummyFormType extends AbstractType
  238. {
  239. }
  240. } else {
  241. // FormTypeInterface::getName() is needed by the form component 2.8.x
  242. class DummyFormType extends AbstractType
  243. {
  244. /**
  245. * @return string The name of this type
  246. */
  247. public function getName()
  248. {
  249. return 'dummy';
  250. }
  251. }
  252. }
  253. if (method_exists('Symfony\Component\Form\AbstractType', 'configureOptions')) {
  254. class DummyFormTypeExtension extends AbstractTypeExtension
  255. {
  256. public function getExtendedType()
  257. {
  258. return 'Symfony\Component\Form\Extension\Core\Type\FileType';
  259. }
  260. public function configureOptions(OptionsResolver $resolver)
  261. {
  262. $resolver->setDefined(array('image_path'));
  263. }
  264. }
  265. } else {
  266. class DummyFormTypeExtension extends AbstractTypeExtension
  267. {
  268. public function getExtendedType()
  269. {
  270. return 'Symfony\Component\Form\Extension\Core\Type\FileType';
  271. }
  272. public function setDefaultOptions(OptionsResolverInterface $resolver)
  273. {
  274. if (!method_exists($resolver, 'setDefined')) {
  275. $resolver->setOptional(array('image_path'));
  276. } else {
  277. $resolver->setDefined(array('image_path'));
  278. }
  279. }
  280. }
  281. }