mscherer 7 years ago
parent
commit
0fce0f3093
2 changed files with 207 additions and 213 deletions
  1. 55 55
      src/View/Widget/DatalistWidget.php
  2. 152 158
      tests/TestCase/View/Widget/DatalistWidgetTest.php

+ 55 - 55
src/View/Widget/DatalistWidget.php

@@ -14,65 +14,65 @@ use Cake\View\Widget\SelectBoxWidget;
  * - keys: Use as true to use the keys of the select options instead of the values.
  * - input: Attributes for input element
  */
-class DatalistWidget extends SelectBoxWidget
-{
-    /**
-     * @param array $data
-     * @param \Cake\View\Form\ContextInterface $context
-     * @return string|null
-     */
-    public function render(array $data, ContextInterface $context)
-    {
-        $data += [
-            'id' => null,
-            'name' => '',
-            'empty' => false,
-            'escape' => true,
-            'options' => [],
-            'disabled' => null,
-            'val' => null,
-            'input' => [],
-            'keys' => false,
-            'templateVars' => [],
-        ];
+class DatalistWidget extends SelectBoxWidget {
 
-        $options = $this->_renderContent($data);
-        if (!$data['keys']) {
-            $options = str_replace(
-                'value',
-                'data-value',
-                $options
-            );
-        }
+	/**
+	 * @param array $data
+	 * @param \Cake\View\Form\ContextInterface $context
+	 * @return string|null
+	 */
+	public function render(array $data, ContextInterface $context) {
+		$data += [
+			'id' => null,
+			'name' => '',
+			'empty' => false,
+			'escape' => true,
+			'options' => [],
+			'disabled' => null,
+			'val' => null,
+			'input' => [],
+			'keys' => false,
+			'templateVars' => [],
+		];
 
-        $name = $data['name'];
-        $id = $data['id'] ?: Text::slug($name);
-        $default = isset($data['val']) ? $data['val'] : null;
+		$options = $this->_renderContent($data);
+		if (!$data['keys']) {
+			$options = str_replace(
+				'value',
+				'data-value',
+				$options
+			);
+		}
 
-        $inputData = $data['input'] + [
-            'id' => $id,
-            'name' => $name,
-            'autocomplete' => 'off',
-        ];
+		$name = $data['name'];
+		$id = $data['id'] ?: Text::slug($name);
+		$default = isset($data['val']) ? $data['val'] : null;
 
-        unset($data['name'], $data['options'], $data['empty'], $data['val'], $data['escape'], $data['keys'], $data['input'], $data['id']);
-        if (isset($data['disabled']) && is_array($data['disabled'])) {
-            unset($data['disabled']);
-        }
+		$inputData = $data['input'] + [
+			'id' => $id,
+			'name' => $name,
+			'autocomplete' => 'off',
+		];
 
-        $inputData['value'] = $default;
-        $inputAttrs = $this->_templates->formatAttributes($inputData);
+		unset($data['name'], $data['options'], $data['empty'], $data['val'], $data['escape'], $data['keys'], $data['input'], $data['id']);
+		if (isset($data['disabled']) && is_array($data['disabled'])) {
+			unset($data['disabled']);
+		}
+
+		$inputData['value'] = $default;
+		$inputAttrs = $this->_templates->formatAttributes($inputData);
+
+		$datalistAttrs = $this->_templates->formatAttributes($data);
+		return $this->_templates->format(
+			'datalist',
+			[
+				'name' => $name,
+				'inputAttrs' => $inputAttrs,
+				'datalistAttrs' => $datalistAttrs,
+				'content' => implode('', $options),
+				'id' => $id,
+			]
+		);
+	}
 
-        $datalistAttrs = $this->_templates->formatAttributes($data);
-        return $this->_templates->format(
-            'datalist',
-            [
-                'name' => $name,
-                'inputAttrs' => $inputAttrs,
-                'datalistAttrs' => $datalistAttrs,
-                'content' => implode('', $options),
-                'id' => $id,
-            ]
-        );
-    }
 }

+ 152 - 158
tests/TestCase/View/Widget/DatalistWidgetTest.php

@@ -1,12 +1,13 @@
 <?php
 namespace Tools\Test\TestCase\View\Widget;
 
+use ArrayObject;
 use Cake\TestSuite\TestCase;
 use Cake\View\StringTemplate;
 use Tools\View\Widget\DatalistWidget;
 
-class DatalistWidgetTest extends TestCase
-{
+class DatalistWidgetTest extends TestCase {
+
 	/**
 	 * @var \Cake\View\Form\ContextInterface
 	 */
@@ -17,60 +18,57 @@ class DatalistWidgetTest extends TestCase
 	 */
 	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>',
-            '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'
-        ];
-        $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 = [
 			'input' => ['type' => 'text', 'list' => 'datalist-BirdName', 'id' => 'BirdName', 'name' => 'Birds[name]', 'autocomplete' => 'off'],
 			'datalist' => ['id' => 'datalist-BirdName'],
@@ -79,22 +77,21 @@ class DatalistWidgetTest extends TestCase
 			'/datalist'
 		];
 		$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 = [
 			'input' => ['type' => 'text', 'list' => 'datalist-Birds-name', 'id' => 'Birds-name', 'name' => 'Birds[name]', 'autocomplete' => 'off'],
 			'datalist' => ['id' => 'datalist-Birds-name'],
@@ -102,41 +99,40 @@ class DatalistWidgetTest extends TestCase
 			['option' => ['data-value' => 'b']], 'Budgie', '/option',
 			'/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'],
 			'datalist' => ['id' => 'datalist-Birds-name'],
 			['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'
-        ];
-        $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 = [
 			'input' => ['type' => 'text', 'list' => 'datalist-Birds-name', 'id' => 'Birds-name', 'name' => 'Birds[name]', 'autocomplete' => 'off', 'value' => '2'],
 			'datalist' => ['id' => 'datalist-Birds-name'],
@@ -146,31 +142,30 @@ class DatalistWidgetTest extends TestCase
 			['option' => ['data-value' => '2x']], 'two x', '/option',
 			'/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 = [
 			'input' => ['type' => 'text', 'list' => 'datalist-Birds-name', 'id' => 'Birds-name', 'name' => 'Birds[name]', 'autocomplete' => 'off'],
 			'datalist' => ['id' => 'datalist-Birds-name'],
@@ -192,51 +187,50 @@ class DatalistWidgetTest extends TestCase
 			'/optgroup',
 			'/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'],
 			'datalist' => ['id' => 'datalist-Birds-name'],
-            ['optgroup' => ['label' => '&gt;XSS&lt;']],
-            ['option' => ['data-value' => '1']],
-            'One&gt;',
-            '/option',
-            '/optgroup',
+			['optgroup' => ['label' => '&gt;XSS&lt;']],
+			['option' => ['data-value' => '1']],
+			'One&gt;',
+			'/option',
+			'/optgroup',
 			'/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'],
 			'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'
-        ];
-        $this->assertHtml($expected, $result);
-    }
+		];
+		$this->assertHtml($expected, $result);
+	}
 
 }