TYPO3 API  SVNRelease
AbstractConfigurationManagerTest.php
Go to the documentation of this file.
00001 <?php
00002 /***************************************************************
00003 *  Copyright notice
00004 *
00005 *  All rights reserved
00006 *
00007 *  This class is a backport of the corresponding class of FLOW3.
00008 *  All credits go to the v5 team.
00009 *
00010 *  This script is part of the TYPO3 project. The TYPO3 project is
00011 *  free software; you can redistribute it and/or modify
00012 *  it under the terms of the GNU General Public License as published by
00013 *  the Free Software Foundation; either version 2 of the License, or
00014 *  (at your option) any later version.
00015 *
00016 *  The GNU General Public License can be found at
00017 *  http://www.gnu.org/copyleft/gpl.html.
00018 *
00019 *  This script is distributed in the hope that it will be useful,
00020 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00021 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00022 *  GNU General Public License for more details.
00023 *
00024 *  This copyright notice MUST APPEAR in all copies of the script!
00025 ***************************************************************/
00026 
00027 class Tx_Extbase_Tests_Unit_Configuration_AbstractConfigurationManagerTest extends Tx_Extbase_Tests_Unit_BaseTestCase {
00028 
00029     /**
00030      * @var Tx_Extbase_Configuration_AbstractConfigurationManager
00031      */
00032     protected $abstractConfigurationManager;
00033 
00034     /**
00035      * @var array
00036      */
00037     protected $testTypoScriptSetup = array(
00038         'foo.' => array(
00039             'bar' => 'baz'
00040         ),
00041         'config.' => array(
00042             'tx_extbase.' => array(
00043                 'settings.' => array(
00044                     'setting1' => 'value1',
00045                     'setting2' => 'value2',
00046                 ),
00047                 'view.' => array(
00048                     'viewSub.' => array(
00049                         'key1' => 'value1',
00050                         'key2' => 'value2',
00051                     )
00052                 )
00053             ),
00054         ),
00055     );
00056 
00057     /**
00058      * @var array
00059      */
00060     protected $testPluginConfiguration = array(
00061         'settings' => array(
00062             'setting1' => 'overriddenValue1',
00063             'setting3' => 'additionalValue',
00064         ),
00065         'view' => array(
00066             'viewSub' => array(
00067                 'key1' => 'overridden',
00068                 'key3' => 'new key',
00069             )
00070         ),
00071         'persistence' => array(
00072             'storagePid' => '123',
00073         )
00074     );
00075 
00076     /**
00077      * @var array
00078      */
00079     protected $testSwitchableControllerActions = array(
00080         'Controller1' => array(
00081             'actions' => array('action1', 'action2', 'action3')
00082         ),
00083         'Controller2' => array(
00084             'actions' => array('action4', 'action5', 'action6'),
00085             'nonCacheableActions' => array('action4', 'action6'),
00086         ),
00087     );
00088 
00089     /**
00090      * Sets up this testcase
00091      */
00092     public function setUp() {
00093         $this->abstractConfigurationManager = $this->getAccessibleMock('Tx_Extbase_Configuration_AbstractConfigurationManager', array('getContextSpecificFrameworkConfiguration', 'getTypoScriptSetup', 'getPluginConfiguration', 'getSwitchableControllerActions'));
00094     }
00095 
00096     /**
00097      * @test
00098      */
00099     public function setConfigurationResetsConfigurationCache() {
00100         $this->abstractConfigurationManager->_set('configurationCache', array('foo' => 'bar'));
00101         $this->abstractConfigurationManager->setConfiguration(array());
00102         $this->assertEquals(array(), $this->abstractConfigurationManager->_get('configurationCache'));
00103     }
00104 
00105     /**
00106      * @test
00107      */
00108     public function setConfigurationSetsExtensionAndPluginName() {
00109         $configuration = array(
00110             'extensionName' => 'SomeExtensionName',
00111             'pluginName' => 'SomePluginName',
00112         );
00113         $this->abstractConfigurationManager->setConfiguration($configuration);
00114         $this->assertEquals('SomeExtensionName', $this->abstractConfigurationManager->_get('extensionName'));
00115         $this->assertEquals('SomePluginName', $this->abstractConfigurationManager->_get('pluginName'));
00116     }
00117 
00118     /**
00119      * @test
00120      */
00121     public function setConfigurationConvertsTypoScriptArrayToPlainArray() {
00122         $configuration = array(
00123             'foo' => 'bar',
00124             'settings.' => array('foo' => 'bar'),
00125             'view.' => array('subkey.' => array('subsubkey' => 'subsubvalue'))
00126         );
00127         $expectedResult = array(
00128             'foo' => 'bar',
00129             'settings' => array('foo' => 'bar'),
00130             'view' => array('subkey' => array('subsubkey' => 'subsubvalue'))
00131         );
00132         $this->abstractConfigurationManager->setConfiguration($configuration);
00133         $this->assertEquals($expectedResult, $this->abstractConfigurationManager->_get('configuration'));
00134     }
00135 
00136     /**
00137      * @test
00138      * @expectedException Tx_Extbase_Configuration_Exception
00139      */
00140     public function getConfigurationThrowsExceptionIfOnlyExtensionNameIsSpecified() {
00141         $this->abstractConfigurationManager->getConfiguration('SomeExtensionName');
00142     }
00143 
00144     /**
00145      * @test
00146      */
00147     public function getConfigurationReturnsCachedResultOfCurrentPlugin() {
00148         $this->abstractConfigurationManager->_set('extensionName', 'CurrentExtensionName');
00149         $this->abstractConfigurationManager->_set('pluginName', 'CurrentPluginName');
00150         $this->abstractConfigurationManager->_set('configurationCache', array('currentextensionname_currentpluginname' => array('foo' => 'bar'), 'someotherextension_somepluginname' => array('baz' => 'shouldnotbereturned')));
00151         $expectedResult = array('foo' => 'bar');
00152         $actualResult = $this->abstractConfigurationManager->getConfiguration();
00153         $this->assertEquals($expectedResult, $actualResult);
00154     }
00155 
00156     /**
00157      * @test
00158      */
00159     public function getConfigurationReturnsCachedResultForGivenExtension() {
00160         $this->abstractConfigurationManager->_set('configurationCache', array('someextensionname_somepluginname' => array('foo' => 'bar'), 'someotherextension_somepluginname' => array('baz' => 'shouldnotbereturned')));
00161         $expectedResult = array('foo' => 'bar');
00162         $actualResult = $this->abstractConfigurationManager->getConfiguration('SomeExtensionName', 'SomePluginName');
00163         $this->assertEquals($expectedResult, $actualResult);
00164     }
00165 
00166     /**
00167      * @test
00168      */
00169     public function getConfigurationRecursivelyMergesCurrentPluginConfigurationWithFrameworkConfiguration() {
00170         $this->abstractConfigurationManager->_set('extensionName', 'CurrentExtensionName');
00171         $this->abstractConfigurationManager->_set('pluginName', 'CurrentPluginName');
00172         $this->abstractConfigurationManager->expects($this->once())->method('getTypoScriptSetup')->will($this->returnValue($this->testTypoScriptSetup));
00173         $this->abstractConfigurationManager->expects($this->once())->method('getPluginConfiguration')->with('CurrentExtensionName', 'CurrentPluginName')->will($this->returnValue($this->testPluginConfiguration));
00174         $expectedResult = array(
00175             'settings' => array(
00176                 'setting1' => 'overriddenValue1',
00177                 'setting2' => 'value2',
00178                 'setting3' => 'additionalValue',
00179             ),
00180             'view' => array(
00181                 'viewSub' => array(
00182                     'key1' => 'overridden',
00183                     'key2' => 'value2',
00184                     'key3' => 'new key',
00185                 )
00186             ),
00187             'persistence' => array(
00188                 'storagePid' => '123',
00189             ),
00190             'controllerConfiguration' => NULL
00191         );
00192         $this->abstractConfigurationManager->expects($this->once())->method('getContextSpecificFrameworkConfiguration')->with($expectedResult)->will($this->returnValue($expectedResult));
00193         $actualResult = $this->abstractConfigurationManager->getConfiguration();
00194         $this->assertEquals($expectedResult, $actualResult);
00195     }
00196 
00197     /**
00198      * @test
00199      */
00200     public function getConfigurationRecursivelyMergesPluginConfigurationOfSpecifiedPluginWithFrameworkConfiguration() {
00201         $this->abstractConfigurationManager->expects($this->once())->method('getTypoScriptSetup')->will($this->returnValue($this->testTypoScriptSetup));
00202         $this->abstractConfigurationManager->expects($this->once())->method('getPluginConfiguration')->with('SomeExtensionName', 'SomePluginName')->will($this->returnValue($this->testPluginConfiguration));
00203         $expectedResult = array(
00204             'settings' => array(
00205                 'setting1' => 'overriddenValue1',
00206                 'setting2' => 'value2',
00207                 'setting3' => 'additionalValue',
00208             ),
00209             'view' => array(
00210                 'viewSub' => array(
00211                     'key1' => 'overridden',
00212                     'key2' => 'value2',
00213                     'key3' => 'new key',
00214                 )
00215             ),
00216             'persistence' => array(
00217                 'storagePid' => '123',
00218             ),
00219             'controllerConfiguration' => NULL
00220         );
00221         $this->abstractConfigurationManager->expects($this->never())->method('getContextSpecificFrameworkConfiguration');
00222         $actualResult = $this->abstractConfigurationManager->getConfiguration('SomeExtensionName', 'SomePluginName');
00223         $this->assertEquals($expectedResult, $actualResult);
00224     }
00225 
00226     /**
00227      * @test
00228      */
00229     public function getConfigurationDoesNotOverrideConfigurationWithContextSpecificFrameworkConfigurationIfDifferentPluginIsSpecified() {
00230         $this->abstractConfigurationManager->expects($this->never())->method('getContextSpecificFrameworkConfiguration');
00231         $this->abstractConfigurationManager->getConfiguration('SomeExtensionName', 'SomePluginName');
00232     }
00233 
00234     /**
00235      * @test
00236      */
00237     public function getConfigurationOverridesConfigurationWithContextSpecificFrameworkConfigurationIfNoPluginWasSpecified() {
00238         $this->abstractConfigurationManager->expects($this->once())->method('getTypoScriptSetup')->will($this->returnValue($this->testTypoScriptSetup));
00239         $this->abstractConfigurationManager->expects($this->once())->method('getPluginConfiguration')->with()->will($this->returnValue($this->testPluginConfiguration));
00240         $contextSpecifixFrameworkConfiguration = array(
00241             'context' => array(
00242                 'specific' => 'framwork',
00243                 'conf' => 'iguration',
00244             ),
00245         );
00246         $this->abstractConfigurationManager->expects($this->once())->method('getContextSpecificFrameworkConfiguration')->will($this->returnValue($contextSpecifixFrameworkConfiguration));
00247         $actualResult = $this->abstractConfigurationManager->getConfiguration();
00248         $this->assertEquals($contextSpecifixFrameworkConfiguration, $actualResult);
00249     }
00250 
00251     /**
00252      * @test
00253      */
00254     public function getConfigurationOverridesConfigurationWithContextSpecificFrameworkConfigurationIfSpecifiedPluginIsTheCurrentPlugin() {
00255         $this->abstractConfigurationManager->_set('extensionName', 'CurrentExtensionName');
00256         $this->abstractConfigurationManager->_set('pluginName', 'CurrentPluginName');
00257         $this->abstractConfigurationManager->expects($this->once())->method('getTypoScriptSetup')->will($this->returnValue($this->testTypoScriptSetup));
00258         $this->abstractConfigurationManager->expects($this->once())->method('getPluginConfiguration')->with('CurrentExtensionName', 'CurrentPluginName')->will($this->returnValue($this->testPluginConfiguration));
00259         $contextSpecifixFrameworkConfiguration = array(
00260             'context' => array(
00261                 'specific' => 'framwork',
00262                 'conf' => 'iguration',
00263             ),
00264         );
00265         $this->abstractConfigurationManager->expects($this->once())->method('getContextSpecificFrameworkConfiguration')->will($this->returnValue($contextSpecifixFrameworkConfiguration));
00266         $actualResult = $this->abstractConfigurationManager->getConfiguration('CurrentExtensionName', 'CurrentPluginName');
00267         $this->assertEquals($contextSpecifixFrameworkConfiguration, $actualResult);
00268     }
00269 
00270     /**
00271      * @test
00272      */
00273     public function getConfigurationStoresResultInConfigurationCache() {
00274         $this->abstractConfigurationManager->_set('extensionName', 'CurrentExtensionName');
00275         $this->abstractConfigurationManager->_set('pluginName', 'CurrentPluginName');
00276         $this->abstractConfigurationManager->expects($this->any())->method('getPluginConfiguration')->will($this->returnValue(array('foo' => 'bar')));
00277         $this->abstractConfigurationManager->getConfiguration();
00278         $this->abstractConfigurationManager->getConfiguration('SomeOtherExtensionName', 'SomeOtherCurrentPluginName');
00279         $expectedResult = array('currentextensionname_currentpluginname', 'someotherextensionname_someothercurrentpluginname');
00280         $actualResult = array_keys($this->abstractConfigurationManager->_get('configurationCache'));
00281         $this->assertEquals($expectedResult, $actualResult);
00282     }
00283 
00284     /** switchableControllerActions **/
00285 
00286     /**
00287      * @test
00288      */
00289     public function switchableControllerActionsAreNotOverriddenIfPluginNameIsSpecified() {
00290         $abstractConfigurationManager = $this->getAccessibleMock('Tx_Extbase_Configuration_AbstractConfigurationManager', array('overrideSwitchableControllerActions', 'getContextSpecificFrameworkConfiguration', 'getTypoScriptSetup', 'getPluginConfiguration', 'getSwitchableControllerActions'));
00291         $abstractConfigurationManager->setConfiguration(array('switchableControllerActions' => array('overriddenSwitchableControllerActions')));
00292         $abstractConfigurationManager->expects($this->any())->method('getPluginConfiguration')->will($this->returnValue(array()));
00293         $abstractConfigurationManager->expects($this->never())->method('overrideSwitchableControllerActions');
00294         $abstractConfigurationManager->getConfiguration('SomeExtensionName', 'SomePluginName');
00295     }
00296 
00297     /**
00298      * @test
00299      */
00300     public function switchableControllerActionsAreOverriddenIfSpecifiedPluginIsTheCurrentPlugin() {
00301         $abstractConfigurationManager = $this->getAccessibleMock('Tx_Extbase_Configuration_AbstractConfigurationManager', array('overrideSwitchableControllerActions', 'getContextSpecificFrameworkConfiguration', 'getTypoScriptSetup', 'getPluginConfiguration', 'getSwitchableControllerActions'));
00302         $abstractConfigurationManager->setConfiguration(array('extensionName' => 'CurrentExtensionName', 'pluginName' => 'CurrentPluginName', 'switchableControllerActions' => array('overriddenSwitchableControllerActions')));
00303         $abstractConfigurationManager->expects($this->any())->method('getPluginConfiguration')->will($this->returnValue(array()));
00304         $abstractConfigurationManager->expects($this->once())->method('overrideSwitchableControllerActions');
00305         $abstractConfigurationManager->getConfiguration('CurrentExtensionName', 'CurrentPluginName');
00306     }
00307 
00308     /**
00309      * @test
00310      */
00311     public function switchableControllerActionsAreOverriddenIfPluginNameIsNotSpecified() {
00312         $abstractConfigurationManager = $this->getAccessibleMock('Tx_Extbase_Configuration_AbstractConfigurationManager', array('overrideSwitchableControllerActions', 'getContextSpecificFrameworkConfiguration', 'getTypoScriptSetup', 'getPluginConfiguration', 'getSwitchableControllerActions'));
00313         $abstractConfigurationManager->setConfiguration(array('switchableControllerActions' => array('overriddenSwitchableControllerActions')));
00314         $abstractConfigurationManager->expects($this->any())->method('getPluginConfiguration')->will($this->returnValue(array()));
00315         $abstractConfigurationManager->expects($this->once())->method('overrideSwitchableControllerActions');
00316         $abstractConfigurationManager->getConfiguration();
00317     }
00318 
00319     /**
00320      * @test
00321      */
00322     public function orderOfActionsCanBeOverriddenForCurrentPlugin() {
00323         $configuration = array(
00324             'extensionName' => 'CurrentExtensionName',
00325             'pluginName' => 'CurrentPluginName',
00326             'switchableControllerActions' => array(
00327                 'Controller1' => array('action2', 'action1', 'action3'),
00328             )
00329         );
00330         $this->abstractConfigurationManager->setConfiguration($configuration);
00331         $this->abstractConfigurationManager->expects($this->once())->method('getPluginConfiguration')->with('CurrentExtensionName', 'CurrentPluginName')->will($this->returnValue($this->testPluginConfiguration));
00332         $this->abstractConfigurationManager->expects($this->once())->method('getSwitchableControllerActions')->with('CurrentExtensionName', 'CurrentPluginName')->will($this->returnValue($this->testSwitchableControllerActions));
00333         $this->abstractConfigurationManager->expects($this->once())->method('getContextSpecificFrameworkConfiguration')->will($this->returnCallBack(create_function('$a', 'return $a;')));
00334         $mergedConfiguration = $this->abstractConfigurationManager->getConfiguration();
00335         $expectedResult = array(
00336             'Controller1' => array(
00337                 'actions' => array('action2', 'action1', 'action3'),
00338             ),
00339         );
00340         $actualResult = $mergedConfiguration['controllerConfiguration'];
00341         $this->assertEquals($expectedResult, $actualResult);
00342     }
00343 
00344     /**
00345      * @test
00346      */
00347     public function newActionsCanBeAddedForCurrentPlugin() {
00348         $configuration = array(
00349             'extensionName' => 'CurrentExtensionName',
00350             'pluginName' => 'CurrentPluginName',
00351             'switchableControllerActions' => array(
00352                 'Controller1' => array('action2', 'action1', 'action3', 'newAction'),
00353             )
00354         );
00355         $this->abstractConfigurationManager->setConfiguration($configuration);
00356         $this->abstractConfigurationManager->expects($this->once())->method('getPluginConfiguration')->with('CurrentExtensionName', 'CurrentPluginName')->will($this->returnValue($this->testPluginConfiguration));
00357         $this->abstractConfigurationManager->expects($this->once())->method('getSwitchableControllerActions')->with('CurrentExtensionName', 'CurrentPluginName')->will($this->returnValue($this->testSwitchableControllerActions));
00358         $this->abstractConfigurationManager->expects($this->once())->method('getContextSpecificFrameworkConfiguration')->will($this->returnCallBack(create_function('$a', 'return $a;')));
00359         $mergedConfiguration = $this->abstractConfigurationManager->getConfiguration();
00360         $expectedResult = array(
00361             'Controller1' => array(
00362                 'actions' => array('action2', 'action1', 'action3', 'newAction'),
00363             ),
00364         );
00365         $actualResult = $mergedConfiguration['controllerConfiguration'];
00366         $this->assertEquals($expectedResult, $actualResult);
00367     }
00368 
00369     /**
00370      * @test
00371      */
00372     public function controllersCanNotBeOverridden() {
00373         $configuration = array(
00374             'extensionName' => 'CurrentExtensionName',
00375             'pluginName' => 'CurrentPluginName',
00376             'switchableControllerActions' => array(
00377                 'NewController' => array('action1', 'action2'),
00378             )
00379         );
00380         $this->abstractConfigurationManager->setConfiguration($configuration);
00381         $this->abstractConfigurationManager->expects($this->once())->method('getPluginConfiguration')->with('CurrentExtensionName', 'CurrentPluginName')->will($this->returnValue($this->testPluginConfiguration));
00382         $this->abstractConfigurationManager->expects($this->once())->method('getSwitchableControllerActions')->with('CurrentExtensionName', 'CurrentPluginName')->will($this->returnValue($this->testSwitchableControllerActions));
00383         $this->abstractConfigurationManager->expects($this->once())->method('getContextSpecificFrameworkConfiguration')->will($this->returnCallBack(create_function('$a', 'return $a;')));
00384         $mergedConfiguration = $this->abstractConfigurationManager->getConfiguration();
00385         $expectedResult = array();
00386         $actualResult = $mergedConfiguration['controllerConfiguration'];
00387         $this->assertEquals($expectedResult, $actualResult);
00388     }
00389 
00390     /**
00391      * @test
00392      */
00393     public function cachingOfActionsCanNotBeChanged() {
00394         $configuration = array(
00395             'extensionName' => 'CurrentExtensionName',
00396             'pluginName' => 'CurrentPluginName',
00397             'switchableControllerActions' => array(
00398                 'Controller1' => array('newAction', 'action1'),
00399                 'Controller2' => array('newAction2', 'action4', 'action5'),
00400             )
00401         );
00402         $this->abstractConfigurationManager->setConfiguration($configuration);
00403         $this->abstractConfigurationManager->expects($this->once())->method('getPluginConfiguration')->with('CurrentExtensionName', 'CurrentPluginName')->will($this->returnValue($this->testPluginConfiguration));
00404         $this->abstractConfigurationManager->expects($this->once())->method('getSwitchableControllerActions')->with('CurrentExtensionName', 'CurrentPluginName')->will($this->returnValue($this->testSwitchableControllerActions));
00405         $this->abstractConfigurationManager->expects($this->once())->method('getContextSpecificFrameworkConfiguration')->will($this->returnCallBack(create_function('$a', 'return $a;')));
00406         $mergedConfiguration = $this->abstractConfigurationManager->getConfiguration();
00407         $expectedResult = array(
00408             'Controller1' => array(
00409                 'actions' => array('newAction', 'action1')
00410             ),
00411             'Controller2' => array(
00412                 'actions' => array('newAction2', 'action4', 'action5'),
00413                 'nonCacheableActions' => array('action4'),
00414             )
00415         );
00416         $actualResult = $mergedConfiguration['controllerConfiguration'];
00417         $this->assertEquals($expectedResult, $actualResult);
00418     }
00419 
00420     /**
00421      * @test
00422      */
00423     public function setStoragePidWithStdWrap() {
00424 
00425         unset($this->abstractConfigurationManager);
00426         $this->abstractConfigurationManager = $this->getMock('Tx_Extbase_Configuration_AbstractConfigurationManager', array('getSwitchableControllerActions', 'getContextSpecificFrameworkConfiguration', 'getTypoScriptSetup', 'getPluginConfiguration'));
00427 
00428         $pluginConfiguration = $this->testPluginConfiguration;
00429         $pluginConfiguration['persistence']['storagePid'] = array(
00430             'cObject' => array(
00431                 'value' => '8,3',
00432                 '_typoScriptNodeValue' => 'TEXT'
00433             )
00434         );
00435 
00436         $this->abstractConfigurationManager->expects($this->once())->method('getTypoScriptSetup')->will($this->returnValue($this->testTypoScriptSetup));
00437         $this->abstractConfigurationManager->expects($this->once())->method('getPluginConfiguration')->with('CurrentExtensionName', 'CurrentPluginName')->will($this->returnValue($pluginConfiguration));
00438         $this->abstractConfigurationManager->expects($this->once())->method('getSwitchableControllerActions')->with('CurrentExtensionName', 'CurrentPluginName')->will($this->returnValue(NULL));
00439 
00440         $expectedResult = array(
00441             'settings' => array(
00442                 'setting1' => 'overriddenValue1',
00443                 'setting2' => 'value2',
00444                 'setting3' => 'additionalValue',
00445             ),
00446             'view' => array(
00447                 'viewSub' => array(
00448                     'key1' => 'overridden',
00449                     'key2' => 'value2',
00450                     'key3' => 'new key',
00451                 )
00452             ),
00453             'persistence' => array(
00454                 'storagePid' => '8,3',
00455             ),
00456             'controllerConfiguration' => NULL
00457         );
00458 
00459         $actualResult = $this->abstractConfigurationManager->getConfiguration('CurrentExtensionName', 'CurrentPluginName');
00460         $this->assertEquals($expectedResult, $actualResult);
00461     }
00462 }
00463 ?>