DatalistWidgetTest.php 7.6 KB

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