* * 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 PHPUnit\Framework\TestCase; 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\Translation\Exception\NotFoundResourceException; class FormServiceProviderTest extends TestCase { public function testFormFactoryServiceIsFormFactory() { $app = new Application(); $app->register(new FormServiceProvider()); $this->assertInstanceOf('Symfony\Component\Form\FormFactory', $app['form.factory']); } public function testFormRegistryServiceIsFormRegistry() { $app = new Application(); $app->register(new FormServiceProvider()); $this->assertInstanceOf('Symfony\Component\Form\FormRegistry', $app['form.registry']); } 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', []) ->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', []) ->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', []) ->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', []) ->add('file', 'Symfony\Component\Form\Extension\Core\Type\FileType', ['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', []) ->add('file', 'Symfony\Component\Form\Extension\Core\Type\FileType', ['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', []) ->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([]); 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([]); }; $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'] = [ 'messages' => [ 'de' => [ 'The CSRF token is invalid. Please try to resubmit the form.' => 'German translation', ], ], ]; $app['locale'] = 'de'; $app['csrf.token_manager'] = function () { return $this->getMockBuilder('Symfony\Component\Security\Csrf\CsrfTokenManagerInterface')->getMock(); }; $form = $app['form.factory']->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', []) ->getForm(); $form->handleRequest($req = Request::create('/', 'POST', ['form' => [ '_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([ 'locale' => 'nonexistent', ]); $app->register(new FormServiceProvider()); $app->register(new ValidatorServiceProvider()); $app->register(new TranslationServiceProvider(), [ 'locale_fallbacks' => [], ]); $app['form.factory']; $translator = $app['translator']; try { $translator->trans('test'); $this->addToAssertionCount(1); } 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', [])->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', [])->getForm(); $this->assertFalse($form->getConfig()->getOption('csrf_protection')); } } class DummyFormType extends AbstractType { } class DummyFormTypeExtension extends AbstractTypeExtension { public function getExtendedType() { return 'Symfony\Component\Form\Extension\Core\Type\FileType'; } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefined(['image_path']); } }