* * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Provider; use Silex\Application; use Silex\Provider\FormServiceProvider; use Silex\Provider\CsrfServiceProvider; use Silex\Provider\SessionServiceProvider; use Silex\Provider\TranslationServiceProvider; use Silex\Provider\ValidatorServiceProvider; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractTypeExtension; use Symfony\Component\Form\FormTypeGuesserChain; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolverInterface; use Symfony\Component\Translation\Exception\NotFoundResourceException; class FormServiceProviderTest extends \PHPUnit_Framework_TestCase { public function testFormFactoryServiceIsFormFactory() { $app = new Application(); $app->register(new FormServiceProvider()); $this->assertInstanceOf('Symfony\Component\Form\FormFactory', $app['form.factory']); } public function testFormServiceProviderWillLoadTypes() { $app = new Application(); $app->register(new FormServiceProvider()); $app->extend('form.types', function ($extensions) { $extensions[] = new DummyFormType(); return $extensions; }); $form = $app['form.factory']->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', array()) ->add('dummy', 'Silex\Tests\Provider\DummyFormType') ->getForm(); $this->assertInstanceOf('Symfony\Component\Form\Form', $form); } public function testFormServiceProviderWillLoadTypesServices() { $app = new Application(); $app->register(new FormServiceProvider()); $app['dummy'] = function () { return new DummyFormType(); }; $app->extend('form.types', function ($extensions) { $extensions[] = 'dummy'; return $extensions; }); $form = $app['form.factory'] ->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', array()) ->add('dummy', 'dummy') ->getForm(); $this->assertInstanceOf('Symfony\Component\Form\Form', $form); } /** * @expectedException \Symfony\Component\Form\Exception\InvalidArgumentException * @expectedExceptionMessage Invalid form type. The silex service "dummy" does not exist. */ public function testNonExistentTypeService() { $app = new Application(); $app->register(new FormServiceProvider()); $app->extend('form.types', function ($extensions) { $extensions[] = 'dummy'; return $extensions; }); $app['form.factory'] ->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', array()) ->add('dummy', 'dummy') ->getForm(); } public function testFormServiceProviderWillLoadTypeExtensions() { $app = new Application(); $app->register(new FormServiceProvider()); $app->extend('form.type.extensions', function ($extensions) { $extensions[] = new DummyFormTypeExtension(); return $extensions; }); $form = $app['form.factory']->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', array()) ->add('file', 'Symfony\Component\Form\Extension\Core\Type\FileType', array('image_path' => 'webPath')) ->getForm(); $this->assertInstanceOf('Symfony\Component\Form\Form', $form); } public function testFormServiceProviderWillLoadTypeExtensionsServices() { $app = new Application(); $app->register(new FormServiceProvider()); $app['dummy.form.type.extension'] = function () { return new DummyFormTypeExtension(); }; $app->extend('form.type.extensions', function ($extensions) { $extensions[] = 'dummy.form.type.extension'; return $extensions; }); $form = $app['form.factory'] ->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', array()) ->add('file', 'Symfony\Component\Form\Extension\Core\Type\FileType', array('image_path' => 'webPath')) ->getForm(); $this->assertInstanceOf('Symfony\Component\Form\Form', $form); } /** * @expectedException \Symfony\Component\Form\Exception\InvalidArgumentException * @expectedExceptionMessage Invalid form type extension. The silex service "dummy.form.type.extension" does not exist. */ public function testNonExistentTypeExtensionService() { $app = new Application(); $app->register(new FormServiceProvider()); $app->extend('form.type.extensions', function ($extensions) { $extensions[] = 'dummy.form.type.extension'; return $extensions; }); $app['form.factory'] ->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', array()) ->add('dummy', 'dummy.form.type') ->getForm(); } public function testFormServiceProviderWillLoadTypeGuessers() { $app = new Application(); $app->register(new FormServiceProvider()); $app->extend('form.type.guessers', function ($guessers) { $guessers[] = new FormTypeGuesserChain(array()); return $guessers; }); $this->assertInstanceOf('Symfony\Component\Form\FormFactory', $app['form.factory']); } public function testFormServiceProviderWillLoadTypeGuessersServices() { $app = new Application(); $app->register(new FormServiceProvider()); $app['dummy.form.type.guesser'] = function () { return new FormTypeGuesserChain(array()); }; $app->extend('form.type.guessers', function ($guessers) { $guessers[] = 'dummy.form.type.guesser'; return $guessers; }); $this->assertInstanceOf('Symfony\Component\Form\FormFactory', $app['form.factory']); } /** * @expectedException \Symfony\Component\Form\Exception\InvalidArgumentException * @expectedExceptionMessage Invalid form type guesser. The silex service "dummy.form.type.guesser" does not exist. */ public function testNonExistentTypeGuesserService() { $app = new Application(); $app->register(new FormServiceProvider()); $app->extend('form.type.guessers', function ($extensions) { $extensions[] = 'dummy.form.type.guesser'; return $extensions; }); $factory = $app['form.factory']; } public function testFormServiceProviderWillUseTranslatorIfAvailable() { $app = new Application(); $app->register(new FormServiceProvider()); $app->register(new TranslationServiceProvider()); $app['translator.domains'] = array( 'messages' => array( 'de' => array( 'The CSRF token is invalid. Please try to resubmit the form.' => 'German translation', ), ), ); $app['locale'] = 'de'; $app['csrf.token_manager'] = function () { return $this->getMock('Symfony\Component\Security\Csrf\CsrfTokenManagerInterface'); }; $form = $app['form.factory']->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', array()) ->getForm(); $form->handleRequest($req = Request::create('/', 'POST', array('form' => array( '_token' => 'the wrong token', )))); $this->assertFalse($form->isValid()); $r = new \ReflectionMethod($form, 'getErrors'); if (!$r->getNumberOfParameters()) { $this->assertContains('ERROR: German translation', $form->getErrorsAsString()); } else { // as of 2.5 $this->assertContains('ERROR: German translation', (string) $form->getErrors(true, false)); } } public function testFormServiceProviderWillNotAddNonexistentTranslationFiles() { $app = new Application(array( 'locale' => 'nonexistent', )); $app->register(new FormServiceProvider()); $app->register(new ValidatorServiceProvider()); $app->register(new TranslationServiceProvider(), array( 'locale_fallbacks' => array(), )); $app['form.factory']; $translator = $app['translator']; try { $translator->trans('test'); } catch (NotFoundResourceException $e) { $this->fail('Form factory should not add a translation resource that does not exist'); } } public function testFormCsrf() { $app = new Application(); $app->register(new FormServiceProvider()); $app->register(new SessionServiceProvider()); $app->register(new CsrfServiceProvider()); $app['session.test'] = true; $form = $app['form.factory']->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', array())->getForm(); $this->assertTrue(isset($form->createView()['_token'])); } public function testUserExtensionCanConfigureDefaultExtensions() { $app = new Application(); $app->register(new FormServiceProvider()); $app->register(new SessionServiceProvider()); $app->register(new CsrfServiceProvider()); $app['session.test'] = true; $app->extend('form.type.extensions', function ($extensions) { $extensions[] = new FormServiceProviderTest\DisableCsrfExtension(); return $extensions; }); $form = $app['form.factory']->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', array())->getForm(); $this->assertFalse($form->getConfig()->getOption('csrf_protection')); } } if (!class_exists('Symfony\Component\Form\Deprecated\FormEvents')) { class DummyFormType extends AbstractType { } } else { // FormTypeInterface::getName() is needed by the form component 2.8.x class DummyFormType extends AbstractType { /** * @return string The name of this type */ public function getName() { return 'dummy'; } } } if (method_exists('Symfony\Component\Form\AbstractType', 'configureOptions')) { class DummyFormTypeExtension extends AbstractTypeExtension { public function getExtendedType() { return 'Symfony\Component\Form\Extension\Core\Type\FileType'; } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefined(array('image_path')); } } } else { class DummyFormTypeExtension extends AbstractTypeExtension { public function getExtendedType() { return 'Symfony\Component\Form\Extension\Core\Type\FileType'; } public function setDefaultOptions(OptionsResolverInterface $resolver) { if (!method_exists($resolver, 'setDefined')) { $resolver->setOptional(array('image_path')); } else { $resolver->setDefined(array('image_path')); } } } }