TYPO3 API  SVNRelease
SelectViewHelperTest.php
Go to the documentation of this file.
00001 <?php
00002 
00003 /*                                                                        *
00004  * This script belongs to the FLOW3 package "Fluid".                      *
00005  *                                                                        *
00006  * It is free software; you can redistribute it and/or modify it under    *
00007  * the terms of the GNU Lesser General Public License as published by the *
00008  * Free Software Foundation, either version 3 of the License, or (at your *
00009  * option) any later version.                                             *
00010  *                                                                        *
00011  * This script is distributed in the hope that it will be useful, but     *
00012  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-    *
00013  * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser       *
00014  * General Public License for more details.                               *
00015  *                                                                        *
00016  * You should have received a copy of the GNU Lesser General Public       *
00017  * License along with the script.                                         *
00018  * If not, see http://www.gnu.org/licenses/lgpl.html                      *
00019  *                                                                        *
00020  * The TYPO3 project - inspiring people to share!                         *
00021  *                                                                        */
00022 
00023 require_once(dirname(__FILE__) . '/Fixtures/EmptySyntaxTreeNode.php');
00024 require_once(dirname(__FILE__) . '/Fixtures/Fixture_UserDomainClass.php');
00025 require_once(dirname(__FILE__) . '/../ViewHelperBaseTestcase.php');
00026 
00027 /**
00028  * Test for the "Select" Form view helper
00029  *
00030  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
00031  */
00032 class Tx_Fluid_Tests_Unit_ViewHelpers_Form_SelectViewHelperTest extends Tx_Fluid_ViewHelpers_ViewHelperBaseTestcase {
00033 
00034     /**
00035      * var Tx_Fluid_ViewHelpers_Form_SelectViewHelper
00036      */
00037     protected $viewHelper;
00038 
00039     public function setUp() {
00040         parent::setUp();
00041         $this->viewHelper = $this->getAccessibleMock('Tx_Fluid_ViewHelpers_Form_SelectViewHelper', array('setErrorClassAttribute', 'registerFieldNameForFormTokenGeneration'));
00042         $this->injectDependenciesIntoViewHelper($this->viewHelper);
00043         $this->viewHelper->initializeArguments();
00044     }
00045 
00046     /**
00047      * @test
00048      * @author Bastian Waidelich <bastian@typo3.org>
00049      */
00050     public function selectCorrectlySetsTagName() {
00051         $mockTagBuilder = $this->getMock('Tx_Fluid_Core_ViewHelper_TagBuilder', array('setTagName'), array(), '', FALSE);
00052         $mockTagBuilder->expects($this->once())->method('setTagName')->with('select');
00053         $this->viewHelper->_set('tag', $mockTagBuilder);
00054 
00055         $arguments = new Tx_Fluid_Core_ViewHelper_Arguments(array(
00056             'options' => array()
00057         ));
00058         $this->viewHelper->setArguments($arguments);
00059 
00060         $this->viewHelper->initialize();
00061         $this->viewHelper->render();
00062     }
00063 
00064     /**
00065      * @test
00066      * @author Sebastian Kurfürst <sebastian@typo3.org>
00067      * @author Bastian Waidelich <bastian@typo3.org>
00068      */
00069     public function selectCreatesExpectedOptions() {
00070         $mockTagBuilder = $this->getMock('Tx_Fluid_Core_ViewHelper_TagBuilder', array('addAttribute', 'setContent', 'render'), array(), '', FALSE);
00071         $mockTagBuilder->expects($this->once())->method('addAttribute')->with('name', 'myName');
00072         $this->viewHelper->expects($this->once())->method('registerFieldNameForFormTokenGeneration')->with('myName');
00073         $mockTagBuilder->expects($this->once())->method('setContent')->with('<option value="value1">label1</option>' . chr(10) . '<option value="value2" selected="selected">label2</option>' . chr(10));
00074         $mockTagBuilder->expects($this->once())->method('render');
00075         $this->viewHelper->_set('tag', $mockTagBuilder);
00076 
00077         $arguments = new Tx_Fluid_Core_ViewHelper_Arguments(array(
00078             'options' => array(
00079                 'value1' => 'label1',
00080                 'value2' => 'label2'
00081             ),
00082             'value' => 'value2',
00083             'name' => 'myName'
00084         ));
00085         $this->viewHelper->setArguments($arguments);
00086 
00087         $this->viewHelper->initialize();
00088         $this->viewHelper->render();
00089     }
00090 
00091         /**
00092      * @test
00093      * @author Bastian Waidelich <bastian@typo3.org>
00094      */
00095     public function anEmptyOptionTagIsRenderedIfOptionsArrayIsEmptyToAssureXhtmlCompatibility() {
00096         $mockTagBuilder = $this->getMock('Tx_Fluid_Core_ViewHelper_TagBuilder', array('addAttribute', 'setContent', 'render'), array(), '', FALSE);
00097         $mockTagBuilder->expects($this->once())->method('addAttribute')->with('name', 'myName');
00098         $this->viewHelper->expects($this->once())->method('registerFieldNameForFormTokenGeneration')->with('myName');
00099         $mockTagBuilder->expects($this->once())->method('setContent')->with('<option value=""></option>' . chr(10));
00100         $mockTagBuilder->expects($this->once())->method('render');
00101         $this->viewHelper->_set('tag', $mockTagBuilder);
00102 
00103         $arguments = new Tx_Fluid_Core_ViewHelper_Arguments(array(
00104             'options' => array(),
00105             'value' => 'value2',
00106             'name' => 'myName'
00107         ));
00108         $this->viewHelper->setArguments($arguments);
00109 
00110         $this->viewHelper->initialize();
00111         $this->viewHelper->render();
00112     }
00113 
00114     /**
00115      * @test
00116      * @author Bastian Waidelich <bastian@typo3.org>
00117      */
00118     public function OrderOfOptionsIsNotAlteredByDefault() {
00119         $mockTagBuilder = $this->getMock('Tx_Fluid_Core_ViewHelper_TagBuilder', array('addAttribute', 'setContent', 'render'), array(), '', FALSE);
00120         $mockTagBuilder->expects($this->once())->method('addAttribute')->with('name', 'myName');
00121         $this->viewHelper->expects($this->once())->method('registerFieldNameForFormTokenGeneration')->with('myName');
00122         $mockTagBuilder->expects($this->once())->method('setContent')->with('<option value="value3">label3</option>' . chr(10) . '<option value="value1">label1</option>' . chr(10) . '<option value="value2" selected="selected">label2</option>' . chr(10));
00123         $mockTagBuilder->expects($this->once())->method('render');
00124         $this->viewHelper->_set('tag', $mockTagBuilder);
00125 
00126         $arguments = new Tx_Fluid_Core_ViewHelper_Arguments(array(
00127             'options' => array(
00128                 'value3' => 'label3',
00129                 'value1' => 'label1',
00130                 'value2' => 'label2'
00131             ),
00132             'value' => 'value2',
00133             'name' => 'myName'
00134         ));
00135         $this->viewHelper->setArguments($arguments);
00136 
00137         $this->viewHelper->initialize();
00138         $this->viewHelper->render();
00139     }
00140 
00141     /**
00142      * @test
00143      * @author Bastian Waidelich <bastian@typo3.org>
00144      */
00145     public function optionsAreSortedByLabelIfSortByOptionLabelIsSet() {
00146         $mockTagBuilder = $this->getMock('Tx_Fluid_Core_ViewHelper_TagBuilder', array('addAttribute', 'setContent', 'render'), array(), '', FALSE);
00147         $mockTagBuilder->expects($this->once())->method('addAttribute')->with('name', 'myName');
00148         $this->viewHelper->expects($this->once())->method('registerFieldNameForFormTokenGeneration')->with('myName');
00149         $mockTagBuilder->expects($this->once())->method('setContent')->with('<option value="value1">label1</option>' . chr(10) . '<option value="value2" selected="selected">label2</option>' . chr(10) . '<option value="value3">label3</option>' . chr(10));
00150         $mockTagBuilder->expects($this->once())->method('render');
00151         $this->viewHelper->_set('tag', $mockTagBuilder);
00152 
00153         $arguments = new Tx_Fluid_Core_ViewHelper_Arguments(array(
00154             'options' => array(
00155                 'value3' => 'label3',
00156                 'value1' => 'label1',
00157                 'value2' => 'label2'
00158             ),
00159             'value' => 'value2',
00160             'name' => 'myName',
00161             'sortByOptionLabel' => TRUE
00162         ));
00163         $this->viewHelper->setArguments($arguments);
00164 
00165         $this->viewHelper->initialize();
00166         $this->viewHelper->render();
00167     }
00168 
00169     /**
00170      * @test
00171      * @author Bastian Waidelich <bastian@typo3.org>
00172      */
00173     public function multipleSelectCreatesExpectedOptions() {
00174         $mockTagBuilder = $this->getMock('Tx_Fluid_Core_ViewHelper_TagBuilder', array('addAttribute', 'setContent', 'render'), array(), '', FALSE);
00175         $mockTagBuilder->expects($this->at(0))->method('addAttribute')->with('multiple', 'multiple');
00176         $mockTagBuilder->expects($this->at(1))->method('addAttribute')->with('name', 'myName[]');
00177         $this->viewHelper->expects($this->exactly(3))->method('registerFieldNameForFormTokenGeneration')->with('myName[]');
00178         $mockTagBuilder->expects($this->once())->method('setContent')->with('<option value="value1" selected="selected">label1</option>' . chr(10) . '<option value="value2">label2</option>' . chr(10) . '<option value="value3" selected="selected">label3</option>' . chr(10));
00179         $mockTagBuilder->expects($this->once())->method('render');
00180         $this->viewHelper->_set('tag', $mockTagBuilder);
00181 
00182         $arguments = new Tx_Fluid_Core_ViewHelper_Arguments(array(
00183             'options' => array(
00184                 'value1' => 'label1',
00185                 'value2' => 'label2',
00186                 'value3' => 'label3'
00187             ),
00188             'value' => array('value3', 'value1'),
00189             'name' => 'myName',
00190             'multiple' => 'multiple',
00191         ));
00192         $this->viewHelper->setArguments($arguments);
00193 
00194         $this->viewHelper->initialize();
00195         $this->viewHelper->render();
00196     }
00197 
00198     /**
00199      * @test
00200      * @author Sebastian Kurfürst <sebastian@typo3.org>
00201      * @author Bastian Waidelich <bastian@typo3.org>
00202      * @author Robert Lemke <robert@typo3.org>
00203      */
00204     public function selectOnDomainObjectsCreatesExpectedOptions() {
00205         $mockPersistenceBackend = $this->getMock('Tx_Extbase_Persistence_BackendInterface');
00206         $mockPersistenceBackend->expects($this->any())->method('getIdentifierByObject')->will($this->returnValue(NULL));
00207 
00208         $mockPersistenceManager = $this->getMock('Tx_Extbase_Persistence_ManagerInterface');
00209         $mockPersistenceManager->expects($this->any())->method('getBackend')->will($this->returnValue($mockPersistenceBackend));
00210         $this->viewHelper->injectPersistenceManager($mockPersistenceManager);
00211 
00212         $mockTagBuilder = $this->getMock('Tx_Fluid_Core_ViewHelper_TagBuilder', array('addAttribute', 'setContent', 'render'), array(), '', FALSE);
00213         $mockTagBuilder->expects($this->once())->method('addAttribute')->with('name', 'myName');
00214         $this->viewHelper->expects($this->once())->method('registerFieldNameForFormTokenGeneration')->with('myName');
00215         $mockTagBuilder->expects($this->once())->method('setContent')->with('<option value="1">Ingmar</option>' . chr(10) . '<option value="2" selected="selected">Sebastian</option>' . chr(10) . '<option value="3">Robert</option>' . chr(10));
00216         $mockTagBuilder->expects($this->once())->method('render');
00217         $this->viewHelper->_set('tag', $mockTagBuilder);
00218 
00219         $user_is = new Tx_Fluid_ViewHelpers_Fixtures_UserDomainClass(1, 'Ingmar', 'Schlecht');
00220         $user_sk = new Tx_Fluid_ViewHelpers_Fixtures_UserDomainClass(2, 'Sebastian', 'Kurfuerst');
00221         $user_rl = new Tx_Fluid_ViewHelpers_Fixtures_UserDomainClass(3, 'Robert', 'Lemke');
00222 
00223         $arguments = new Tx_Fluid_Core_ViewHelper_Arguments(array(
00224             'options' => array(
00225                 $user_is,
00226                 $user_sk,
00227                 $user_rl
00228             ),
00229             'value' => $user_sk,
00230             'optionValueField' => 'id',
00231             'optionLabelField' => 'firstName',
00232             'name' => 'myName'
00233         ));
00234         $this->viewHelper->setArguments($arguments);
00235 
00236         $this->viewHelper->initialize();
00237         $this->viewHelper->render();
00238     }
00239 
00240     /**
00241      * @test
00242      * @author Bastian Waidelich <bastian@typo3.org>
00243      */
00244     public function multipleSelectOnDomainObjectsCreatesExpectedOptions() {
00245         $mockTagBuilder = $this->getMock('Tx_Fluid_Core_ViewHelper_TagBuilder', array('addAttribute', 'setContent', 'render'), array(), '', FALSE);
00246         $mockTagBuilder->expects($this->at(0))->method('addAttribute')->with('multiple', 'multiple');
00247         $mockTagBuilder->expects($this->at(1))->method('addAttribute')->with('name', 'myName[]');
00248         $this->viewHelper->expects($this->exactly(3))->method('registerFieldNameForFormTokenGeneration')->with('myName[]');
00249         $mockTagBuilder->expects($this->once())->method('setContent')->with('<option value="1" selected="selected">Schlecht</option>' . chr(10) . '<option value="2">Kurfuerst</option>' . chr(10) . '<option value="3" selected="selected">Lemke</option>' . chr(10));
00250         $mockTagBuilder->expects($this->once())->method('render');
00251         $this->viewHelper->_set('tag', $mockTagBuilder);
00252 
00253         $user_is = new Tx_Fluid_ViewHelpers_Fixtures_UserDomainClass(1, 'Ingmar', 'Schlecht');
00254         $user_sk = new Tx_Fluid_ViewHelpers_Fixtures_UserDomainClass(2, 'Sebastian', 'Kurfuerst');
00255         $user_rl = new Tx_Fluid_ViewHelpers_Fixtures_UserDomainClass(3, 'Robert', 'Lemke');
00256 
00257         $arguments = new Tx_Fluid_Core_ViewHelper_Arguments(array(
00258             'options' => array(
00259                 $user_is,
00260                 $user_sk,
00261                 $user_rl
00262             ),
00263             'value' => array($user_rl, $user_is),
00264             'optionValueField' => 'id',
00265             'optionLabelField' => 'lastName',
00266             'name' => 'myName',
00267             'multiple' => 'multiple'
00268         ));
00269         $this->viewHelper->setArguments($arguments);
00270 
00271         $this->viewHelper->initialize();
00272         $this->viewHelper->render();
00273     }
00274 
00275     /**
00276      * @test
00277      * @author Karsten Dambekalns <karsten@typo3.org>
00278      */
00279     public function selectWithoutFurtherConfigurationOnDomainObjectsUsesUuidForValueAndLabel() { $this->markTestIncomplete("This does not work right now due to a renaming in FLOW3.");
00280         $mockPersistenceManager = $this->getMock('Tx_Extbase_Persistence_ManagerInterface');
00281         $mockPersistenceManager->expects($this->any())->method('getIdentifierByObject')->will($this->returnValue('fakeUID'));
00282         $this->viewHelper->injectPersistenceManager($mockPersistenceManager);
00283 
00284         $mockTagBuilder = $this->getMock('Tx_Fluid_Core_ViewHelper_TagBuilder', array('addAttribute', 'setContent', 'render'), array(), '', FALSE);
00285         $mockTagBuilder->expects($this->once())->method('addAttribute')->with('name', 'myName');
00286         $this->viewHelper->expects($this->once())->method('registerFieldNameForFormTokenGeneration')->with('myName');
00287         $mockTagBuilder->expects($this->once())->method('setContent')->with('<option value="fakeUID">fakeUID</option>' . chr(10));
00288         $mockTagBuilder->expects($this->once())->method('render');
00289         $this->viewHelper->_set('tag', $mockTagBuilder);
00290 
00291         $user = new Tx_Fluid_ViewHelpers_Fixtures_UserDomainClass(1, 'Ingmar', 'Schlecht');
00292 
00293         $arguments = new Tx_Fluid_Core_ViewHelper_Arguments(array(
00294             'options' => array(
00295                 $user
00296             ),
00297             'name' => 'myName'
00298         ));
00299         $this->viewHelper->setArguments($arguments);
00300 
00301         $this->viewHelper->initialize();
00302         $this->viewHelper->render();
00303     }
00304 
00305     /**
00306      * @test
00307      * @author Karsten Dambekalns <karsten@typo3.org>
00308      */
00309     public function selectWithoutFurtherConfigurationOnDomainObjectsUsesToStringForLabelIfAvailable() { $this->markTestIncomplete("This does not work right now due to a renaming in FLOW3.");
00310         $mockPersistenceManager = $this->getMock('Tx_Extbase_Persistence_ManagerInterface');
00311         $mockPersistenceManager->expects($this->any())->method('getIdentifierByObject')->will($this->returnValue('fakeUID'));
00312         $this->viewHelper->injectPersistenceManager($mockPersistenceManager);
00313 
00314         $mockTagBuilder = $this->getMock('Tx_Fluid_Core_ViewHelper_TagBuilder', array('addAttribute', 'setContent', 'render'), array(), '', FALSE);
00315         $mockTagBuilder->expects($this->once())->method('addAttribute')->with('name', 'myName');
00316         $this->viewHelper->expects($this->once())->method('registerFieldNameForFormTokenGeneration')->with('myName');
00317         $mockTagBuilder->expects($this->once())->method('setContent')->with('<option value="fakeUID">toStringResult</option>' . chr(10));
00318         $mockTagBuilder->expects($this->once())->method('render');
00319         $this->viewHelper->_set('tag', $mockTagBuilder);
00320 
00321         $user = $this->getMock('Tx_Fluid_ViewHelpers_Fixtures_UserDomainClass', array('__toString'), array(1, 'Ingmar', 'Schlecht'));
00322         $user->expects($this->atLeastOnce())->method('__toString')->will($this->returnValue('toStringResult'));
00323 
00324         $arguments = new Tx_Fluid_Core_ViewHelper_Arguments(array(
00325             'options' => array(
00326                 $user
00327             ),
00328             'name' => 'myName'
00329         ));
00330         $this->viewHelper->setArguments($arguments);
00331 
00332         $this->viewHelper->initialize();
00333         $this->viewHelper->render();
00334     }
00335 
00336     /**
00337      * @test
00338      * @author Karsten Dambekalns <karsten@typo3.org>
00339      * @expectedException Tx_Fluid_Core_ViewHelper_Exception
00340      */
00341     public function selectOnDomainObjectsThrowsExceptionIfNoValueCanBeFound() {
00342         $mockPersistenceBackend = $this->getMock('Tx_Extbase_Persistence_BackendInterface');
00343         $mockPersistenceBackend->expects($this->any())->method('getIdentifierByObject')->will($this->returnValue(NULL));
00344 
00345         $mockPersistenceManager = $this->getMock('Tx_Extbase_Persistence_ManagerInterface');
00346         $mockPersistenceManager->expects($this->any())->method('getBackend')->will($this->returnValue($mockPersistenceBackend));
00347         $this->viewHelper->injectPersistenceManager($mockPersistenceManager);
00348 
00349         $mockTagBuilder = $this->getMock('Tx_Fluid_Core_ViewHelper_TagBuilder', array('addAttribute', 'setContent', 'render'), array(), '', FALSE);
00350         $this->viewHelper->_set('tag', $mockTagBuilder);
00351 
00352         $user = new Tx_Fluid_ViewHelpers_Fixtures_UserDomainClass(1, 'Ingmar', 'Schlecht');
00353 
00354         $arguments = new Tx_Fluid_Core_ViewHelper_Arguments(array(
00355             'options' => array(
00356                 $user
00357             ),
00358             'name' => 'myName'
00359         ));
00360         $this->viewHelper->setArguments($arguments);
00361 
00362         $this->viewHelper->initialize();
00363         $this->viewHelper->render();
00364     }
00365 
00366     /**
00367      * @test
00368      * @author Bastian Waidelich <bastian@typo3.org>
00369      */
00370     public function renderCallsSetErrorClassAttribute() {
00371         $arguments = new Tx_Fluid_Core_ViewHelper_Arguments(array(
00372             'options' => array()
00373         ));
00374         $this->viewHelper->setArguments($arguments);
00375 
00376         $this->viewHelper->expects($this->once())->method('setErrorClassAttribute');
00377         $this->viewHelper->render();
00378     }
00379 
00380     /**
00381      * @test
00382      * @author Bastian Waidelich <bastian@typo3.org>
00383      */
00384     public function allOptionsAreSelectedIfSelectAllIsTrue() {
00385         $mockTagBuilder = $this->getMock('Tx_Fluid_Core_ViewHelper_TagBuilder', array('addAttribute', 'setContent', 'render'), array(), '', FALSE);
00386         $mockTagBuilder->expects($this->once())->method('setContent')->with('<option value="value1" selected="selected">label1</option>' . chr(10) . '<option value="value2" selected="selected">label2</option>' . chr(10) . '<option value="value3" selected="selected">label3</option>' . chr(10));
00387         $this->viewHelper->_set('tag', $mockTagBuilder);
00388 
00389         $arguments = new Tx_Fluid_Core_ViewHelper_Arguments(array(
00390             'options' => array(
00391                 'value1' => 'label1',
00392                 'value2' => 'label2',
00393                 'value3' => 'label3'
00394             ),
00395             'name' => 'myName',
00396             'multiple' => 'multiple',
00397             'selectAllByDefault' => TRUE
00398         ));
00399         $this->viewHelper->setArguments($arguments);
00400 
00401         $this->viewHelper->initialize();
00402         $this->viewHelper->render();
00403     }
00404 
00405     /**
00406      * @test
00407      * @author Bastian Waidelich <bastian@typo3.org>
00408      */
00409     public function selectAllHasNoEffectIfValueIsSet() {
00410         $mockTagBuilder = $this->getMock('Tx_Fluid_Core_ViewHelper_TagBuilder', array('addAttribute', 'setContent', 'render'), array(), '', FALSE);
00411         $mockTagBuilder->expects($this->once())->method('setContent')->with('<option value="value1" selected="selected">label1</option>' . chr(10) . '<option value="value2" selected="selected">label2</option>' . chr(10) . '<option value="value3">label3</option>' . chr(10));
00412         $this->viewHelper->_set('tag', $mockTagBuilder);
00413 
00414         $arguments = new Tx_Fluid_Core_ViewHelper_Arguments(array(
00415             'options' => array(
00416                 'value1' => 'label1',
00417                 'value2' => 'label2',
00418                 'value3' => 'label3'
00419             ),
00420             'value' => array('value2', 'value1'),
00421             'name' => 'myName',
00422             'multiple' => 'multiple',
00423             'selectAllByDefault' => TRUE
00424         ));
00425         $this->viewHelper->setArguments($arguments);
00426 
00427         $this->viewHelper->initialize();
00428         $this->viewHelper->render();
00429     }
00430 }
00431 
00432 ?>