TYPO3 API  SVNRelease
t3lib_formprotection_AbstractTest.php
Go to the documentation of this file.
00001 <?php
00002 /***************************************************************
00003 * Copyright notice
00004 *
00005 * (c) 2010-2011 Oliver Klee (typo3-coding@oliverklee.de)
00006 * All rights reserved
00007 *
00008 * This script is part of the TYPO3 project. The TYPO3 project is
00009 * free software; you can redistribute it and/or modify
00010 * it under the terms of the GNU General Public License as published by
00011 * the Free Software Foundation; either version 2 of the License, or
00012 * (at your option) any later version.
00013 *
00014 * The GNU General Public License can be found at
00015 * http://www.gnu.org/copyleft/gpl.html.
00016 *
00017 * This script is distributed in the hope that it will be useful,
00018 * but WITHOUT ANY WARRANTY; without even the implied warranty of
00019 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00020 * GNU General Public License for more details.
00021 *
00022 * This copyright notice MUST APPEAR in all copies of the script!
00023 ***************************************************************/
00024 
00025 require_once('fixtures/class.t3lib_formprotection_testing.php');
00026 
00027 /**
00028  * Testcase for the t3lib_formprotection_Abstract class.
00029  *
00030  * $Id$
00031  *
00032  * @package TYPO3
00033  * @subpackage t3lib
00034  *
00035  * @author Oliver Klee <typo3-coding@oliverklee.de>
00036  */
00037 class t3lib_formprotection_AbstractTest extends tx_phpunit_testcase {
00038     /**
00039      * @var t3lib_formProtection_Testing
00040      */
00041     private $fixture;
00042 
00043     public function setUp() {
00044         $this->fixture = new t3lib_formProtection_Testing();
00045     }
00046 
00047     public function tearDown() {
00048         $this->fixture->__destruct();
00049         unset($this->fixture);
00050     }
00051 
00052 
00053     /////////////////////////////////////////
00054     // Tests concerning the basic functions
00055     /////////////////////////////////////////
00056 
00057     /**
00058      * @test
00059      */
00060     public function constructionRetrievesTokens() {
00061         $className = uniqid('t3lib_formProtection');
00062         eval(
00063             'class ' . $className . ' extends t3lib_formProtection_Testing {' .
00064                 'public $tokensHaveBeenRetrieved = FALSE; ' .
00065                 'protected function retrieveTokens() {' .
00066                 '$this->tokensHaveBeenRetrieved = TRUE;' .
00067                 '}' .
00068             '}'
00069         );
00070 
00071         $fixture = new $className();
00072 
00073         $this->assertTrue(
00074             $fixture->tokensHaveBeenRetrieved
00075         );
00076     }
00077 
00078     /**
00079      * @test
00080      */
00081     public function cleanMakesTokenInvalid() {
00082         $formName = 'foo';
00083         $tokenId = $this->fixture->generateToken($formName);
00084 
00085         $this->fixture->clean();
00086 
00087         $this->assertFalse(
00088             $this->fixture->validateToken($tokenId, $formName)
00089         );
00090     }
00091 
00092     /**
00093      * @test
00094      */
00095     public function cleanPersistsTokens() {
00096         $fixture = $this->getMock(
00097             't3lib_formProtection_Testing', array('persistTokens')
00098         );
00099         $fixture->expects($this->once())->method('persistTokens');
00100 
00101         $fixture->clean();
00102     }
00103 
00104 
00105     ///////////////////////////////////
00106     // Tests concerning generateToken
00107     ///////////////////////////////////
00108 
00109     /**
00110      * @test
00111      */
00112     public function generateTokenFormForEmptyFormNameThrowsException() {
00113         $this->setExpectedException(
00114             'InvalidArgumentException', '$formName must not be empty.'
00115         );
00116 
00117         $this->fixture->generateToken('', 'edit', 'bar');
00118     }
00119 
00120     /**
00121      * @test
00122      */
00123     public function generateTokenFormForEmptyActionNotThrowsException() {
00124         $this->fixture->generateToken('foo', '', '42');
00125     }
00126 
00127     /**
00128      * @test
00129      */
00130     public function generateTokenFormForEmptyFormInstanceNameNotThrowsException() {
00131         $this->fixture->generateToken('foo', 'edit', '');
00132     }
00133 
00134     /**
00135      * @test
00136      */
00137     public function generateTokenFormForOmittedActionAndFormInstanceNameNotThrowsException() {
00138         $this->fixture->generateToken('foo');
00139     }
00140 
00141     /**
00142      * @test
00143      */
00144     public function generateTokenReturns32CharacterHexToken() {
00145         $this->assertRegexp(
00146             '/^[0-9a-f]{32}$/',
00147             $this->fixture->generateToken('foo')
00148         );
00149     }
00150 
00151     /**
00152      * @test
00153      */
00154     public function generateTokenCalledTwoTimesWithSameParametersReturnsDifferentTokens() {
00155         $this->assertNotEquals(
00156             $this->fixture->generateToken('foo', 'edit', 'bar'),
00157             $this->fixture->generateToken('foo', 'edit', 'bar')
00158         );
00159     }
00160 
00161     /**
00162      * @test
00163      */
00164     public function generatingTooManyTokensInvalidatesOldestToken() {
00165         $this->fixture->setMaximumNumberOfTokens(2);
00166 
00167         $formName = 'foo';
00168 
00169         $token1 = $this->fixture->generateToken($formName);
00170         $token2 = $this->fixture->generateToken($formName);
00171         $token3 = $this->fixture->generateToken($formName);
00172 
00173         $this->assertFalse(
00174             $this->fixture->validateToken($token1, $formName)
00175         );
00176     }
00177 
00178     /**
00179      * @test
00180      */
00181     public function generatingTooManyTokensNotInvalidatesNewestToken() {
00182         $this->fixture->setMaximumNumberOfTokens(2);
00183 
00184         $formName = 'foo';
00185         $formInstanceName = 'bar';
00186 
00187         $token1 = $this->fixture->generateToken($formName);
00188         $token2 = $this->fixture->generateToken($formName);
00189         $token3 = $this->fixture->generateToken($formName);
00190 
00191         $this->assertTrue(
00192             $this->fixture->validateToken($token3, $formName)
00193         );
00194     }
00195 
00196     /**
00197      * @test
00198      */
00199     public function generatingTooManyTokensNotInvalidatesTokenInTheMiddle() {
00200         $this->fixture->setMaximumNumberOfTokens(2);
00201 
00202         $formName = 'foo';
00203         $formInstanceName = 'bar';
00204 
00205         $token1 = $this->fixture->generateToken($formName);
00206         $token2 = $this->fixture->generateToken($formName);
00207         $token3 = $this->fixture->generateToken($formName);
00208 
00209         $this->assertTrue(
00210             $this->fixture->validateToken($token2, $formName)
00211         );
00212     }
00213 
00214 
00215     ///////////////////////////////////
00216     // Tests concerning validateToken
00217     ///////////////////////////////////
00218 
00219     /**
00220      * @test
00221      */
00222     public function validateTokenWithFourEmptyParametersNotThrowsException() {
00223         $this->fixture->validateToken('', '', '', '');
00224     }
00225 
00226     /**
00227      * @test
00228      */
00229     public function validateTokenWithTwoEmptyAndTwoMissingParametersNotThrowsException() {
00230         $this->fixture->validateToken('', '');
00231     }
00232 
00233     /**
00234      * @test
00235      */
00236     public function validateTokenWithDataFromGenerateTokenWithFormInstanceNameReturnsTrue() {
00237         $formName = 'foo';
00238         $action = 'edit';
00239         $formInstanceName = 'bar';
00240 
00241         $this->assertTrue(
00242             $this->fixture->validateToken(
00243                 $this->fixture->generateToken($formName, $action, $formInstanceName),
00244                 $formName,
00245                 $action,
00246                 $formInstanceName
00247             )
00248         );
00249     }
00250 
00251     /**
00252      * @test
00253      */
00254     public function validateTokenWithDataFromGenerateTokenWithMissingActionAndFormInstanceNameReturnsTrue() {
00255         $formName = 'foo';
00256 
00257         $this->assertTrue(
00258             $this->fixture->validateToken(
00259                 $this->fixture->generateToken($formName), $formName
00260             )
00261         );
00262     }
00263 
00264     /**
00265      * @test
00266      */
00267     public function validateTokenWithValidDataDropsToken() {
00268         $formName = 'foo';
00269 
00270         $fixture = $this->getMock(
00271             't3lib_formProtection_Testing', array('dropToken')
00272         );
00273 
00274         $tokenId = $fixture->generateToken($formName);
00275         $fixture->expects($this->once())->method('dropToken')
00276             ->with($tokenId);
00277 
00278         $fixture->validateToken($tokenId, $formName);
00279     }
00280 
00281     /**
00282      * @test
00283      */
00284     public function validateTokenWithValidDataCalledTwoTimesReturnsFalseOnSecondCall() {
00285         $formName = 'foo';
00286         $action = 'edit';
00287         $formInstanceName = 'bar';
00288 
00289         $tokenId = $this->fixture->generateToken($formName, $action, $formInstanceName);
00290 
00291         $this->fixture->validateToken($tokenId, $formName, $action, $formInstanceName);
00292 
00293         $this->assertFalse(
00294             $this->fixture->validateToken($tokenId, $formName, $action, $formInstanceName)
00295         );
00296     }
00297 
00298     /**
00299      * @test
00300      */
00301     public function validateTokenWithMismatchingTokenIdReturnsFalse() {
00302         $formName = 'foo';
00303         $action = 'edit';
00304         $formInstanceName = 'bar';
00305 
00306         $this->fixture->generateToken($formName, $action, $formInstanceName);
00307 
00308         $this->assertFalse(
00309             $this->fixture->validateToken(
00310                 'Hello world!', $formName, $action, $formInstanceName
00311             )
00312         );
00313     }
00314 
00315     /**
00316      * @test
00317      */
00318     public function validateTokenWithMismatchingFormNameReturnsFalse() {
00319         $formName = 'foo';
00320         $action = 'edit';
00321         $formInstanceName = 'bar';
00322 
00323         $tokenId = $this->fixture->generateToken($formName, $action, $formInstanceName);
00324 
00325         $this->assertFalse(
00326             $this->fixture->validateToken(
00327                 $tokenId, 'espresso', $action, $formInstanceName
00328             )
00329         );
00330     }
00331 
00332     /**
00333      * @test
00334      */
00335     public function validateTokenWithMismatchingActionReturnsFalse() {
00336         $formName = 'foo';
00337         $action = 'edit';
00338         $formInstanceName = 'bar';
00339 
00340         $tokenId = $this->fixture->generateToken($formName, $action, $formInstanceName);
00341 
00342         $this->assertFalse(
00343             $this->fixture->validateToken(
00344                 $tokenId, $formName, 'delete', $formInstanceName
00345             )
00346         );
00347     }
00348 
00349     /**
00350      * @test
00351      */
00352     public function validateTokenWithMismatchingFormInstanceNameReturnsFalse() {
00353         $formName = 'foo';
00354         $action = 'edit';
00355         $formInstanceName = 'bar';
00356 
00357         $tokenId = $this->fixture->generateToken($formName, $action, $formInstanceName);
00358 
00359         $this->assertFalse(
00360             $this->fixture->validateToken(
00361                 $tokenId, $formName, $action, 'beer'
00362             )
00363         );
00364     }
00365 
00366     /**
00367      * @test
00368      */
00369     public function validateTokenWithTwoTokensForSameFormNameAndActionAndFormInstanceNameReturnsTrueForBoth() {
00370         $formName = 'foo';
00371         $action = 'edit';
00372         $formInstanceName = 'bar';
00373 
00374         $tokenId1 = $this->fixture->generateToken($formName, $action, $formInstanceName);
00375         $tokenId2 = $this->fixture->generateToken($formName, $action, $formInstanceName);
00376 
00377         $this->assertTrue(
00378             $this->fixture->validateToken(
00379                 $tokenId1, $formName, $action, $formInstanceName
00380             )
00381         );
00382         $this->assertTrue(
00383             $this->fixture->validateToken(
00384                 $tokenId2, $formName, $action, $formInstanceName
00385             )
00386         );
00387     }
00388 
00389     /**
00390      * @test
00391      */
00392     public function validateTokenWithTwoTokensForSameFormNameAndActionAndFormInstanceNameCalledInReverseOrderReturnsTrueForBoth() {
00393         $formName = 'foo';
00394         $action = 'edit';
00395         $formInstanceName = 'bar';
00396 
00397         $tokenId1 = $this->fixture->generateToken($formName, $action, $formInstanceName);
00398         $tokenId2 = $this->fixture->generateToken($formName, $action, $formInstanceName);
00399 
00400         $this->assertTrue(
00401             $this->fixture->validateToken(
00402                 $tokenId2, $formName, $action, $formInstanceName
00403             )
00404         );
00405         $this->assertTrue(
00406             $this->fixture->validateToken(
00407                 $tokenId1, $formName, $action, $formInstanceName
00408             )
00409         );
00410     }
00411 
00412     /**
00413      * @test
00414      */
00415     public function validateTokenForValidTokenNotCallsCreateValidationErrorMessage() {
00416         $fixture = $this->getMock(
00417             't3lib_formProtection_Testing', array('createValidationErrorMessage')
00418         );
00419         $fixture->expects($this->never())->method('createValidationErrorMessage');
00420 
00421         $formName = 'foo';
00422         $action = 'edit';
00423         $formInstanceName = 'bar';
00424 
00425         $token = $fixture->generateToken($formName, $action, $formInstanceName);
00426         $fixture->validateToken(
00427             $token, $formName, $action, $formInstanceName
00428         );
00429 
00430         $fixture->__destruct();
00431     }
00432 
00433     /**
00434      * @test
00435      */
00436     public function validateTokenForInvalidTokenCallsCreateValidationErrorMessage() {
00437         $fixture = $this->getMock(
00438             't3lib_formProtection_Testing', array('createValidationErrorMessage')
00439         );
00440         $fixture->expects($this->once())->method('createValidationErrorMessage');
00441 
00442         $formName = 'foo';
00443         $action = 'edit';
00444         $formInstanceName = 'bar';
00445 
00446         $fixture->generateToken($formName, $action, $formInstanceName);
00447         $fixture->validateToken(
00448             'an invalid token ...', $formName, $action, $formInstanceName
00449         );
00450 
00451         $fixture->__destruct();
00452     }
00453 
00454     /**
00455      * @test
00456      */
00457     public function validateTokenForInvalidFormNameCallsCreateValidationErrorMessage() {
00458         $fixture = $this->getMock(
00459             't3lib_formProtection_Testing', array('createValidationErrorMessage')
00460         );
00461         $fixture->expects($this->once())->method('createValidationErrorMessage');
00462 
00463         $formName = 'foo';
00464         $action = 'edit';
00465         $formInstanceName = 'bar';
00466 
00467         $token = $fixture->generateToken($formName, $action, $formInstanceName);
00468         $fixture->validateToken(
00469             $token, 'another form name', $action, $formInstanceName
00470         );
00471 
00472         $fixture->__destruct();
00473     }
00474 }
00475 ?>