This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
symfony/src/Symfony/Component/Form/Tests/CompoundFormTest.php

1025 lines
32 KiB
PHP
Raw Normal View History

<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Form\Tests;
use Symfony\Component\Form\Extension\Core\DataMapper\PropertyPathMapper;
use Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationRequestHandler;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\Forms;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\SubmitButtonBuilder;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\Form\Tests\Fixtures\FixedDataTransformer;
class CompoundFormTest extends AbstractFormTest
{
public function testValidIfAllChildrenAreValid()
{
$this->form->add($this->getBuilder('firstName')->getForm());
$this->form->add($this->getBuilder('lastName')->getForm());
$this->form->submit(array(
'firstName' => 'Bernhard',
'lastName' => 'Schussek',
));
$this->assertTrue($this->form->isValid());
}
public function testInvalidIfChildIsInvalid()
{
$this->form->add($this->getBuilder('firstName')->getForm());
$this->form->add($this->getBuilder('lastName')->getForm());
$this->form->submit(array(
'firstName' => 'Bernhard',
'lastName' => 'Schussek',
));
$this->form->get('lastName')->addError(new FormError('Invalid'));
$this->assertFalse($this->form->isValid());
}
public function testDisabledFormsValidEvenIfChildrenInvalid()
{
$form = $this->getBuilder('person')
->setDisabled(true)
->setCompound(true)
->setDataMapper($this->getDataMapper())
->add($this->getBuilder('name'))
->getForm();
$form->submit(array('name' => 'Jacques Doe'));
$form->get('name')->addError(new FormError('Invalid'));
$this->assertTrue($form->isValid());
}
public function testSubmitForwardsNullIfNotClearMissingButValueIsExplicitlyNull()
{
$child = $this->getMockForm('firstName');
$this->form->add($child);
$child->expects($this->once())
->method('submit')
->with($this->equalTo(null));
$this->form->submit(array('firstName' => null), false);
}
public function testSubmitForwardsNullIfValueIsMissing()
{
$child = $this->getMockForm('firstName');
$this->form->add($child);
$child->expects($this->once())
->method('submit')
->with($this->equalTo(null));
$this->form->submit(array());
}
public function testSubmitDoesNotForwardNullIfNotClearMissing()
{
$child = $this->getMockForm('firstName');
$this->form->add($child);
$child->expects($this->never())
->method('submit');
$this->form->submit(array(), false);
}
public function testSubmitDoesNotAddExtraFieldForNullValues()
{
$factory = Forms::createFormFactoryBuilder()
->getFormFactory();
$child = $factory->createNamed('file', 'Symfony\Component\Form\Extension\Core\Type\FileType', null, array('auto_initialize' => false));
$this->form->add($child);
$this->form->submit(array('file' => null), false);
$this->assertCount(0, $this->form->getExtraData());
}
public function testClearMissingFlagIsForwarded()
{
$child = $this->getMockForm('firstName');
$this->form->add($child);
$child->expects($this->once())
->method('submit')
->with($this->equalTo('foo'), false);
$this->form->submit(array('firstName' => 'foo'), false);
}
public function testCloneChildren()
{
$child = $this->getBuilder('child')->getForm();
$this->form->add($child);
$clone = clone $this->form;
$this->assertNotSame($this->form, $clone);
$this->assertNotSame($child, $clone['child']);
$this->assertNotSame($this->form['child'], $clone['child']);
}
public function testNotEmptyIfChildNotEmpty()
{
$child = $this->getMockForm();
$child->expects($this->once())
->method('isEmpty')
->will($this->returnValue(false));
$this->form->setData(null);
$this->form->add($child);
$this->assertFalse($this->form->isEmpty());
}
public function testAdd()
{
$child = $this->getBuilder('foo')->getForm();
$this->form->add($child);
$this->assertTrue($this->form->has('foo'));
$this->assertSame($this->form, $child->getParent());
$this->assertSame(array('foo' => $child), $this->form->all());
}
public function testAddUsingNameAndType()
{
$child = $this->getBuilder('foo')->getForm();
$this->factory->expects($this->once())
->method('createNamed')
->with('foo', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, array(
'bar' => 'baz',
'auto_initialize' => false,
))
->will($this->returnValue($child));
$this->form->add('foo', 'Symfony\Component\Form\Extension\Core\Type\TextType', array('bar' => 'baz'));
$this->assertTrue($this->form->has('foo'));
$this->assertSame($this->form, $child->getParent());
$this->assertSame(array('foo' => $child), $this->form->all());
}
public function testAddUsingIntegerNameAndType()
{
$child = $this->getBuilder(0)->getForm();
$this->factory->expects($this->once())
->method('createNamed')
->with('0', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, array(
'bar' => 'baz',
'auto_initialize' => false,
))
->will($this->returnValue($child));
// in order to make casting unnecessary
$this->form->add(0, 'Symfony\Component\Form\Extension\Core\Type\TextType', array('bar' => 'baz'));
$this->assertTrue($this->form->has(0));
$this->assertSame($this->form, $child->getParent());
$this->assertSame(array(0 => $child), $this->form->all());
}
public function testAddWithoutType()
{
$child = $this->getBuilder('foo')->getForm();
$this->factory->expects($this->once())
->method('createNamed')
->with('foo', 'Symfony\Component\Form\Extension\Core\Type\TextType')
->will($this->returnValue($child));
$this->form->add('foo');
$this->assertTrue($this->form->has('foo'));
$this->assertSame($this->form, $child->getParent());
$this->assertSame(array('foo' => $child), $this->form->all());
}
public function testAddUsingNameButNoType()
{
$this->form = $this->getBuilder('name', null, '\stdClass')
->setCompound(true)
->setDataMapper($this->getDataMapper())
->getForm();
$child = $this->getBuilder('foo')->getForm();
$this->factory->expects($this->once())
->method('createForProperty')
->with('\stdClass', 'foo')
->will($this->returnValue($child));
$this->form->add('foo');
$this->assertTrue($this->form->has('foo'));
$this->assertSame($this->form, $child->getParent());
$this->assertSame(array('foo' => $child), $this->form->all());
}
public function testAddUsingNameButNoTypeAndOptions()
{
$this->form = $this->getBuilder('name', null, '\stdClass')
->setCompound(true)
->setDataMapper($this->getDataMapper())
->getForm();
$child = $this->getBuilder('foo')->getForm();
$this->factory->expects($this->once())
->method('createForProperty')
->with('\stdClass', 'foo', null, array(
'bar' => 'baz',
'auto_initialize' => false,
))
->will($this->returnValue($child));
$this->form->add('foo', null, array('bar' => 'baz'));
$this->assertTrue($this->form->has('foo'));
$this->assertSame($this->form, $child->getParent());
$this->assertSame(array('foo' => $child), $this->form->all());
}
/**
* @expectedException \Symfony\Component\Form\Exception\AlreadySubmittedException
*/
public function testAddThrowsExceptionIfAlreadySubmitted()
{
$this->form->submit(array());
$this->form->add($this->getBuilder('foo')->getForm());
}
public function testRemove()
{
$child = $this->getBuilder('foo')->getForm();
$this->form->add($child);
$this->form->remove('foo');
$this->assertNull($child->getParent());
$this->assertCount(0, $this->form);
}
/**
* @expectedException \Symfony\Component\Form\Exception\AlreadySubmittedException
*/
public function testRemoveThrowsExceptionIfAlreadySubmitted()
{
$this->form->add($this->getBuilder('foo')->setCompound(false)->getForm());
$this->form->submit(array('foo' => 'bar'));
$this->form->remove('foo');
}
public function testRemoveIgnoresUnknownName()
{
$this->form->remove('notexisting');
2017-03-18 09:10:35 +00:00
$this->assertCount(0, $this->form);
}
public function testArrayAccess()
{
$child = $this->getBuilder('foo')->getForm();
$this->form[] = $child;
$this->assertTrue(isset($this->form['foo']));
$this->assertSame($child, $this->form['foo']);
unset($this->form['foo']);
$this->assertFalse(isset($this->form['foo']));
}
public function testCountable()
{
$this->form->add($this->getBuilder('foo')->getForm());
$this->form->add($this->getBuilder('bar')->getForm());
$this->assertCount(2, $this->form);
}
public function testIterator()
{
$this->form->add($this->getBuilder('foo')->getForm());
$this->form->add($this->getBuilder('bar')->getForm());
$this->assertSame($this->form->all(), iterator_to_array($this->form));
}
public function testAddMapsViewDataToFormIfInitialized()
{
$mapper = $this->getDataMapper();
$form = $this->getBuilder()
->setCompound(true)
->setDataMapper($mapper)
->addViewTransformer(new FixedDataTransformer(array(
'' => '',
'foo' => 'bar',
)))
->setData('foo')
->getForm();
$child = $this->getBuilder()->getForm();
$mapper->expects($this->once())
->method('mapDataToForms')
->with('bar', $this->isInstanceOf('\RecursiveIteratorIterator'))
2014-12-03 22:04:33 +00:00
->will($this->returnCallback(function ($data, \RecursiveIteratorIterator $iterator) use ($child) {
$this->assertInstanceOf('Symfony\Component\Form\Util\InheritDataAwareIterator', $iterator->getInnerIterator());
Merge branch '2.8' * 2.8: (65 commits) [VarDumper] Fix tests for HHVM Update DateTimeToArrayTransformer.php Mock microtime() and time() in transient tests Azerbaijani language pluralization rule Move HHVM tests out of the allowed failures Fix merge [2.6] Towards 100% HHVM compat [Security/Http] Fix test [Stopwatch] Fix test Minor fixes [Validator] Added missing error codes and turned codes into UUIDs Towards 100% HHVM compat Warmup twig templates in non-standard paths (closes #12507) [Bridge/PhpUnit] Enforce a consistent locale Fix param order of assertEquals (expected, actual) in test for Finder\Glob Fix choice translation domain for expanded choice widget unify default AccessDeniedExeption message trigger event with right user (add test) [Security] Initialize SwitchUserEvent::targetUser on attemptExitUser fixed CS ... Conflicts: UPGRADE-2.8.md src/Symfony/Bridge/ProxyManager/composer.json src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/JsonDescriptor.php src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/MarkdownDescriptor.php src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/TextDescriptor.php src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/XmlDescriptor.php src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php src/Symfony/Bundle/FrameworkBundle/Resources/config/old_assets.xml src/Symfony/Bundle/FrameworkBundle/Resources/config/test.xml src/Symfony/Bundle/FrameworkBundle/Resources/config/validator.xml src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_1_public.json src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_1_public.md src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_1_public.xml src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_1_services.json src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_1_services.md src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_1_services.xml src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_1_tag1.json src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_1_tag1.md src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_1_tag1.xml src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_1_tags.json src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_1_tags.md src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_1_tags.xml src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_1.json src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_1.md src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_1.txt src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_1.xml src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_2.json src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_2.md src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_2.txt src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/definition_2.xml src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/legacy_synchronized_service_definition_1.json src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/legacy_synchronized_service_definition_1.md src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/legacy_synchronized_service_definition_1.txt src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/legacy_synchronized_service_definition_1.xml src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/legacy_synchronized_service_definition_2.json src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/legacy_synchronized_service_definition_2.md src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/legacy_synchronized_service_definition_2.txt src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/legacy_synchronized_service_definition_2.xml src/Symfony/Bundle/SecurityBundle/Tests/Functional/Bundle/CsrfFormLoginBundle/Form/UserLoginFormType.php src/Symfony/Bundle/SecurityBundle/Tests/Functional/app/CsrfFormLogin/config.yml src/Symfony/Bundle/SecurityBundle/composer.json src/Symfony/Component/Debug/ErrorHandler.php src/Symfony/Component/DependencyInjection/Compiler/CheckDefinitionValidityPass.php src/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php src/Symfony/Component/DependencyInjection/Definition.php src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php src/Symfony/Component/DependencyInjection/Tests/ContainerTest.php src/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/legacy-container9.php src/Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/legacy-services9.dot src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/legacy-services6.xml src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/legacy-services9.xml src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/legacy-services6.yml src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/legacy-services9.yml src/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php src/Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php src/Symfony/Component/Form/ResolvedFormType.php src/Symfony/Component/Form/Tests/CompoundFormTest.php src/Symfony/Component/Process/Tests/AbstractProcessTest.php src/Symfony/Component/VarDumper/Tests/CliDumperTest.php src/Symfony/Component/VarDumper/Tests/HtmlDumperTest.php
2015-07-01 21:40:29 +01:00
$this->assertSame(array($child->getName() => $child), iterator_to_array($iterator));
}));
$form->initialize();
$form->add($child);
}
public function testAddDoesNotMapViewDataToFormIfNotInitialized()
{
$mapper = $this->getDataMapper();
$form = $this->getBuilder()
->setCompound(true)
->setDataMapper($mapper)
->getForm();
$child = $this->getBuilder()->getForm();
$mapper->expects($this->never())
->method('mapDataToForms');
$form->add($child);
}
public function testAddDoesNotMapViewDataToFormIfInheritData()
{
$mapper = $this->getDataMapper();
$form = $this->getBuilder()
->setCompound(true)
->setDataMapper($mapper)
->setInheritData(true)
->getForm();
$child = $this->getBuilder()->getForm();
$mapper->expects($this->never())
->method('mapDataToForms');
$form->initialize();
$form->add($child);
}
public function testSetDataSupportsDynamicAdditionAndRemovalOfChildren()
{
$form = $this->getBuilder()
->setCompound(true)
// We test using PropertyPathMapper on purpose. The traversal logic
// is currently contained in InheritDataAwareIterator, but even
// if that changes, this test should still function.
->setDataMapper(new PropertyPathMapper())
->getForm();
$child = $this->getMockForm('child');
$childToBeRemoved = $this->getMockForm('removed');
$childToBeAdded = $this->getMockForm('added');
$form->add($child);
$form->add($childToBeRemoved);
$child->expects($this->once())
->method('setData')
->will($this->returnCallback(function () use ($form, $childToBeAdded) {
$form->remove('removed');
$form->add($childToBeAdded);
}));
$childToBeRemoved->expects($this->never())
->method('setData');
// once when it it is created, once when it is added
$childToBeAdded->expects($this->exactly(2))
->method('setData');
// pass NULL to all children
$form->setData(array());
}
public function testSetDataMapsViewDataToChildren()
{
$mapper = $this->getDataMapper();
$form = $this->getBuilder()
->setCompound(true)
->setDataMapper($mapper)
->addViewTransformer(new FixedDataTransformer(array(
'' => '',
'foo' => 'bar',
)))
->getForm();
$form->add($child1 = $this->getBuilder('firstName')->getForm());
$form->add($child2 = $this->getBuilder('lastName')->getForm());
$mapper->expects($this->once())
->method('mapDataToForms')
->with('bar', $this->isInstanceOf('\RecursiveIteratorIterator'))
2014-12-03 22:04:33 +00:00
->will($this->returnCallback(function ($data, \RecursiveIteratorIterator $iterator) use ($child1, $child2) {
$this->assertInstanceOf('Symfony\Component\Form\Util\InheritDataAwareIterator', $iterator->getInnerIterator());
$this->assertSame(array('firstName' => $child1, 'lastName' => $child2), iterator_to_array($iterator));
}));
$form->setData('foo');
}
public function testSubmitSupportsDynamicAdditionAndRemovalOfChildren()
{
$child = $this->getMockForm('child');
$childToBeRemoved = $this->getMockForm('removed');
$childToBeAdded = $this->getMockForm('added');
$this->form->add($child);
$this->form->add($childToBeRemoved);
$form = $this->form;
$child->expects($this->once())
->method('submit')
->will($this->returnCallback(function () use ($form, $childToBeAdded) {
$form->remove('removed');
$form->add($childToBeAdded);
}));
$childToBeRemoved->expects($this->never())
->method('submit');
$childToBeAdded->expects($this->once())
->method('submit');
// pass NULL to all children
$this->form->submit(array());
}
public function testSubmitMapsSubmittedChildrenOntoExistingViewData()
{
$mapper = $this->getDataMapper();
$form = $this->getBuilder()
->setCompound(true)
->setDataMapper($mapper)
->addViewTransformer(new FixedDataTransformer(array(
'' => '',
'foo' => 'bar',
)))
->setData('foo')
->getForm();
$form->add($child1 = $this->getBuilder('firstName')->setCompound(false)->getForm());
$form->add($child2 = $this->getBuilder('lastName')->setCompound(false)->getForm());
$mapper->expects($this->once())
->method('mapFormsToData')
->with($this->isInstanceOf('\RecursiveIteratorIterator'), 'bar')
2014-12-03 22:04:33 +00:00
->will($this->returnCallback(function (\RecursiveIteratorIterator $iterator) use ($child1, $child2) {
$this->assertInstanceOf('Symfony\Component\Form\Util\InheritDataAwareIterator', $iterator->getInnerIterator());
$this->assertSame(array('firstName' => $child1, 'lastName' => $child2), iterator_to_array($iterator));
$this->assertEquals('Bernhard', $child1->getData());
$this->assertEquals('Schussek', $child2->getData());
}));
$form->submit(array(
'firstName' => 'Bernhard',
'lastName' => 'Schussek',
));
}
public function testMapFormsToDataIsNotInvokedIfInheritData()
{
$mapper = $this->getDataMapper();
$form = $this->getBuilder()
->setCompound(true)
->setDataMapper($mapper)
->setInheritData(true)
->addViewTransformer(new FixedDataTransformer(array(
'' => '',
'foo' => 'bar',
)))
->getForm();
$form->add($child1 = $this->getBuilder('firstName')->setCompound(false)->getForm());
$form->add($child2 = $this->getBuilder('lastName')->setCompound(false)->getForm());
$mapper->expects($this->never())
->method('mapFormsToData');
$form->submit(array(
'firstName' => 'Bernhard',
'lastName' => 'Schussek',
));
}
/*
* https://github.com/symfony/symfony/issues/4480
*/
public function testSubmitRestoresViewDataIfCompoundAndEmpty()
{
$mapper = $this->getDataMapper();
$object = new \stdClass();
$form = $this->getBuilder('name', null, 'stdClass')
->setCompound(true)
->setDataMapper($mapper)
->setData($object)
->getForm();
$form->submit(array());
$this->assertSame($object, $form->getData());
}
public function testSubmitMapsSubmittedChildrenOntoEmptyData()
{
$mapper = $this->getDataMapper();
$object = new \stdClass();
$form = $this->getBuilder()
->setCompound(true)
->setDataMapper($mapper)
->setEmptyData($object)
->setData(null)
->getForm();
$form->add($child = $this->getBuilder('name')->setCompound(false)->getForm());
$mapper->expects($this->once())
->method('mapFormsToData')
->with($this->isInstanceOf('\RecursiveIteratorIterator'), $object)
2014-12-03 22:04:33 +00:00
->will($this->returnCallback(function (\RecursiveIteratorIterator $iterator) use ($child) {
$this->assertInstanceOf('Symfony\Component\Form\Util\InheritDataAwareIterator', $iterator->getInnerIterator());
$this->assertSame(array('name' => $child), iterator_to_array($iterator));
}));
$form->submit(array(
'name' => 'Bernhard',
));
}
public function requestMethodProvider()
{
return array(
array('POST'),
array('PUT'),
array('DELETE'),
array('PATCH'),
);
}
/**
* @dataProvider requestMethodProvider
*/
public function testSubmitPostOrPutRequest($method)
{
$path = tempnam(sys_get_temp_dir(), 'sf2');
touch($path);
$values = array(
'author' => array(
'name' => 'Bernhard',
'image' => array('filename' => 'foobar.png'),
),
);
$files = array(
'author' => array(
'error' => array('image' => UPLOAD_ERR_OK),
'name' => array('image' => 'upload.png'),
'size' => array('image' => 123),
'tmp_name' => array('image' => $path),
'type' => array('image' => 'image/png'),
),
);
$request = new Request(array(), $values, array(), array(), $files, array(
'REQUEST_METHOD' => $method,
));
$form = $this->getBuilder('author')
2012-12-30 15:38:36 +00:00
->setMethod($method)
->setCompound(true)
->setDataMapper($this->getDataMapper())
->setRequestHandler(new HttpFoundationRequestHandler())
->getForm();
$form->add($this->getBuilder('name')->getForm());
$form->add($this->getBuilder('image')->getForm());
$form->handleRequest($request);
$file = new UploadedFile($path, 'upload.png', 'image/png', 123, UPLOAD_ERR_OK);
$this->assertEquals('Bernhard', $form['name']->getData());
$this->assertEquals($file, $form['image']->getData());
unlink($path);
}
/**
* @dataProvider requestMethodProvider
*/
public function testSubmitPostOrPutRequestWithEmptyRootFormName($method)
{
$path = tempnam(sys_get_temp_dir(), 'sf2');
touch($path);
$values = array(
'name' => 'Bernhard',
'extra' => 'data',
);
$files = array(
'image' => array(
'error' => UPLOAD_ERR_OK,
'name' => 'upload.png',
'size' => 123,
'tmp_name' => $path,
'type' => 'image/png',
),
);
$request = new Request(array(), $values, array(), array(), $files, array(
'REQUEST_METHOD' => $method,
));
$form = $this->getBuilder('')
2012-12-30 15:38:36 +00:00
->setMethod($method)
->setCompound(true)
->setDataMapper($this->getDataMapper())
->setRequestHandler(new HttpFoundationRequestHandler())
->getForm();
$form->add($this->getBuilder('name')->getForm());
$form->add($this->getBuilder('image')->getForm());
$form->handleRequest($request);
$file = new UploadedFile($path, 'upload.png', 'image/png', 123, UPLOAD_ERR_OK);
$this->assertEquals('Bernhard', $form['name']->getData());
$this->assertEquals($file, $form['image']->getData());
$this->assertEquals(array('extra' => 'data'), $form->getExtraData());
unlink($path);
}
/**
* @dataProvider requestMethodProvider
*/
public function testSubmitPostOrPutRequestWithSingleChildForm($method)
{
$path = tempnam(sys_get_temp_dir(), 'sf2');
touch($path);
$files = array(
'image' => array(
'error' => UPLOAD_ERR_OK,
'name' => 'upload.png',
'size' => 123,
'tmp_name' => $path,
'type' => 'image/png',
),
);
$request = new Request(array(), array(), array(), array(), $files, array(
'REQUEST_METHOD' => $method,
));
$form = $this->getBuilder('image')
2012-12-30 15:38:36 +00:00
->setMethod($method)
->setRequestHandler(new HttpFoundationRequestHandler())
->getForm();
$form->handleRequest($request);
$file = new UploadedFile($path, 'upload.png', 'image/png', 123, UPLOAD_ERR_OK);
$this->assertEquals($file, $form->getData());
unlink($path);
}
/**
* @dataProvider requestMethodProvider
*/
public function testSubmitPostOrPutRequestWithSingleChildFormUploadedFile($method)
{
$path = tempnam(sys_get_temp_dir(), 'sf2');
touch($path);
$values = array(
'name' => 'Bernhard',
);
$request = new Request(array(), $values, array(), array(), array(), array(
'REQUEST_METHOD' => $method,
));
$form = $this->getBuilder('name')
2012-12-30 15:38:36 +00:00
->setMethod($method)
->setRequestHandler(new HttpFoundationRequestHandler())
->getForm();
$form->handleRequest($request);
$this->assertEquals('Bernhard', $form->getData());
unlink($path);
}
public function testSubmitGetRequest()
{
$values = array(
'author' => array(
'firstName' => 'Bernhard',
'lastName' => 'Schussek',
),
);
$request = new Request($values, array(), array(), array(), array(), array(
'REQUEST_METHOD' => 'GET',
));
$form = $this->getBuilder('author')
2012-12-30 15:38:36 +00:00
->setMethod('GET')
->setCompound(true)
->setDataMapper($this->getDataMapper())
->setRequestHandler(new HttpFoundationRequestHandler())
->getForm();
$form->add($this->getBuilder('firstName')->getForm());
$form->add($this->getBuilder('lastName')->getForm());
$form->handleRequest($request);
$this->assertEquals('Bernhard', $form['firstName']->getData());
$this->assertEquals('Schussek', $form['lastName']->getData());
}
public function testSubmitGetRequestWithEmptyRootFormName()
{
$values = array(
'firstName' => 'Bernhard',
'lastName' => 'Schussek',
2014-09-21 19:53:12 +01:00
'extra' => 'data',
);
$request = new Request($values, array(), array(), array(), array(), array(
'REQUEST_METHOD' => 'GET',
));
$form = $this->getBuilder('')
2012-12-30 15:38:36 +00:00
->setMethod('GET')
->setCompound(true)
->setDataMapper($this->getDataMapper())
->setRequestHandler(new HttpFoundationRequestHandler())
->getForm();
$form->add($this->getBuilder('firstName')->getForm());
$form->add($this->getBuilder('lastName')->getForm());
$form->handleRequest($request);
$this->assertEquals('Bernhard', $form['firstName']->getData());
$this->assertEquals('Schussek', $form['lastName']->getData());
$this->assertEquals(array('extra' => 'data'), $form->getExtraData());
}
public function testGetErrors()
{
$this->form->addError($error1 = new FormError('Error 1'));
$this->form->addError($error2 = new FormError('Error 2'));
$errors = $this->form->getErrors();
$this->assertSame(
"ERROR: Error 1\n".
"ERROR: Error 2\n",
(string) $errors
);
$this->assertSame(array($error1, $error2), iterator_to_array($errors));
}
public function testGetErrorsDeep()
{
$this->form->addError($error1 = new FormError('Error 1'));
$this->form->addError($error2 = new FormError('Error 2'));
$childForm = $this->getBuilder('Child')->getForm();
$childForm->addError($nestedError = new FormError('Nested Error'));
$this->form->add($childForm);
$errors = $this->form->getErrors(true);
$this->assertSame(
"ERROR: Error 1\n".
"ERROR: Error 2\n".
"ERROR: Nested Error\n",
(string) $errors
);
$this->assertSame(
array($error1, $error2, $nestedError),
iterator_to_array($errors)
);
}
public function testGetErrorsDeepRecursive()
{
$this->form->addError($error1 = new FormError('Error 1'));
$this->form->addError($error2 = new FormError('Error 2'));
$childForm = $this->getBuilder('Child')->getForm();
$childForm->addError($nestedError = new FormError('Nested Error'));
$this->form->add($childForm);
$errors = $this->form->getErrors(true, false);
$this->assertSame(
"ERROR: Error 1\n".
"ERROR: Error 2\n".
"Child:\n".
" ERROR: Nested Error\n",
(string) $errors
);
$errorsAsArray = iterator_to_array($errors);
$this->assertSame($error1, $errorsAsArray[0]);
$this->assertSame($error2, $errorsAsArray[1]);
$this->assertInstanceOf('Symfony\Component\Form\FormErrorIterator', $errorsAsArray[2]);
$nestedErrorsAsArray = iterator_to_array($errorsAsArray[2]);
$this->assertCount(1, $nestedErrorsAsArray);
$this->assertSame($nestedError, $nestedErrorsAsArray[0]);
}
// Basic cases are covered in SimpleFormTest
public function testCreateViewWithChildren()
{
2016-12-19 09:02:29 +00:00
$type = $this->getMockBuilder('Symfony\Component\Form\ResolvedFormTypeInterface')->getMock();
$options = array('a' => 'Foo', 'b' => 'Bar');
$field1 = $this->getMockForm('foo');
$field2 = $this->getMockForm('bar');
$view = new FormView();
$field1View = new FormView();
$field2View = new FormView();
$this->form = $this->getBuilder('form', null, null, $options)
->setCompound(true)
->setDataMapper($this->getDataMapper())
->setType($type)
->getForm();
$this->form->add($field1);
$this->form->add($field2);
2014-12-03 22:04:33 +00:00
$assertChildViewsEqual = function (array $childViews) {
return function (FormView $view) use ($childViews) {
$this->assertSame($childViews, $view->children);
};
};
// First create the view
$type->expects($this->once())
->method('createView')
->will($this->returnValue($view));
// Then build it for the form itself
$type->expects($this->once())
->method('buildView')
->with($view, $this->form, $options)
->will($this->returnCallback($assertChildViewsEqual(array())));
// Then add the first child form
$field1->expects($this->once())
->method('createView')
->will($this->returnValue($field1View));
// Then the second child form
$field2->expects($this->once())
->method('createView')
->will($this->returnValue($field2View));
// Again build the view for the form itself. This time the child views
// exist.
$type->expects($this->once())
->method('finishView')
->with($view, $this->form, $options)
->will($this->returnCallback($assertChildViewsEqual(array('foo' => $field1View, 'bar' => $field2View))));
$this->assertSame($view, $this->form->createView());
}
public function testNoClickedButtonBeforeSubmission()
{
$this->assertNull($this->form->getClickedButton());
}
public function testNoClickedButton()
{
$button = $this->getMockBuilder('Symfony\Component\Form\SubmitButton')
->setConstructorArgs(array(new SubmitButtonBuilder('submit')))
->setMethods(array('isClicked'))
->getMock();
$button->expects($this->any())
->method('isClicked')
->will($this->returnValue(false));
$parentForm = $this->getBuilder('parent')->getForm();
$nestedForm = $this->getBuilder('nested')->getForm();
$this->form->setParent($parentForm);
$this->form->add($button);
$this->form->add($nestedForm);
$this->form->submit(array());
$this->assertNull($this->form->getClickedButton());
}
public function testClickedButton()
{
$button = $this->getMockBuilder('Symfony\Component\Form\SubmitButton')
->setConstructorArgs(array(new SubmitButtonBuilder('submit')))
->setMethods(array('isClicked'))
->getMock();
$button->expects($this->any())
->method('isClicked')
->will($this->returnValue(true));
$this->form->add($button);
$this->form->submit(array());
$this->assertSame($button, $this->form->getClickedButton());
}
public function testClickedButtonFromNestedForm()
{
$button = $this->getBuilder('submit')->getForm();
$nestedForm = $this->getMockBuilder('Symfony\Component\Form\Form')
->setConstructorArgs(array($this->getBuilder('nested')))
->setMethods(array('getClickedButton'))
->getMock();
$nestedForm->expects($this->any())
->method('getClickedButton')
->will($this->returnValue($button));
$this->form->add($nestedForm);
$this->form->submit(array());
$this->assertSame($button, $this->form->getClickedButton());
}
public function testClickedButtonFromParentForm()
{
$button = $this->getBuilder('submit')->getForm();
$parentForm = $this->getMockBuilder('Symfony\Component\Form\Form')
->setConstructorArgs(array($this->getBuilder('parent')))
->setMethods(array('getClickedButton'))
->getMock();
$parentForm->expects($this->any())
->method('getClickedButton')
->will($this->returnValue($button));
$this->form->setParent($parentForm);
$this->form->submit(array());
$this->assertSame($button, $this->form->getClickedButton());
}
protected function createForm()
{
return $this->getBuilder()
->setCompound(true)
->setDataMapper($this->getDataMapper())
->getForm();
}
}