/vendor/symfony/symfony/src/Symfony/Component/Form/Tests/Extension/Core/EventListener/ResizeFormListenerTest.php

https://github.com/nattaphat/hgis · PHP · 255 lines · 185 code · 48 blank · 22 comment · 1 complexity · dd10463600f2af86c1085d283cd84195 MD5 · raw file

  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Component\Form\Tests\Extension\Core\EventListener;
  11. use Symfony\Component\Form\Extension\Core\EventListener\ResizeFormListener;
  12. use Symfony\Component\Form\FormBuilder;
  13. use Symfony\Component\Form\FormEvent;
  14. class ResizeFormListenerTest extends \PHPUnit_Framework_TestCase
  15. {
  16. private $dispatcher;
  17. private $factory;
  18. private $form;
  19. protected function setUp()
  20. {
  21. if (!class_exists('Symfony\Component\EventDispatcher\EventDispatcher')) {
  22. $this->markTestSkipped('The "EventDispatcher" component is not available');
  23. }
  24. $this->dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
  25. $this->factory = $this->getMock('Symfony\Component\Form\FormFactoryInterface');
  26. $this->form = $this->getBuilder()
  27. ->setCompound(true)
  28. ->setDataMapper($this->getDataMapper())
  29. ->getForm();
  30. }
  31. protected function tearDown()
  32. {
  33. $this->dispatcher = null;
  34. $this->factory = null;
  35. $this->form = null;
  36. }
  37. protected function getBuilder($name = 'name')
  38. {
  39. return new FormBuilder($name, null, $this->dispatcher, $this->factory);
  40. }
  41. protected function getForm($name = 'name')
  42. {
  43. return $this->getBuilder($name)->getForm();
  44. }
  45. /**
  46. * @return \PHPUnit_Framework_MockObject_MockObject
  47. */
  48. private function getDataMapper()
  49. {
  50. return $this->getMock('Symfony\Component\Form\DataMapperInterface');
  51. }
  52. protected function getMockForm()
  53. {
  54. return $this->getMock('Symfony\Component\Form\Test\FormInterface');
  55. }
  56. public function testPreSetDataResizesForm()
  57. {
  58. $this->form->add($this->getForm('0'));
  59. $this->form->add($this->getForm('1'));
  60. $this->factory->expects($this->at(0))
  61. ->method('createNamed')
  62. ->with(1, 'text', null, array('property_path' => '[1]', 'max_length' => 10))
  63. ->will($this->returnValue($this->getForm('1')));
  64. $this->factory->expects($this->at(1))
  65. ->method('createNamed')
  66. ->with(2, 'text', null, array('property_path' => '[2]', 'max_length' => 10))
  67. ->will($this->returnValue($this->getForm('2')));
  68. $data = array(1 => 'string', 2 => 'string');
  69. $event = new FormEvent($this->form, $data);
  70. $listener = new ResizeFormListener('text', array('max_length' => '10'), false, false);
  71. $listener->preSetData($event);
  72. $this->assertFalse($this->form->has('0'));
  73. $this->assertTrue($this->form->has('1'));
  74. $this->assertTrue($this->form->has('2'));
  75. }
  76. /**
  77. * @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
  78. */
  79. public function testPreSetDataRequiresArrayOrTraversable()
  80. {
  81. $data = 'no array or traversable';
  82. $event = new FormEvent($this->form, $data);
  83. $listener = new ResizeFormListener('text', array(), false, false);
  84. $listener->preSetData($event);
  85. }
  86. public function testPreSetDataDealsWithNullData()
  87. {
  88. $this->factory->expects($this->never())->method('createNamed');
  89. $data = null;
  90. $event = new FormEvent($this->form, $data);
  91. $listener = new ResizeFormListener('text', array(), false, false);
  92. $listener->preSetData($event);
  93. }
  94. public function testPreBindResizesUpIfAllowAdd()
  95. {
  96. $this->form->add($this->getForm('0'));
  97. $this->factory->expects($this->once())
  98. ->method('createNamed')
  99. ->with(1, 'text', null, array('property_path' => '[1]', 'max_length' => 10))
  100. ->will($this->returnValue($this->getForm('1')));
  101. $data = array(0 => 'string', 1 => 'string');
  102. $event = new FormEvent($this->form, $data);
  103. $listener = new ResizeFormListener('text', array('max_length' => 10), true, false);
  104. $listener->preBind($event);
  105. $this->assertTrue($this->form->has('0'));
  106. $this->assertTrue($this->form->has('1'));
  107. }
  108. public function testPreBindResizesDownIfAllowDelete()
  109. {
  110. $this->form->add($this->getForm('0'));
  111. $this->form->add($this->getForm('1'));
  112. $data = array(0 => 'string');
  113. $event = new FormEvent($this->form, $data);
  114. $listener = new ResizeFormListener('text', array(), false, true);
  115. $listener->preBind($event);
  116. $this->assertTrue($this->form->has('0'));
  117. $this->assertFalse($this->form->has('1'));
  118. }
  119. // fix for https://github.com/symfony/symfony/pull/493
  120. public function testPreBindRemovesZeroKeys()
  121. {
  122. $this->form->add($this->getForm('0'));
  123. $data = array();
  124. $event = new FormEvent($this->form, $data);
  125. $listener = new ResizeFormListener('text', array(), false, true);
  126. $listener->preBind($event);
  127. $this->assertFalse($this->form->has('0'));
  128. }
  129. public function testPreBindDoesNothingIfNotAllowAddNorAllowDelete()
  130. {
  131. $this->form->add($this->getForm('0'));
  132. $this->form->add($this->getForm('1'));
  133. $data = array(0 => 'string', 2 => 'string');
  134. $event = new FormEvent($this->form, $data);
  135. $listener = new ResizeFormListener('text', array(), false, false);
  136. $listener->preBind($event);
  137. $this->assertTrue($this->form->has('0'));
  138. $this->assertTrue($this->form->has('1'));
  139. $this->assertFalse($this->form->has('2'));
  140. }
  141. /**
  142. * @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
  143. */
  144. public function testPreBindRequiresArrayOrTraversable()
  145. {
  146. $data = 'no array or traversable';
  147. $event = new FormEvent($this->form, $data);
  148. $listener = new ResizeFormListener('text', array(), false, false);
  149. $listener->preBind($event);
  150. }
  151. public function testPreBindDealsWithNullData()
  152. {
  153. $this->form->add($this->getForm('1'));
  154. $data = null;
  155. $event = new FormEvent($this->form, $data);
  156. $listener = new ResizeFormListener('text', array(), false, true);
  157. $listener->preBind($event);
  158. $this->assertFalse($this->form->has('1'));
  159. }
  160. // fixes https://github.com/symfony/symfony/pull/40
  161. public function testPreBindDealsWithEmptyData()
  162. {
  163. $this->form->add($this->getForm('1'));
  164. $data = '';
  165. $event = new FormEvent($this->form, $data);
  166. $listener = new ResizeFormListener('text', array(), false, true);
  167. $listener->preBind($event);
  168. $this->assertFalse($this->form->has('1'));
  169. }
  170. public function testOnBindNormDataRemovesEntriesMissingInTheFormIfAllowDelete()
  171. {
  172. $this->form->add($this->getForm('1'));
  173. $data = array(0 => 'first', 1 => 'second', 2 => 'third');
  174. $event = new FormEvent($this->form, $data);
  175. $listener = new ResizeFormListener('text', array(), false, true);
  176. $listener->onBind($event);
  177. $this->assertEquals(array(1 => 'second'), $event->getData());
  178. }
  179. public function testOnBindNormDataDoesNothingIfNotAllowDelete()
  180. {
  181. $this->form->add($this->getForm('1'));
  182. $data = array(0 => 'first', 1 => 'second', 2 => 'third');
  183. $event = new FormEvent($this->form, $data);
  184. $listener = new ResizeFormListener('text', array(), false, false);
  185. $listener->onBind($event);
  186. $this->assertEquals($data, $event->getData());
  187. }
  188. /**
  189. * @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
  190. */
  191. public function testOnBindNormDataRequiresArrayOrTraversable()
  192. {
  193. $data = 'no array or traversable';
  194. $event = new FormEvent($this->form, $data);
  195. $listener = new ResizeFormListener('text', array(), false, false);
  196. $listener->onBind($event);
  197. }
  198. public function testOnBindNormDataDealsWithNullData()
  199. {
  200. $this->form->add($this->getForm('1'));
  201. $data = null;
  202. $event = new FormEvent($this->form, $data);
  203. $listener = new ResizeFormListener('text', array(), false, true);
  204. $listener->onBind($event);
  205. $this->assertEquals(array(), $event->getData());
  206. }
  207. }