'',
'select' => '',
'option' => '',
'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'],
'datalist' => ['id' => 'datalist-BirdName'],
'/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);
$expected = [
'input' => ['type' => 'text', 'list' => 'datalist-BirdName', 'id' => 'BirdName', 'name' => 'Birds[name]', 'autocomplete' => 'off'],
'datalist' => ['id' => 'datalist-BirdName'],
['option' => ['data-value' => 'a']], 'Albatross', '/option',
['option' => ['data-value' => 'b']], 'Budgie', '/option',
'/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);
$expected = [
'input' => ['type' => 'text', 'list' => 'datalist-Birds-name', 'id' => 'Birds-name', 'name' => 'Birds[name]', 'autocomplete' => 'off'],
'datalist' => ['id' => 'datalist-Birds-name'],
['option' => ['data-value' => 'a']], 'Albatross', '/option',
['option' => ['data-value' => 'b']], 'Budgie', '/option',
'/datalist',
];
$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 = [
'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',
'/datalist',
];
$this->assertHtml($expected, $result);
$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'],
['option' => ['data-value' => '1']], 'one', '/option',
['option' => ['data-value' => '1x']], 'one x', '/option',
['option' => ['data-value' => '2', 'selected' => 'selected']], 'two', '/option',
['option' => ['data-value' => '2x']], 'two x', '/option',
'/datalist',
];
$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);
$expected = [
'input' => ['type' => 'text', 'list' => 'datalist-Birds-name', 'id' => 'Birds-name', 'name' => 'Birds[name]', 'autocomplete' => 'off'],
'datalist' => ['id' => 'datalist-Birds-name'],
['optgroup' => ['label' => 'Mammal']],
['option' => ['data-value' => 'beaver']],
'Beaver',
'/option',
['option' => ['data-value' => 'elk']],
'Elk',
'/option',
'/optgroup',
['optgroup' => ['label' => 'Bird']],
['option' => ['data-value' => 'budgie']],
'Budgie',
'/option',
['option' => ['data-value' => 'eagle']],
'Eagle',
'/option',
'/optgroup',
'/datalist',
];
$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 = [
'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',
'/datalist',
];
$this->assertHtml($expected, $result);
$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',
'/datalist',
];
$this->assertHtml($expected, $result);
}
}