4 * This file is part of the Symfony package.
6 * (c) Fabien Potencier <fabien@symfony.com>
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
12 namespace Symfony\Component\Form\Tests\Extension\Core\EventListener
;
14 use Symfony\Component\Form\Extension\Core\EventListener\ResizeFormListener
;
15 use Symfony\Component\Form\FormBuilder
;
16 use Symfony\Component\Form\FormEvent
;
18 class ResizeFormListenerTest
extends \PHPUnit_Framework_TestCase
24 protected function setUp()
26 if (!class_exists('Symfony\Component\EventDispatcher\EventDispatcher')) {
27 $this->markTestSkipped('The "EventDispatcher" component is not available');
30 $this->dispatcher
= $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
31 $this->factory
= $this->getMock('Symfony\Component\Form\FormFactoryInterface');
32 $this->form
= $this->getBuilder()
34 ->setDataMapper($this->getDataMapper())
38 protected function tearDown()
40 $this->dispatcher
= null;
41 $this->factory
= null;
45 protected function getBuilder($name = 'name')
47 return new FormBuilder($name, null, $this->dispatcher
, $this->factory
);
50 protected function getForm($name = 'name')
52 return $this->getBuilder($name)->getForm();
56 * @return \PHPUnit_Framework_MockObject_MockObject
58 private function getDataMapper()
60 return $this->getMock('Symfony\Component\Form\DataMapperInterface');
63 protected function getMockForm()
65 return $this->getMock('Symfony\Component\Form\Test\FormInterface');
68 public function testPreSetDataResizesForm()
70 $this->form
->add($this->getForm('0'));
71 $this->form
->add($this->getForm('1'));
73 $this->factory
->expects($this->at(0))
74 ->method('createNamed')
75 ->with(1, 'text', null, array('property_path' => '[1]', 'max_length' => 10, 'auto_initialize' => false))
76 ->will($this->returnValue($this->getForm('1')));
77 $this->factory
->expects($this->at(1))
78 ->method('createNamed')
79 ->with(2, 'text', null, array('property_path' => '[2]', 'max_length' => 10, 'auto_initialize' => false))
80 ->will($this->returnValue($this->getForm('2')));
82 $data = array(1 => 'string', 2 => 'string');
83 $event = new FormEvent($this->form
, $data);
84 $listener = new ResizeFormListener('text', array('max_length' => '10'), false, false);
85 $listener->preSetData($event);
87 $this->assertFalse($this->form
->has('0'));
88 $this->assertTrue($this->form
->has('1'));
89 $this->assertTrue($this->form
->has('2'));
93 * @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
95 public function testPreSetDataRequiresArrayOrTraversable()
97 $data = 'no array or traversable';
98 $event = new FormEvent($this->form
, $data);
99 $listener = new ResizeFormListener('text', array(), false, false);
100 $listener->preSetData($event);
103 public function testPreSetDataDealsWithNullData()
105 $this->factory
->expects($this->never())->method('createNamed');
108 $event = new FormEvent($this->form
, $data);
109 $listener = new ResizeFormListener('text', array(), false, false);
110 $listener->preSetData($event);
113 public function testPreSubmitResizesUpIfAllowAdd()
115 $this->form
->add($this->getForm('0'));
117 $this->factory
->expects($this->once())
118 ->method('createNamed')
119 ->with(1, 'text', null, array('property_path' => '[1]', 'max_length' => 10, 'auto_initialize' => false))
120 ->will($this->returnValue($this->getForm('1')));
122 $data = array(0 => 'string', 1 => 'string');
123 $event = new FormEvent($this->form
, $data);
124 $listener = new ResizeFormListener('text', array('max_length' => 10), true, false);
125 $listener->preSubmit($event);
127 $this->assertTrue($this->form
->has('0'));
128 $this->assertTrue($this->form
->has('1'));
131 public function testPreSubmitResizesDownIfAllowDelete()
133 $this->form
->add($this->getForm('0'));
134 $this->form
->add($this->getForm('1'));
136 $data = array(0 => 'string');
137 $event = new FormEvent($this->form
, $data);
138 $listener = new ResizeFormListener('text', array(), false, true);
139 $listener->preSubmit($event);
141 $this->assertTrue($this->form
->has('0'));
142 $this->assertFalse($this->form
->has('1'));
145 // fix for https://github.com/symfony/symfony/pull/493
146 public function testPreSubmitRemovesZeroKeys()
148 $this->form
->add($this->getForm('0'));
151 $event = new FormEvent($this->form
, $data);
152 $listener = new ResizeFormListener('text', array(), false, true);
153 $listener->preSubmit($event);
155 $this->assertFalse($this->form
->has('0'));
158 public function testPreSubmitDoesNothingIfNotAllowAddNorAllowDelete()
160 $this->form
->add($this->getForm('0'));
161 $this->form
->add($this->getForm('1'));
163 $data = array(0 => 'string', 2 => 'string');
164 $event = new FormEvent($this->form
, $data);
165 $listener = new ResizeFormListener('text', array(), false, false);
166 $listener->preSubmit($event);
168 $this->assertTrue($this->form
->has('0'));
169 $this->assertTrue($this->form
->has('1'));
170 $this->assertFalse($this->form
->has('2'));
174 * @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
176 public function testPreSubmitRequiresArrayOrTraversable()
178 $data = 'no array or traversable';
179 $event = new FormEvent($this->form
, $data);
180 $listener = new ResizeFormListener('text', array(), false, false);
181 $listener->preSubmit($event);
184 public function testPreSubmitDealsWithNullData()
186 $this->form
->add($this->getForm('1'));
189 $event = new FormEvent($this->form
, $data);
190 $listener = new ResizeFormListener('text', array(), false, true);
191 $listener->preSubmit($event);
193 $this->assertFalse($this->form
->has('1'));
196 // fixes https://github.com/symfony/symfony/pull/40
197 public function testPreSubmitDealsWithEmptyData()
199 $this->form
->add($this->getForm('1'));
202 $event = new FormEvent($this->form
, $data);
203 $listener = new ResizeFormListener('text', array(), false, true);
204 $listener->preSubmit($event);
206 $this->assertFalse($this->form
->has('1'));
209 public function testOnSubmitNormDataRemovesEntriesMissingInTheFormIfAllowDelete()
211 $this->form
->add($this->getForm('1'));
213 $data = array(0 => 'first', 1 => 'second', 2 => 'third');
214 $event = new FormEvent($this->form
, $data);
215 $listener = new ResizeFormListener('text', array(), false, true);
216 $listener->onSubmit($event);
218 $this->assertEquals(array(1 => 'second'), $event->getData());
221 public function testOnSubmitNormDataDoesNothingIfNotAllowDelete()
223 $this->form
->add($this->getForm('1'));
225 $data = array(0 => 'first', 1 => 'second', 2 => 'third');
226 $event = new FormEvent($this->form
, $data);
227 $listener = new ResizeFormListener('text', array(), false, false);
228 $listener->onSubmit($event);
230 $this->assertEquals($data, $event->getData());
234 * @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
236 public function testOnSubmitNormDataRequiresArrayOrTraversable()
238 $data = 'no array or traversable';
239 $event = new FormEvent($this->form
, $data);
240 $listener = new ResizeFormListener('text', array(), false, false);
241 $listener->onSubmit($event);
244 public function testOnSubmitNormDataDealsWithNullData()
246 $this->form
->add($this->getForm('1'));
249 $event = new FormEvent($this->form
, $data);
250 $listener = new ResizeFormListener('text', array(), false, true);
251 $listener->onSubmit($event);
253 $this->assertEquals(array(), $event->getData());