|
@@ -1,12 +1,13 @@
|
|
|
<?php
|
|
<?php
|
|
|
namespace Tools\Test\TestCase\View\Widget;
|
|
namespace Tools\Test\TestCase\View\Widget;
|
|
|
|
|
|
|
|
|
|
+use ArrayObject;
|
|
|
use Cake\TestSuite\TestCase;
|
|
use Cake\TestSuite\TestCase;
|
|
|
use Cake\View\StringTemplate;
|
|
use Cake\View\StringTemplate;
|
|
|
use Tools\View\Widget\DatalistWidget;
|
|
use Tools\View\Widget\DatalistWidget;
|
|
|
|
|
|
|
|
-class DatalistWidgetTest extends TestCase
|
|
|
|
|
-{
|
|
|
|
|
|
|
+class DatalistWidgetTest extends TestCase {
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* @var \Cake\View\Form\ContextInterface
|
|
* @var \Cake\View\Form\ContextInterface
|
|
|
*/
|
|
*/
|
|
@@ -17,60 +18,57 @@ class DatalistWidgetTest extends TestCase
|
|
|
*/
|
|
*/
|
|
|
protected $templates;
|
|
protected $templates;
|
|
|
|
|
|
|
|
- /**
|
|
|
|
|
- * setup method.
|
|
|
|
|
- *
|
|
|
|
|
- * @return void
|
|
|
|
|
- */
|
|
|
|
|
- public function setUp()
|
|
|
|
|
- {
|
|
|
|
|
- parent::setUp();
|
|
|
|
|
- $templates = [
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * setup method.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @return void
|
|
|
|
|
+ */
|
|
|
|
|
+ public function setUp() {
|
|
|
|
|
+ parent::setUp();
|
|
|
|
|
+ $templates = [
|
|
|
'datalist' => '<input type="text" list="datalist-{{id}}"{{inputAttrs}}><datalist id="datalist-{{id}}"{{datalistAttrs}}>{{content}}</datalist>',
|
|
'datalist' => '<input type="text" list="datalist-{{id}}"{{inputAttrs}}><datalist id="datalist-{{id}}"{{datalistAttrs}}>{{content}}</datalist>',
|
|
|
- 'select' => '<select name="{{name}}"{{attrs}}>{{content}}</select>',
|
|
|
|
|
- 'option' => '<option value="{{value}}"{{attrs}}>{{text}}</option>',
|
|
|
|
|
- 'optgroup' => '<optgroup label="{{label}}"{{attrs}}>{{content}}</optgroup>',
|
|
|
|
|
- ];
|
|
|
|
|
- $this->context = $this->getMockBuilder('Cake\View\Form\ContextInterface')->getMock();
|
|
|
|
|
- $this->templates = new StringTemplate($templates);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ 'select' => '<select name="{{name}}"{{attrs}}>{{content}}</select>',
|
|
|
|
|
+ 'option' => '<option value="{{value}}"{{attrs}}>{{text}}</option>',
|
|
|
|
|
+ 'optgroup' => '<optgroup label="{{label}}"{{attrs}}>{{content}}</optgroup>',
|
|
|
|
|
+ ];
|
|
|
|
|
+ $this->context = $this->getMockBuilder('Cake\View\Form\ContextInterface')->getMock();
|
|
|
|
|
+ $this->templates = new StringTemplate($templates);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- /**
|
|
|
|
|
- * test render no options
|
|
|
|
|
- *
|
|
|
|
|
- * @return void
|
|
|
|
|
- */
|
|
|
|
|
- public function testRenderNoOptions()
|
|
|
|
|
- {
|
|
|
|
|
- $select = new DatalistWidget($this->templates);
|
|
|
|
|
- $data = [
|
|
|
|
|
- 'id' => 'BirdName',
|
|
|
|
|
- 'name' => 'Birds[name]',
|
|
|
|
|
- 'options' => []
|
|
|
|
|
- ];
|
|
|
|
|
- $result = $select->render($data, $this->context);
|
|
|
|
|
- $expected = [
|
|
|
|
|
- 'input' => ['type' => 'text', 'list' => 'datalist-BirdName', 'id' => 'BirdName', 'name' => 'Birds[name]', 'autocomplete' => 'off'],
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * test render no options
|
|
|
|
|
+ *
|
|
|
|
|
+ * @return void
|
|
|
|
|
+ */
|
|
|
|
|
+ public function testRenderNoOptions() {
|
|
|
|
|
+ $select = new DatalistWidget($this->templates);
|
|
|
|
|
+ $data = [
|
|
|
|
|
+ 'id' => 'BirdName',
|
|
|
|
|
+ 'name' => 'Birds[name]',
|
|
|
|
|
+ 'options' => []
|
|
|
|
|
+ ];
|
|
|
|
|
+ $result = $select->render($data, $this->context);
|
|
|
|
|
+ $expected = [
|
|
|
|
|
+ 'input' => ['type' => 'text', 'list' => 'datalist-BirdName', 'id' => 'BirdName', 'name' => 'Birds[name]', 'autocomplete' => 'off'],
|
|
|
'datalist' => ['id' => 'datalist-BirdName'],
|
|
'datalist' => ['id' => 'datalist-BirdName'],
|
|
|
- '/datalist'
|
|
|
|
|
- ];
|
|
|
|
|
- $this->assertHtml($expected, $result);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ '/datalist'
|
|
|
|
|
+ ];
|
|
|
|
|
+ $this->assertHtml($expected, $result);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- /**
|
|
|
|
|
- * test simple rendering
|
|
|
|
|
- *
|
|
|
|
|
- * @return void
|
|
|
|
|
- */
|
|
|
|
|
- public function testRenderSimple()
|
|
|
|
|
- {
|
|
|
|
|
- $select = new DatalistWidget($this->templates);
|
|
|
|
|
- $data = [
|
|
|
|
|
- 'id' => 'BirdName',
|
|
|
|
|
- 'name' => 'Birds[name]',
|
|
|
|
|
- 'options' => ['a' => 'Albatross', 'b' => 'Budgie']
|
|
|
|
|
- ];
|
|
|
|
|
- $result = $select->render($data, $this->context);
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * test simple rendering
|
|
|
|
|
+ *
|
|
|
|
|
+ * @return void
|
|
|
|
|
+ */
|
|
|
|
|
+ public function testRenderSimple() {
|
|
|
|
|
+ $select = new DatalistWidget($this->templates);
|
|
|
|
|
+ $data = [
|
|
|
|
|
+ 'id' => 'BirdName',
|
|
|
|
|
+ 'name' => 'Birds[name]',
|
|
|
|
|
+ 'options' => ['a' => 'Albatross', 'b' => 'Budgie']
|
|
|
|
|
+ ];
|
|
|
|
|
+ $result = $select->render($data, $this->context);
|
|
|
$expected = [
|
|
$expected = [
|
|
|
'input' => ['type' => 'text', 'list' => 'datalist-BirdName', 'id' => 'BirdName', 'name' => 'Birds[name]', 'autocomplete' => 'off'],
|
|
'input' => ['type' => 'text', 'list' => 'datalist-BirdName', 'id' => 'BirdName', 'name' => 'Birds[name]', 'autocomplete' => 'off'],
|
|
|
'datalist' => ['id' => 'datalist-BirdName'],
|
|
'datalist' => ['id' => 'datalist-BirdName'],
|
|
@@ -79,22 +77,21 @@ class DatalistWidgetTest extends TestCase
|
|
|
'/datalist'
|
|
'/datalist'
|
|
|
];
|
|
];
|
|
|
$this->assertHtml($expected, $result);
|
|
$this->assertHtml($expected, $result);
|
|
|
- }
|
|
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- /**
|
|
|
|
|
- * test simple iterator rendering
|
|
|
|
|
- *
|
|
|
|
|
- * @return void
|
|
|
|
|
- */
|
|
|
|
|
- public function testRenderSimpleIterator()
|
|
|
|
|
- {
|
|
|
|
|
- $select = new DatalistWidget($this->templates);
|
|
|
|
|
- $options = new \ArrayObject(['a' => 'Albatross', 'b' => 'Budgie']);
|
|
|
|
|
- $data = [
|
|
|
|
|
- 'name' => 'Birds[name]',
|
|
|
|
|
- 'options' => $options,
|
|
|
|
|
- ];
|
|
|
|
|
- $result = $select->render($data, $this->context);
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * test simple iterator rendering
|
|
|
|
|
+ *
|
|
|
|
|
+ * @return void
|
|
|
|
|
+ */
|
|
|
|
|
+ public function testRenderSimpleIterator() {
|
|
|
|
|
+ $select = new DatalistWidget($this->templates);
|
|
|
|
|
+ $options = new ArrayObject(['a' => 'Albatross', 'b' => 'Budgie']);
|
|
|
|
|
+ $data = [
|
|
|
|
|
+ 'name' => 'Birds[name]',
|
|
|
|
|
+ 'options' => $options,
|
|
|
|
|
+ ];
|
|
|
|
|
+ $result = $select->render($data, $this->context);
|
|
|
$expected = [
|
|
$expected = [
|
|
|
'input' => ['type' => 'text', 'list' => 'datalist-Birds-name', 'id' => 'Birds-name', 'name' => 'Birds[name]', 'autocomplete' => 'off'],
|
|
'input' => ['type' => 'text', 'list' => 'datalist-Birds-name', 'id' => 'Birds-name', 'name' => 'Birds[name]', 'autocomplete' => 'off'],
|
|
|
'datalist' => ['id' => 'datalist-Birds-name'],
|
|
'datalist' => ['id' => 'datalist-Birds-name'],
|
|
@@ -102,41 +99,40 @@ class DatalistWidgetTest extends TestCase
|
|
|
['option' => ['data-value' => 'b']], 'Budgie', '/option',
|
|
['option' => ['data-value' => 'b']], 'Budgie', '/option',
|
|
|
'/datalist'
|
|
'/datalist'
|
|
|
];
|
|
];
|
|
|
- $this->assertHtml($expected, $result);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ $this->assertHtml($expected, $result);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- /**
|
|
|
|
|
- * test rendering with a selected value
|
|
|
|
|
- *
|
|
|
|
|
- * @return void
|
|
|
|
|
- */
|
|
|
|
|
- public function testRenderSelected()
|
|
|
|
|
- {
|
|
|
|
|
- $select = new DatalistWidget($this->templates);
|
|
|
|
|
- $data = [
|
|
|
|
|
- 'name' => 'Birds[name]',
|
|
|
|
|
- 'val' => '1',
|
|
|
|
|
- 'options' => [
|
|
|
|
|
- 1 => 'one',
|
|
|
|
|
- '1x' => 'one x',
|
|
|
|
|
- '2' => 'two',
|
|
|
|
|
- '2x' => 'two x',
|
|
|
|
|
- ]
|
|
|
|
|
- ];
|
|
|
|
|
- $result = $select->render($data, $this->context);
|
|
|
|
|
- $expected = [
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * test rendering with a selected value
|
|
|
|
|
+ *
|
|
|
|
|
+ * @return void
|
|
|
|
|
+ */
|
|
|
|
|
+ public function testRenderSelected() {
|
|
|
|
|
+ $select = new DatalistWidget($this->templates);
|
|
|
|
|
+ $data = [
|
|
|
|
|
+ 'name' => 'Birds[name]',
|
|
|
|
|
+ 'val' => '1',
|
|
|
|
|
+ 'options' => [
|
|
|
|
|
+ 1 => 'one',
|
|
|
|
|
+ '1x' => 'one x',
|
|
|
|
|
+ '2' => 'two',
|
|
|
|
|
+ '2x' => 'two x',
|
|
|
|
|
+ ]
|
|
|
|
|
+ ];
|
|
|
|
|
+ $result = $select->render($data, $this->context);
|
|
|
|
|
+ $expected = [
|
|
|
'input' => ['type' => 'text', 'list' => 'datalist-Birds-name', 'id' => 'Birds-name', 'name' => 'Birds[name]', 'autocomplete' => 'off', 'value' => '1'],
|
|
'input' => ['type' => 'text', 'list' => 'datalist-Birds-name', 'id' => 'Birds-name', 'name' => 'Birds[name]', 'autocomplete' => 'off', 'value' => '1'],
|
|
|
'datalist' => ['id' => 'datalist-Birds-name'],
|
|
'datalist' => ['id' => 'datalist-Birds-name'],
|
|
|
['option' => ['data-value' => '1', 'selected' => 'selected']], 'one', '/option',
|
|
['option' => ['data-value' => '1', 'selected' => 'selected']], 'one', '/option',
|
|
|
- ['option' => ['data-value' => '1x']], 'one x', '/option',
|
|
|
|
|
- ['option' => ['data-value' => '2']], 'two', '/option',
|
|
|
|
|
- ['option' => ['data-value' => '2x']], 'two x', '/option',
|
|
|
|
|
|
|
+ ['option' => ['data-value' => '1x']], 'one x', '/option',
|
|
|
|
|
+ ['option' => ['data-value' => '2']], 'two', '/option',
|
|
|
|
|
+ ['option' => ['data-value' => '2x']], 'two x', '/option',
|
|
|
'/datalist'
|
|
'/datalist'
|
|
|
- ];
|
|
|
|
|
- $this->assertHtml($expected, $result);
|
|
|
|
|
|
|
+ ];
|
|
|
|
|
+ $this->assertHtml($expected, $result);
|
|
|
|
|
|
|
|
- $data['val'] = 2;
|
|
|
|
|
- $result = $select->render($data, $this->context);
|
|
|
|
|
|
|
+ $data['val'] = 2;
|
|
|
|
|
+ $result = $select->render($data, $this->context);
|
|
|
$expected = [
|
|
$expected = [
|
|
|
'input' => ['type' => 'text', 'list' => 'datalist-Birds-name', 'id' => 'Birds-name', 'name' => 'Birds[name]', 'autocomplete' => 'off', 'value' => '2'],
|
|
'input' => ['type' => 'text', 'list' => 'datalist-Birds-name', 'id' => 'Birds-name', 'name' => 'Birds[name]', 'autocomplete' => 'off', 'value' => '2'],
|
|
|
'datalist' => ['id' => 'datalist-Birds-name'],
|
|
'datalist' => ['id' => 'datalist-Birds-name'],
|
|
@@ -146,31 +142,30 @@ class DatalistWidgetTest extends TestCase
|
|
|
['option' => ['data-value' => '2x']], 'two x', '/option',
|
|
['option' => ['data-value' => '2x']], 'two x', '/option',
|
|
|
'/datalist'
|
|
'/datalist'
|
|
|
];
|
|
];
|
|
|
- $this->assertHtml($expected, $result);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ $this->assertHtml($expected, $result);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- /**
|
|
|
|
|
- * test rendering with option groups
|
|
|
|
|
- *
|
|
|
|
|
- * @return void
|
|
|
|
|
- */
|
|
|
|
|
- public function testRenderOptionGroups()
|
|
|
|
|
- {
|
|
|
|
|
- $select = new DatalistWidget($this->templates);
|
|
|
|
|
- $data = [
|
|
|
|
|
- 'name' => 'Birds[name]',
|
|
|
|
|
- 'options' => [
|
|
|
|
|
- 'Mammal' => [
|
|
|
|
|
- 'beaver' => 'Beaver',
|
|
|
|
|
- 'elk' => 'Elk',
|
|
|
|
|
- ],
|
|
|
|
|
- 'Bird' => [
|
|
|
|
|
- 'budgie' => 'Budgie',
|
|
|
|
|
- 'eagle' => 'Eagle',
|
|
|
|
|
- ]
|
|
|
|
|
- ]
|
|
|
|
|
- ];
|
|
|
|
|
- $result = $select->render($data, $this->context);
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * test rendering with option groups
|
|
|
|
|
+ *
|
|
|
|
|
+ * @return void
|
|
|
|
|
+ */
|
|
|
|
|
+ public function testRenderOptionGroups() {
|
|
|
|
|
+ $select = new DatalistWidget($this->templates);
|
|
|
|
|
+ $data = [
|
|
|
|
|
+ 'name' => 'Birds[name]',
|
|
|
|
|
+ 'options' => [
|
|
|
|
|
+ 'Mammal' => [
|
|
|
|
|
+ 'beaver' => 'Beaver',
|
|
|
|
|
+ 'elk' => 'Elk',
|
|
|
|
|
+ ],
|
|
|
|
|
+ 'Bird' => [
|
|
|
|
|
+ 'budgie' => 'Budgie',
|
|
|
|
|
+ 'eagle' => 'Eagle',
|
|
|
|
|
+ ]
|
|
|
|
|
+ ]
|
|
|
|
|
+ ];
|
|
|
|
|
+ $result = $select->render($data, $this->context);
|
|
|
$expected = [
|
|
$expected = [
|
|
|
'input' => ['type' => 'text', 'list' => 'datalist-Birds-name', 'id' => 'Birds-name', 'name' => 'Birds[name]', 'autocomplete' => 'off'],
|
|
'input' => ['type' => 'text', 'list' => 'datalist-Birds-name', 'id' => 'Birds-name', 'name' => 'Birds[name]', 'autocomplete' => 'off'],
|
|
|
'datalist' => ['id' => 'datalist-Birds-name'],
|
|
'datalist' => ['id' => 'datalist-Birds-name'],
|
|
@@ -192,51 +187,50 @@ class DatalistWidgetTest extends TestCase
|
|
|
'/optgroup',
|
|
'/optgroup',
|
|
|
'/datalist'
|
|
'/datalist'
|
|
|
];
|
|
];
|
|
|
- $this->assertHtml($expected, $result);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ $this->assertHtml($expected, $result);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- /**
|
|
|
|
|
- * test rendering with option groups and escaping
|
|
|
|
|
- *
|
|
|
|
|
- * @return void
|
|
|
|
|
- */
|
|
|
|
|
- public function testRenderOptionGroupsEscape()
|
|
|
|
|
- {
|
|
|
|
|
- $select = new DatalistWidget($this->templates);
|
|
|
|
|
- $data = [
|
|
|
|
|
- 'name' => 'Birds[name]',
|
|
|
|
|
- 'options' => [
|
|
|
|
|
- '>XSS<' => [
|
|
|
|
|
- '1' => 'One>',
|
|
|
|
|
- ],
|
|
|
|
|
- ]
|
|
|
|
|
- ];
|
|
|
|
|
- $result = $select->render($data, $this->context);
|
|
|
|
|
- $expected = [
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * test rendering with option groups and escaping
|
|
|
|
|
+ *
|
|
|
|
|
+ * @return void
|
|
|
|
|
+ */
|
|
|
|
|
+ public function testRenderOptionGroupsEscape() {
|
|
|
|
|
+ $select = new DatalistWidget($this->templates);
|
|
|
|
|
+ $data = [
|
|
|
|
|
+ 'name' => 'Birds[name]',
|
|
|
|
|
+ 'options' => [
|
|
|
|
|
+ '>XSS<' => [
|
|
|
|
|
+ '1' => 'One>',
|
|
|
|
|
+ ],
|
|
|
|
|
+ ]
|
|
|
|
|
+ ];
|
|
|
|
|
+ $result = $select->render($data, $this->context);
|
|
|
|
|
+ $expected = [
|
|
|
'input' => ['type' => 'text', 'list' => 'datalist-Birds-name', 'id' => 'Birds-name', 'name' => 'Birds[name]', 'autocomplete' => 'off'],
|
|
'input' => ['type' => 'text', 'list' => 'datalist-Birds-name', 'id' => 'Birds-name', 'name' => 'Birds[name]', 'autocomplete' => 'off'],
|
|
|
'datalist' => ['id' => 'datalist-Birds-name'],
|
|
'datalist' => ['id' => 'datalist-Birds-name'],
|
|
|
- ['optgroup' => ['label' => '>XSS<']],
|
|
|
|
|
- ['option' => ['data-value' => '1']],
|
|
|
|
|
- 'One>',
|
|
|
|
|
- '/option',
|
|
|
|
|
- '/optgroup',
|
|
|
|
|
|
|
+ ['optgroup' => ['label' => '>XSS<']],
|
|
|
|
|
+ ['option' => ['data-value' => '1']],
|
|
|
|
|
+ 'One>',
|
|
|
|
|
+ '/option',
|
|
|
|
|
+ '/optgroup',
|
|
|
'/datalist'
|
|
'/datalist'
|
|
|
- ];
|
|
|
|
|
- $this->assertHtml($expected, $result);
|
|
|
|
|
|
|
+ ];
|
|
|
|
|
+ $this->assertHtml($expected, $result);
|
|
|
|
|
|
|
|
- $data['escape'] = false;
|
|
|
|
|
- $result = $select->render($data, $this->context);
|
|
|
|
|
- $expected = [
|
|
|
|
|
|
|
+ $data['escape'] = false;
|
|
|
|
|
+ $result = $select->render($data, $this->context);
|
|
|
|
|
+ $expected = [
|
|
|
'input' => ['type' => 'text', 'list' => 'datalist-Birds-name', 'id' => 'Birds-name', 'name' => 'Birds[name]', 'autocomplete' => 'off'],
|
|
'input' => ['type' => 'text', 'list' => 'datalist-Birds-name', 'id' => 'Birds-name', 'name' => 'Birds[name]', 'autocomplete' => 'off'],
|
|
|
'datalist' => ['id' => 'datalist-Birds-name'],
|
|
'datalist' => ['id' => 'datalist-Birds-name'],
|
|
|
- ['optgroup' => ['label' => '>XSS<']],
|
|
|
|
|
- ['option' => ['data-value' => '1']],
|
|
|
|
|
- 'One>',
|
|
|
|
|
- '/option',
|
|
|
|
|
- '/optgroup',
|
|
|
|
|
|
|
+ ['optgroup' => ['label' => '>XSS<']],
|
|
|
|
|
+ ['option' => ['data-value' => '1']],
|
|
|
|
|
+ 'One>',
|
|
|
|
|
+ '/option',
|
|
|
|
|
+ '/optgroup',
|
|
|
'/datalist'
|
|
'/datalist'
|
|
|
- ];
|
|
|
|
|
- $this->assertHtml($expected, $result);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ ];
|
|
|
|
|
+ $this->assertHtml($expected, $result);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
}
|
|
}
|