| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660 |
- <?php
- /**
- * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
- * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
- *
- * Licensed under The MIT License
- * For full copyright and license information, please see the LICENSE.txt
- * Redistributions of files must retain the above copyright notice.
- *
- * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
- * @link http://cakephp.org CakePHP(tm) Project
- * @since 3.0.0
- * @license http://www.opensource.org/licenses/mit-license.php MIT License
- */
- namespace Cake\Test\TestCase\View\Widget;
- use Cake\Collection\Collection;
- use Cake\TestSuite\TestCase;
- use Cake\View\StringTemplate;
- use Cake\View\Widget\NestingLabelWidget;
- use Cake\View\Widget\RadioWidget;
- /**
- * Radio test case
- */
- class RadioWidgetTest extends TestCase
- {
- /**
- * setup method.
- *
- * @return void
- */
- public function setUp()
- {
- parent::setUp();
- $templates = [
- 'radio' => '<input type="radio" name="{{name}}" value="{{value}}"{{attrs}}>',
- 'nestingLabel' => '<label{{attrs}}>{{input}}{{text}}</label>',
- 'radioWrapper' => '{{label}}',
- ];
- $this->templates = new StringTemplate($templates);
- $this->context = $this->getMock('Cake\View\Form\ContextInterface');
- }
- /**
- * Test rendering basic radio buttons without nested inputs
- *
- * @return void
- */
- public function testRenderSimpleNotNested()
- {
- $this->templates->add([
- 'nestingLabel' => '<label{{attrs}}>{{text}}</label>',
- 'radioWrapper' => '{{input}}{{label}}'
- ]);
- $label = new NestingLabelWidget($this->templates);
- $radio = new RadioWidget($this->templates, $label);
- $data = [
- 'name' => 'Crayons[color]',
- 'label' => null,
- 'options' => ['r' => 'Red', 'b' => 'Black']
- ];
- $result = $radio->render($data, $this->context);
- $expected = [
- ['input' => [
- 'type' => 'radio',
- 'name' => 'Crayons[color]',
- 'value' => 'r',
- 'id' => 'crayons-color-r'
- ]],
- ['label' => ['for' => 'crayons-color-r']],
- 'Red',
- '/label',
- ['input' => [
- 'type' => 'radio',
- 'name' => 'Crayons[color]',
- 'value' => 'b',
- 'id' => 'crayons-color-b'
- ]],
- ['label' => ['for' => 'crayons-color-b']],
- 'Black',
- '/label',
- ];
- $this->assertHtml($expected, $result);
- $data = [
- 'name' => 'Crayons[color]',
- 'label' => false,
- 'options' => ['r' => 'Red', 'b' => 'Black']
- ];
- $result = $radio->render($data, $this->context);
- $expected = [
- ['input' => [
- 'type' => 'radio',
- 'name' => 'Crayons[color]',
- 'value' => 'r',
- 'id' => 'crayons-color-r'
- ]],
- ['input' => [
- 'type' => 'radio',
- 'name' => 'Crayons[color]',
- 'value' => 'b',
- 'id' => 'crayons-color-b'
- ]],
- ];
- $this->assertHtml($expected, $result);
- }
- /**
- * Test rendering basic radio buttons.
- *
- * @return void
- */
- public function testRenderSimple()
- {
- $label = new NestingLabelWidget($this->templates);
- $radio = new RadioWidget($this->templates, $label);
- $data = [
- 'name' => 'Crayons[color]',
- 'label' => null,
- 'options' => ['r' => 'Red', 'b' => 'Black']
- ];
- $result = $radio->render($data, $this->context);
- $expected = [
- ['label' => ['for' => 'crayons-color-r']],
- ['input' => [
- 'type' => 'radio',
- 'name' => 'Crayons[color]',
- 'value' => 'r',
- 'id' => 'crayons-color-r'
- ]],
- 'Red',
- '/label',
- ['label' => ['for' => 'crayons-color-b']],
- ['input' => [
- 'type' => 'radio',
- 'name' => 'Crayons[color]',
- 'value' => 'b',
- 'id' => 'crayons-color-b'
- ]],
- 'Black',
- '/label',
- ];
- $this->assertHtml($expected, $result);
- $data = [
- 'name' => 'Crayons[color]',
- 'options' => new Collection(['r' => 'Red', 'b' => 'Black'])
- ];
- $result = $radio->render($data, $this->context);
- $this->assertHtml($expected, $result);
- }
- /**
- * Test rendering inputs with the complex option form.
- *
- * @return void
- */
- public function testRenderComplex()
- {
- $label = new NestingLabelWidget($this->templates);
- $radio = new RadioWidget($this->templates, $label);
- $data = [
- 'name' => 'Crayons[color]',
- 'options' => [
- ['value' => 'r', 'text' => 'Red', 'id' => 'my_id'],
- ['value' => 'b', 'text' => 'Black', 'id' => 'my_id_2', 'data-test' => 'test'],
- ]
- ];
- $result = $radio->render($data, $this->context);
- $expected = [
- ['label' => ['for' => 'my_id']],
- ['input' => [
- 'type' => 'radio',
- 'name' => 'Crayons[color]',
- 'value' => 'r',
- 'id' => 'my_id'
- ]],
- 'Red',
- '/label',
- ['label' => ['for' => 'my_id_2']],
- ['input' => [
- 'type' => 'radio',
- 'name' => 'Crayons[color]',
- 'value' => 'b',
- 'id' => 'my_id_2',
- 'data-test' => 'test'
- ]],
- 'Black',
- '/label',
- ];
- $this->assertHtml($expected, $result);
- }
- /**
- * Test that id suffixes are generated to not collide
- *
- * @return void
- */
- public function testRenderIdSuffixGeneration()
- {
- $label = new NestingLabelWidget($this->templates);
- $radio = new RadioWidget($this->templates, $label);
- $data = [
- 'name' => 'Thing[value]',
- 'options' => ['a>b' => 'First', 'a<b' => 'Second']
- ];
- $result = $radio->render($data, $this->context);
- $expected = [
- ['label' => ['for' => 'thing-value-a-b']],
- ['input' => [
- 'type' => 'radio',
- 'name' => 'Thing[value]',
- 'value' => 'a>b',
- 'id' => 'thing-value-a-b'
- ]],
- 'First',
- '/label',
- ['label' => ['for' => 'thing-value-a-b1']],
- ['input' => [
- 'type' => 'radio',
- 'name' => 'Thing[value]',
- 'value' => 'a<b',
- 'id' => 'thing-value-a-b1',
- ]],
- 'Second',
- '/label',
- ];
- $this->assertHtml($expected, $result);
- }
- /**
- * Test rendering checks the right option with booleanish values.
- *
- * @return void
- */
- public function testRenderBooleanishValues()
- {
- $label = new NestingLabelWidget($this->templates);
- $radio = new RadioWidget($this->templates, $label);
- $data = [
- 'name' => 'Model[field]',
- 'options' => ['1' => 'Yes', '0' => 'No'],
- 'val' => '0'
- ];
- $result = $radio->render($data, $this->context);
- $expected = [
- ['label' => ['for' => 'model-field-1']],
- ['input' => ['type' => 'radio', 'name' => 'Model[field]', 'value' => '1', 'id' => 'model-field-1']],
- 'Yes',
- '/label',
- ['label' => ['for' => 'model-field-0']],
- ['input' => ['type' => 'radio', 'name' => 'Model[field]', 'value' => '0', 'id' => 'model-field-0', 'checked' => 'checked']],
- 'No',
- '/label',
- ];
- $this->assertHtml($expected, $result);
- $data['val'] = 0;
- $result = $radio->render($data, $this->context);
- $this->assertHtml($expected, $result);
- $data['val'] = false;
- $result = $radio->render($data, $this->context);
- $this->assertHtml($expected, $result);
- $expected = [
- ['label' => ['for' => 'model-field-1']],
- ['input' => ['type' => 'radio', 'name' => 'Model[field]', 'value' => '1', 'id' => 'model-field-1']],
- 'Yes',
- '/label',
- ['label' => ['for' => 'model-field-0']],
- ['input' => ['type' => 'radio', 'name' => 'Model[field]', 'value' => '0', 'id' => 'model-field-0']],
- 'No',
- '/label',
- ];
- $data['val'] = null;
- $result = $radio->render($data, $this->context);
- $this->assertHtml($expected, $result);
- $data['val'] = '';
- $result = $radio->render($data, $this->context);
- $this->assertHtml($expected, $result);
- $expected = [
- ['label' => ['for' => 'model-field-1']],
- ['input' => ['type' => 'radio', 'name' => 'Model[field]', 'value' => '1', 'id' => 'model-field-1', 'checked' => 'checked']],
- 'Yes',
- '/label',
- ['label' => ['for' => 'model-field-0']],
- ['input' => ['type' => 'radio', 'name' => 'Model[field]', 'value' => '0', 'id' => 'model-field-0']],
- 'No',
- '/label',
- ];
- $data['val'] = '1';
- $result = $radio->render($data, $this->context);
- $this->assertHtml($expected, $result);
- $data['val'] = 1;
- $result = $radio->render($data, $this->context);
- $this->assertHtml($expected, $result);
- $data['val'] = true;
- $result = $radio->render($data, $this->context);
- $this->assertHtml($expected, $result);
- }
- /**
- * Test that render() works with the required attribute.
- *
- * @return void
- */
- public function testRenderRequiredAndFormAttribute()
- {
- $label = new NestingLabelWidget($this->templates);
- $radio = new RadioWidget($this->templates, $label);
- $data = [
- 'name' => 'published',
- 'options' => ['option A', 'option B'],
- 'required' => true,
- 'form' => 'my-form',
- ];
- $result = $radio->render($data, $this->context);
- $expected = [
- ['label' => ['for' => 'published-0']],
- ['input' => ['type' => 'radio', 'name' => 'published', 'value' => '0',
- 'id' => 'published-0', 'required' => 'required', 'form' => 'my-form']],
- 'option A',
- '/label',
- ['label' => ['for' => 'published-1']],
- ['input' => ['type' => 'radio', 'name' => 'published', 'value' => '1',
- 'id' => 'published-1', 'required' => 'required', 'form' => 'my-form']],
- 'option B',
- '/label',
- ];
- $this->assertHtml($expected, $result);
- }
- /**
- * Test rendering the empty option.
- *
- * @return void
- */
- public function testRenderEmptyOption()
- {
- $label = new NestingLabelWidget($this->templates);
- $radio = new RadioWidget($this->templates, $label);
- $data = [
- 'name' => 'Crayons[color]',
- 'options' => ['r' => 'Red'],
- 'empty' => true,
- ];
- $result = $radio->render($data, $this->context);
- $expected = [
- ['label' => ['for' => 'crayons-color']],
- ['input' => [
- 'type' => 'radio',
- 'name' => 'Crayons[color]',
- 'value' => '',
- 'id' => 'crayons-color'
- ]],
- 'empty',
- '/label',
- ['label' => ['for' => 'crayons-color-r']],
- ['input' => [
- 'type' => 'radio',
- 'name' => 'Crayons[color]',
- 'value' => 'r',
- 'id' => 'crayons-color-r'
- ]],
- 'Red',
- '/label',
- ];
- $this->assertHtml($expected, $result);
- $data['empty'] = 'Choose one';
- $result = $radio->render($data, $this->context);
- $expected = [
- ['label' => ['for' => 'crayons-color']],
- ['input' => [
- 'type' => 'radio',
- 'name' => 'Crayons[color]',
- 'value' => '',
- 'id' => 'crayons-color'
- ]],
- 'Choose one',
- '/label',
- ['label' => ['for' => 'crayons-color-r']],
- ['input' => [
- 'type' => 'radio',
- 'name' => 'Crayons[color]',
- 'value' => 'r',
- 'id' => 'crayons-color-r'
- ]],
- 'Red',
- '/label',
- ];
- $this->assertHtml($expected, $result);
- }
- /**
- * Test rendering the input inside the label.
- *
- * @return void
- */
- public function testRenderInputInsideLabel()
- {
- $this->templates->add([
- 'label' => '<label{{attrs}}>{{input}}{{text}}</label>',
- 'radioWrapper' => '{{label}}',
- ]);
- $label = new NestingLabelWidget($this->templates);
- $radio = new RadioWidget($this->templates, $label);
- $data = [
- 'name' => 'Crayons[color]',
- 'options' => ['r' => 'Red'],
- ];
- $result = $radio->render($data, $this->context);
- $expected = [
- ['label' => ['for' => 'crayons-color-r']],
- ['input' => [
- 'type' => 'radio',
- 'name' => 'Crayons[color]',
- 'value' => 'r',
- 'id' => 'crayons-color-r'
- ]],
- 'Red',
- '/label',
- ];
- $this->assertHtml($expected, $result);
- }
- /**
- * test render() and selected inputs.
- *
- * @return void
- */
- public function testRenderSelected()
- {
- $label = new NestingLabelWidget($this->templates);
- $radio = new RadioWidget($this->templates, $label);
- $data = [
- 'name' => 'Versions[ver]',
- 'val' => '1',
- 'options' => [
- 1 => 'one',
- '1x' => 'one x',
- '2' => 'two',
- ]
- ];
- $result = $radio->render($data, $this->context);
- $expected = [
- ['label' => ['for' => 'versions-ver-1']],
- ['input' => [
- 'id' => 'versions-ver-1',
- 'name' => 'Versions[ver]',
- 'type' => 'radio',
- 'value' => '1',
- 'checked' => 'checked'
- ]],
- 'one',
- '/label',
- ['label' => ['for' => 'versions-ver-1x']],
- ['input' => [
- 'id' => 'versions-ver-1x',
- 'name' => 'Versions[ver]',
- 'type' => 'radio',
- 'value' => '1x'
- ]],
- 'one x',
- '/label',
- ['label' => ['for' => 'versions-ver-2']],
- ['input' => [
- 'id' => 'versions-ver-2',
- 'name' => 'Versions[ver]',
- 'type' => 'radio',
- 'value' => '2'
- ]],
- 'two',
- '/label',
- ];
- $this->assertHtml($expected, $result);
- }
- /**
- * Test rendering with disable inputs
- *
- * @return void
- */
- public function testRenderDisabled()
- {
- $label = new NestingLabelWidget($this->templates);
- $radio = new RadioWidget($this->templates, $label);
- $data = [
- 'name' => 'Versions[ver]',
- 'options' => [
- 1 => 'one',
- '1x' => 'one x',
- '2' => 'two',
- ],
- 'disabled' => true,
- ];
- $result = $radio->render($data, $this->context);
- $expected = [
- ['label' => ['for' => 'versions-ver-1']],
- ['input' => [
- 'id' => 'versions-ver-1',
- 'name' => 'Versions[ver]',
- 'type' => 'radio',
- 'value' => '1',
- 'disabled' => 'disabled'
- ]],
- 'one',
- '/label',
- ['label' => ['for' => 'versions-ver-1x']],
- ['input' => [
- 'id' => 'versions-ver-1x',
- 'name' => 'Versions[ver]',
- 'type' => 'radio',
- 'value' => '1x',
- 'disabled' => 'disabled'
- ]],
- 'one x',
- '/label',
- ];
- $this->assertHtml($expected, $result);
- $data['disabled'] = 'a string';
- $result = $radio->render($data, $this->context);
- $this->assertHtml($expected, $result);
- $data['disabled'] = ['1'];
- $result = $radio->render($data, $this->context);
- $expected = [
- ['label' => ['for' => 'versions-ver-1']],
- ['input' => [
- 'id' => 'versions-ver-1',
- 'name' => 'Versions[ver]',
- 'type' => 'radio',
- 'value' => '1',
- 'disabled' => 'disabled'
- ]],
- 'one',
- '/label',
- ['label' => ['for' => 'versions-ver-1x']],
- ['input' => [
- 'id' => 'versions-ver-1x',
- 'name' => 'Versions[ver]',
- 'type' => 'radio',
- 'value' => '1x',
- ]],
- 'one x',
- '/label',
- ];
- $this->assertHtml($expected, $result);
- }
- /**
- * Test rendering with label options.
- *
- * @return void
- */
- public function testRenderLabelOptions()
- {
- $label = new NestingLabelWidget($this->templates);
- $radio = new RadioWidget($this->templates, $label);
- $data = [
- 'name' => 'Versions[ver]',
- 'options' => [
- 1 => 'one',
- '1x' => 'one x',
- '2' => 'two',
- ],
- 'label' => false,
- ];
- $result = $radio->render($data, $this->context);
- $expected = [
- ['input' => [
- 'id' => 'versions-ver-1',
- 'name' => 'Versions[ver]',
- 'type' => 'radio',
- 'value' => '1',
- ]],
- ['input' => [
- 'id' => 'versions-ver-1x',
- 'name' => 'Versions[ver]',
- 'type' => 'radio',
- 'value' => '1x',
- ]],
- ];
- $this->assertHtml($expected, $result);
- $data = [
- 'name' => 'Versions[ver]',
- 'options' => [
- 1 => 'one',
- '1x' => 'one x',
- '2' => 'two',
- ],
- 'label' => [
- 'class' => 'my-class',
- ]
- ];
- $result = $radio->render($data, $this->context);
- $expected = [
- ['label' => ['class' => 'my-class', 'for' => 'versions-ver-1']],
- ['input' => [
- 'id' => 'versions-ver-1',
- 'name' => 'Versions[ver]',
- 'type' => 'radio',
- 'value' => '1',
- ]],
- 'one',
- '/label',
- ['label' => ['class' => 'my-class', 'for' => 'versions-ver-1x']],
- ['input' => [
- 'id' => 'versions-ver-1x',
- 'name' => 'Versions[ver]',
- 'type' => 'radio',
- 'value' => '1x',
- ]],
- 'one x',
- '/label',
- ];
- $this->assertHtml($expected, $result);
- }
- /**
- * Ensure that the input + label are composed with
- * a template.
- *
- * @return void
- */
- public function testRenderContainerTemplate()
- {
- $this->templates->add([
- 'radioWrapper' => '<div class="radio">{{input}}{{label}}</div>'
- ]);
- $label = new NestingLabelWidget($this->templates);
- $radio = new RadioWidget($this->templates, $label);
- $data = [
- 'name' => 'Versions[ver]',
- 'options' => [
- 1 => 'one',
- '1x' => 'one x',
- '2' => 'two',
- ],
- ];
- $result = $radio->render($data, $this->context);
- $this->assertContains(
- '<div class="radio"><input type="radio"',
- $result
- );
- $this->assertContains(
- '</label></div>',
- $result
- );
- }
- }
|