DatalistWidgetTest.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. <?php
  2. namespace Tools\Test\TestCase\View\Widget;
  3. use ArrayObject;
  4. use Cake\TestSuite\TestCase;
  5. use Cake\View\StringTemplate;
  6. use Tools\View\Widget\DatalistWidget;
  7. class DatalistWidgetTest extends TestCase {
  8. /**
  9. * @var \Cake\View\Form\ContextInterface
  10. */
  11. protected $context;
  12. /**
  13. * @var \Cake\View\StringTemplate
  14. */
  15. protected $templates;
  16. /**
  17. * setup method.
  18. *
  19. * @return void
  20. */
  21. public function setUp() {
  22. parent::setUp();
  23. $templates = [
  24. 'datalist' => '<input type="text" list="datalist-{{id}}"{{inputAttrs}}><datalist id="datalist-{{id}}"{{datalistAttrs}}>{{content}}</datalist>',
  25. 'select' => '<select name="{{name}}"{{attrs}}>{{content}}</select>',
  26. 'option' => '<option value="{{value}}"{{attrs}}>{{text}}</option>',
  27. 'optgroup' => '<optgroup label="{{label}}"{{attrs}}>{{content}}</optgroup>',
  28. ];
  29. $this->context = $this->getMockBuilder('Cake\View\Form\ContextInterface')->getMock();
  30. $this->templates = new StringTemplate($templates);
  31. }
  32. /**
  33. * test render no options
  34. *
  35. * @return void
  36. */
  37. public function testRenderNoOptions() {
  38. $select = new DatalistWidget($this->templates);
  39. $data = [
  40. 'id' => 'BirdName',
  41. 'name' => 'Birds[name]',
  42. 'options' => [],
  43. ];
  44. $result = $select->render($data, $this->context);
  45. $expected = [
  46. 'input' => ['type' => 'text', 'list' => 'datalist-BirdName', 'id' => 'BirdName', 'name' => 'Birds[name]', 'autocomplete' => 'off'],
  47. 'datalist' => ['id' => 'datalist-BirdName'],
  48. '/datalist',
  49. ];
  50. $this->assertHtml($expected, $result);
  51. }
  52. /**
  53. * test simple rendering
  54. *
  55. * @return void
  56. */
  57. public function testRenderSimple() {
  58. $select = new DatalistWidget($this->templates);
  59. $data = [
  60. 'id' => 'BirdName',
  61. 'name' => 'Birds[name]',
  62. 'options' => ['a' => 'Albatross', 'b' => 'Budgie'],
  63. ];
  64. $result = $select->render($data, $this->context);
  65. $expected = [
  66. 'input' => ['type' => 'text', 'list' => 'datalist-BirdName', 'id' => 'BirdName', 'name' => 'Birds[name]', 'autocomplete' => 'off'],
  67. 'datalist' => ['id' => 'datalist-BirdName'],
  68. ['option' => ['data-value' => 'a']], 'Albatross', '/option',
  69. ['option' => ['data-value' => 'b']], 'Budgie', '/option',
  70. '/datalist',
  71. ];
  72. $this->assertHtml($expected, $result);
  73. }
  74. /**
  75. * test simple iterator rendering
  76. *
  77. * @return void
  78. */
  79. public function testRenderSimpleIterator() {
  80. $select = new DatalistWidget($this->templates);
  81. $options = new ArrayObject(['a' => 'Albatross', 'b' => 'Budgie']);
  82. $data = [
  83. 'name' => 'Birds[name]',
  84. 'options' => $options,
  85. ];
  86. $result = $select->render($data, $this->context);
  87. $expected = [
  88. 'input' => ['type' => 'text', 'list' => 'datalist-Birds-name', 'id' => 'Birds-name', 'name' => 'Birds[name]', 'autocomplete' => 'off'],
  89. 'datalist' => ['id' => 'datalist-Birds-name'],
  90. ['option' => ['data-value' => 'a']], 'Albatross', '/option',
  91. ['option' => ['data-value' => 'b']], 'Budgie', '/option',
  92. '/datalist',
  93. ];
  94. $this->assertHtml($expected, $result);
  95. }
  96. /**
  97. * test rendering with a selected value
  98. *
  99. * @return void
  100. */
  101. public function testRenderSelected() {
  102. $select = new DatalistWidget($this->templates);
  103. $data = [
  104. 'name' => 'Birds[name]',
  105. 'val' => '1',
  106. 'options' => [
  107. 1 => 'one',
  108. '1x' => 'one x',
  109. '2' => 'two',
  110. '2x' => 'two x',
  111. ],
  112. ];
  113. $result = $select->render($data, $this->context);
  114. $expected = [
  115. 'input' => ['type' => 'text', 'list' => 'datalist-Birds-name', 'id' => 'Birds-name', 'name' => 'Birds[name]', 'autocomplete' => 'off', 'value' => '1'],
  116. 'datalist' => ['id' => 'datalist-Birds-name'],
  117. ['option' => ['data-value' => '1', 'selected' => 'selected']], 'one', '/option',
  118. ['option' => ['data-value' => '1x']], 'one x', '/option',
  119. ['option' => ['data-value' => '2']], 'two', '/option',
  120. ['option' => ['data-value' => '2x']], 'two x', '/option',
  121. '/datalist',
  122. ];
  123. $this->assertHtml($expected, $result);
  124. $data['val'] = 2;
  125. $result = $select->render($data, $this->context);
  126. $expected = [
  127. 'input' => ['type' => 'text', 'list' => 'datalist-Birds-name', 'id' => 'Birds-name', 'name' => 'Birds[name]', 'autocomplete' => 'off', 'value' => '2'],
  128. 'datalist' => ['id' => 'datalist-Birds-name'],
  129. ['option' => ['data-value' => '1']], 'one', '/option',
  130. ['option' => ['data-value' => '1x']], 'one x', '/option',
  131. ['option' => ['data-value' => '2', 'selected' => 'selected']], 'two', '/option',
  132. ['option' => ['data-value' => '2x']], 'two x', '/option',
  133. '/datalist',
  134. ];
  135. $this->assertHtml($expected, $result);
  136. }
  137. /**
  138. * test rendering with option groups
  139. *
  140. * @return void
  141. */
  142. public function testRenderOptionGroups() {
  143. $select = new DatalistWidget($this->templates);
  144. $data = [
  145. 'name' => 'Birds[name]',
  146. 'options' => [
  147. 'Mammal' => [
  148. 'beaver' => 'Beaver',
  149. 'elk' => 'Elk',
  150. ],
  151. 'Bird' => [
  152. 'budgie' => 'Budgie',
  153. 'eagle' => 'Eagle',
  154. ],
  155. ],
  156. ];
  157. $result = $select->render($data, $this->context);
  158. $expected = [
  159. 'input' => ['type' => 'text', 'list' => 'datalist-Birds-name', 'id' => 'Birds-name', 'name' => 'Birds[name]', 'autocomplete' => 'off'],
  160. 'datalist' => ['id' => 'datalist-Birds-name'],
  161. ['optgroup' => ['label' => 'Mammal']],
  162. ['option' => ['data-value' => 'beaver']],
  163. 'Beaver',
  164. '/option',
  165. ['option' => ['data-value' => 'elk']],
  166. 'Elk',
  167. '/option',
  168. '/optgroup',
  169. ['optgroup' => ['label' => 'Bird']],
  170. ['option' => ['data-value' => 'budgie']],
  171. 'Budgie',
  172. '/option',
  173. ['option' => ['data-value' => 'eagle']],
  174. 'Eagle',
  175. '/option',
  176. '/optgroup',
  177. '/datalist',
  178. ];
  179. $this->assertHtml($expected, $result);
  180. }
  181. /**
  182. * test rendering with option groups and escaping
  183. *
  184. * @return void
  185. */
  186. public function testRenderOptionGroupsEscape() {
  187. $select = new DatalistWidget($this->templates);
  188. $data = [
  189. 'name' => 'Birds[name]',
  190. 'options' => [
  191. '>XSS<' => [
  192. '1' => 'One>',
  193. ],
  194. ],
  195. ];
  196. $result = $select->render($data, $this->context);
  197. $expected = [
  198. 'input' => ['type' => 'text', 'list' => 'datalist-Birds-name', 'id' => 'Birds-name', 'name' => 'Birds[name]', 'autocomplete' => 'off'],
  199. 'datalist' => ['id' => 'datalist-Birds-name'],
  200. ['optgroup' => ['label' => '&gt;XSS&lt;']],
  201. ['option' => ['data-value' => '1']],
  202. 'One&gt;',
  203. '/option',
  204. '/optgroup',
  205. '/datalist',
  206. ];
  207. $this->assertHtml($expected, $result);
  208. $data['escape'] = false;
  209. $result = $select->render($data, $this->context);
  210. $expected = [
  211. 'input' => ['type' => 'text', 'list' => 'datalist-Birds-name', 'id' => 'Birds-name', 'name' => 'Birds[name]', 'autocomplete' => 'off'],
  212. 'datalist' => ['id' => 'datalist-Birds-name'],
  213. ['optgroup' => ['label' => '>XSS<']],
  214. ['option' => ['data-value' => '1']],
  215. 'One>',
  216. '/option',
  217. '/optgroup',
  218. '/datalist',
  219. ];
  220. $this->assertHtml($expected, $result);
  221. }
  222. }