      1: <?php
      2:
      3: /**
      4:  *
      5:  * Test cases for the AlphaController class.
      6:  *
      7:  * @package alpha::tests
      8:  * @since 1.0
      9:  * @author John Collins <dev@alphaframework.org>
     10:  * @version $Id: FrontController_Test.php 1548 2012-07-29 17:07:07Z alphadevx $
     11:  * @license http://www.opensource.org/licenses/bsd-license.php The BSD License
     12:  * @copyright Copyright (c) 2012, John Collins (founder of Alpha Framework).
     13:  * All rights reserved.
     14:  *
     15:  * <pre>
     16:  * Redistribution and use in source and binary forms, with or
     17:  * without modification, are permitted provided that the
     18:  * following conditions are met:
     19:  *
     20:  * * Redistributions of source code must retain the above
     21:  *   copyright notice, this list of conditions and the
     22:  *   following disclaimer.
     23:  * * Redistributions in binary form must reproduce the above
     24:  *   copyright notice, this list of conditions and the
     25:  *   following disclaimer in the documentation and/or other
     26:  *   materials provided with the distribution.
     27:  * * Neither the name of the Alpha Framework nor the names
     28:  *   of its contributors may be used to endorse or promote
     29:  *   products derived from this software without specific
     30:  *   prior written permission.
     31:  *
     32:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
     33:  * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
     34:  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     35:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     36:  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
     37:  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     38:  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     39:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     40:  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     41:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     42:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     43:  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     44:  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     45:  * </pre>
     46:  *
     47:  */
     48: class FrontController_Test extends PHPUnit_Framework_TestCase {
     49:     /**
     50:      * A controller token to test with
     51:      *
     52:      * @var string
     53:      * @since 1.0
     54:      */
     55:     private $token;
     56:
     57:     /**
     58:      * (non-PHPdoc)
     59:      * @see alpha/lib/PEAR/PHPUnit-3.2.9/PHPUnit/Framework/PHPUnit_Framework_TestCase::setUp()
     60:      *
     61:      * @since 1.0
     62:      */
     63:     protected function setUp() {
     64:         if(!isset($this->token))
     65:             $this->token = $_GET['tk'];
     66:         $_GET['tk'] = null;
     67:         $_GET['act'] = null;
     68:     }
     69:
     70:     /**
     71:      * (non-PHPdoc)
     72:      * @see alpha/lib/PEAR/PHPUnit-3.2.9/PHPUnit/Framework/PHPUnit_Framework_TestCase::tearDown()
     73:      *
     74:      * @since 1.0
     75:      */
     76:     protected function tearDown() {
     77:         $_GET['tk'] = $this->token;
     78:     }
     79:
     80:     /**
     81:      * Testing that the constructor will detect the page controller action we want to invoke from the global _GET array
     82:      *
     83:      * @since 1.0
     84:      */
     85:     public function testConstructActParam() {
     86:         $_GET['act'] = 'ViewArticle';
     87:         $front = new FrontController();
     88:
     89:         $this->assertEquals('ViewArticle', $front->getPageController(), 'testing that the constructor will detect the page controller action we want to invoke from the global _GET array');
     90:     }
     91:
     92:     /**
     93:      * Testing that the constructor can parse the correct page controller action from a mod_rewrite style URL
     94:      *
     95:      * @since 1.0
     96:      */
     97:     public function testConstructModRewrite() {
     98:         global $config;
     99:
    100:         $request = $config->get('app.url').'ViewArticleTitle/title/Test_Title';
    101:         $_SERVER['REQUEST_URI'] = str_replace('http://'.$_SERVER['HTTP_HOST'], '', $request);
    102:         $front = new FrontController();
    103:
    104:         $this->assertEquals('ViewArticleTitle', $front->getPageController(), 'testing that the constructor can parse the correct page controller action from a mod_rewrite style URL');
    105:     }
    106:
    107:     /**
    108:      * Testing that the constructor can parse the correct page controller action from a mod_rewrite style URL when a controller alias is used
    109:      *
    110:      * @since 1.0
    111:      */
    112:     public function testConstructModRewriteWithAlias() {
    113:         global $config;
    114:
    115:         $request = $config->get('app.url').'article/Test_Title';
    116:         $_SERVER['REQUEST_URI'] = str_replace('http://'.$_SERVER['HTTP_HOST'], '', $request);
    117:         $front = new FrontController();
    118:         $front->registerAlias('ViewArticleTitle','article','title');
    119:
    120:         $this->assertEquals('ViewArticleTitle', $front->getPageController(), 'testing that the constructor can parse the correct page controller action from a mod_rewrite style URL when a controller alias is used');
    121:     }
    122:
    123:     /**
    124:      * Testing that the constructor can parse the correct page controller action from an encrypted token param
    125:      *
    126:      * @since 1.0
    127:      */
    128:     public function testConstructorWithEncryptedToken() {
    129:         global $config;
    130:
    131:         $params = 'act=ViewArticleTitle&title=Test_Title';
    132:         $_GET['tk'] = FrontController::encodeQuery($params);
    133:         $front = new FrontController();
    134:
    135:         $this->assertEquals('ViewArticleTitle', $front->getPageController(), 'testing that the constructor can parse the correct page controller action from an encrypted token param');
    136:     }
    137:
    138:     /**
    139:      * Testing that the constructor can parse the correct page controller action from an encrypted token param provided on a mod-rewrite style URL
    140:      *
    141:      * @since 1.0
    142:      */
    143:     public function testConstructorModRewriteWithEncryptedToken() {
    144:         global $config;
    145:
    146:         $params = 'act=ViewArticleTitle&title=Test_Title';
    147:         $request = $config->get('app.url').'tk/'.FrontController::encodeQuery($params);
    148:         $_SERVER['REQUEST_URI'] = str_replace('http://'.$_SERVER['HTTP_HOST'], '', $request);
    149:         $front = new FrontController();
    150:
    151:         $this->assertEquals('ViewArticleTitle', $front->getPageController(), 'testing that the constructor can parse the correct page controller action from an encrypted token param provided on a mod-rewrite style URL');
    152:     }
    153:
    154:     /**
    155:      * Testing the encodeQuery method with a known encrypted result for a test key
    156:      *
    157:      * @since 1.0
    158:      */
    159:     public function testEncodeQuery() {
    160:         global $config;
    161:
    162:         $oldKey = $config->get('security.query.string.key');
    163:         $config->set('security.query.string.key', 'testkey');
    164:         $params = 'act=ViewArticleTitle&title=Test_Title';
    165:
    166:         $this->assertEquals(FrontController::encodeQuery($params), '8kqoeebEej0V-FN5-DOdA1HBDDieFcNWTib2yLSUNjq0B0FWzAupIA==', 'testing the encodeQuery method with a known encrypted result for a test key');
    167:
    168:         $config->set('security.query.string.key', $oldKey);
    169:     }
    170:
    171:     /**
    172:      * Testing the decodeQueryParams method with a known encrypted result for a test key
    173:      *
    174:      * @since 1.0
    175:      */
    176:     public function testDecodeQueryParams() {
    177:         global $config;
    178:
    179:         $oldKey = $config->get('security.query.string.key');
    180:         $config->set('security.query.string.key', 'testkey');
    181:         $tk = '8kqoeebEej0V-FN5-DOdA1HBDDieFcNWTib2yLSUNjq0B0FWzAupIA==';
    182:
    183:         $this->assertEquals('act=ViewArticleTitle&title=Test_Title', FrontController::decodeQueryParams($tk), 'testing the decodeQueryParams method with a known encrypted result for a test key');
    184:     }
    185:
    186:     /**
    187:      * Testing that the getDecodeQueryParams method will return the known params with a known encrypted result for a test key
    188:      *
    189:      * @since 1.0
    190:      */
    191:     public function testGetDecodeQueryParams() {
    192:         global $config;
    193:
    194:         $oldKey = $config->get('security.query.string.key');
    195:         $config->set('security.query.string.key', 'testkey');
    196:         $tk = '8kqoeebEej0V-FN5-DOdA1HBDDieFcNWTib2yLSUNjq0B0FWzAupIA==';
    197:
    198:         $decoded = FrontController::getDecodeQueryParams($tk);
    199:
    200:         $this->assertEquals('ViewArticleTitle', $decoded['act'], 'testing that the getDecodeQueryParams method will return the known params with a known encrypted result for a test key');
    201:         $this->assertEquals('Test_Title', $decoded['title'], 'testing that the getDecodeQueryParams method will return the known params with a known encrypted result for a test key');
    202:     }
    203:
    204:     /**
    205:      * Testing that a request to a bad URL will result in a ResourceNotFoundException exception
    206:      *
    207:      * @since 1.0
    208:      */
    209:     public function testLoadControllerFileNotFound() {
    210:         global $config;
    211:
    212:         $request = $config->get('app.url').'doesNotExists';
    213:         $_SERVER['REQUEST_URI'] = str_replace('http://'.$_SERVER['HTTP_HOST'], '', $request);
    214:         $front = new FrontController();
    215:
    216:         try{
    217:             $front->loadController(false);
    218:             $this->fail('testing that a request to a bad URL will result in a ResourceNotFoundException exception');
    219:         }catch (ResourceNotFoundException $e) {
    220:             $this->assertTrue($e->getMessage() != '', 'testing that a request to a bad URL will result in a ResourceNotFoundException exception');
    221:         }
    222:     }
    223:
    224:     /**
    225:      * Testing the setting up and checking for the existence of a controller alias
    226:      *
    227:      * @since 1.0
    228:      */
    229:     public function testDefineAlias() {
    230:         $front = new FrontController();
    231:         $front->registerAlias('ViewArticleTitle','article','title');
    232:
    233:         $this->assertTrue($front->hasAlias('ViewArticleTitle'), 'testing the setting up and checking for the existence of a controller alias');
    234:         $this->assertTrue($front->checkAlias('article'), 'testing the setting up and checking for the existence of a controller alias');
    235:         $this->assertEquals('ViewArticleTitle', $front->getAliasController('article'),
    236:             'testing the setting up and checking for the existence of a controller alias');
    237:         $this->assertEquals('article', $front->getControllerAlias('ViewArticleTitle'),
    238:             'testing the setting up and checking for the existence of a controller alias');
    239:     }
    240:
    241:     /**
    242:      * Testing the accessing of the expected param for a given alias/controller
    243:      *
    244:      * @since 1.0
    245:      */
    246:     public function testAccessingAliasParamNames() {
    247:         $front = new FrontController();
    248:         $front->registerAlias('ViewArticleTitle','article','title');
    249:
    250:         $this->assertEquals('title', $front->getAliasParam('article'), 'testing the accessing of the expected param for a given alias/controller');
    251:         $this->assertEquals('title', $front->getControllerParam('ViewArticleTitle'), 'testing the accessing of the expected param for a given alias/controller');
    252:     }
    253:
    254:     /**
    255:      * Testing the registerFilter method with a valid filter object
    256:      *
    257:      * @since 1.0
    258:      */
    259:     public function testRegisterFilterGood() {
    260:         try {
    261:             $front = new FrontController();
    262:             $front->registerFilter(new ClientBlacklistFilter());
    263:
    264:             $found = false;
    265:
    266:             foreach ($front->getFilters() as $filter) {
    267:                 if($filter instanceof ClientBlacklistFilter)
    268:                     $found = true;
    269:             }
    270:             $this->assertTrue($found, 'testing the registerFilter method with a valid filter object');
    271:         }catch (IllegalArguementException $e) {
    272:             $this->fail('testing the registerFilter method with a valid filter object');
    273:         }
    274:     }
    275:
    276:     /**
    277:      * Testing the registerFilter method with a bad filter object
    278:      *
    279:      * @since 1.0
    280:      */
    281:     public function testRegisterFilterBad() {
    282:         try {
    283:             $front = new FrontController();
    284:             $front->registerFilter(new FrontController());
    285:
    286:             $this->fail('testing the registerFilter method with a bad filter object');
    287:         }catch (IllegalArguementException $e) {
    288:             $this->assertEquals('Supplied filter object is not a valid AlphaFilterInterface instance!', $e->getMessage(), 'testing the registerFilter method with a bad filter object');
    289:         }
    290:     }
    291: }
    292:
    293: ?>