      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 1594 2012-11-21 15:43:59Z 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:         $config->set('security.query.string.key', $oldKey);
    186:     }
    187:
    188:     /**
    189:      * Testing that the getDecodeQueryParams method will return the known params with a known encrypted result for a test key
    190:      *
    191:      * @since 1.0
    192:      */
    193:     public function testGetDecodeQueryParams() {
    194:         global $config;
    195:
    196:         $oldKey = $config->get('security.query.string.key');
    197:         $config->set('security.query.string.key', 'testkey');
    198:         $tk = '8kqoeebEej0V-FN5-DOdA1HBDDieFcNWTib2yLSUNjq0B0FWzAupIA==';
    199:
    200:         $decoded = FrontController::getDecodeQueryParams($tk);
    201:
    202:         $this->assertEquals('ViewArticleTitle', $decoded['act'], 'testing that the getDecodeQueryParams method will return the known params with a known encrypted result for a test key');
    203:         $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');
    204:
    205:         $config->set('security.query.string.key', $oldKey);
    206:     }
    207:
    208:     /**
    209:      * Testing that a request to a bad URL will result in a ResourceNotFoundException exception
    210:      *
    211:      * @since 1.0
    212:      */
    213:     public function testLoadControllerFileNotFound() {
    214:         global $config;
    215:
    216:         $request = $config->get('app.url').'doesNotExists';
    217:         $_SERVER['REQUEST_URI'] = str_replace('http://'.$_SERVER['HTTP_HOST'], '', $request);
    218:         $front = new FrontController();
    219:
    220:         try{
    221:             $front->loadController(false);
    222:             $this->fail('testing that a request to a bad URL will result in a ResourceNotFoundException exception');
    223:         }catch (ResourceNotFoundException $e) {
    224:             $this->assertTrue($e->getMessage() != '', 'testing that a request to a bad URL will result in a ResourceNotFoundException exception');
    225:         }
    226:     }
    227:
    228:     /**
    229:      * Testing the setting up and checking for the existence of a controller alias
    230:      *
    231:      * @since 1.0
    232:      */
    233:     public function testDefineAlias() {
    234:         $front = new FrontController();
    235:         $front->registerAlias('ViewArticleTitle','article','title');
    236:
    237:         $this->assertTrue($front->hasAlias('ViewArticleTitle'), 'testing the setting up and checking for the existence of a controller alias');
    238:         $this->assertTrue($front->checkAlias('article'), 'testing the setting up and checking for the existence of a controller alias');
    239:         $this->assertEquals('ViewArticleTitle', $front->getAliasController('article'),
    240:             'testing the setting up and checking for the existence of a controller alias');
    241:         $this->assertEquals('article', $front->getControllerAlias('ViewArticleTitle'),
    242:             'testing the setting up and checking for the existence of a controller alias');
    243:     }
    244:
    245:     /**
    246:      * Testing the accessing of the expected param for a given alias/controller
    247:      *
    248:      * @since 1.0
    249:      */
    250:     public function testAccessingAliasParamNames() {
    251:         $front = new FrontController();
    252:         $front->registerAlias('ViewArticleTitle','article','title');
    253:
    254:         $this->assertEquals('title', $front->getAliasParam('article'), 'testing the accessing of the expected param for a given alias/controller');
    255:         $this->assertEquals('title', $front->getControllerParam('ViewArticleTitle'), 'testing the accessing of the expected param for a given alias/controller');
    256:     }
    257:
    258:     /**
    259:      * Testing the registerFilter method with a valid filter object
    260:      *
    261:      * @since 1.0
    262:      */
    263:     public function testRegisterFilterGood() {
    264:         try {
    265:             $front = new FrontController();
    266:             $front->registerFilter(new ClientBlacklistFilter());
    267:
    268:             $found = false;
    269:
    270:             foreach ($front->getFilters() as $filter) {
    271:                 if($filter instanceof ClientBlacklistFilter)
    272:                     $found = true;
    273:             }
    274:             $this->assertTrue($found, 'testing the registerFilter method with a valid filter object');
    275:         }catch (IllegalArguementException $e) {
    276:             $this->fail('testing the registerFilter method with a valid filter object');
    277:         }
    278:     }
    279:
    280:     /**
    281:      * Testing the registerFilter method with a bad filter object
    282:      *
    283:      * @since 1.0
    284:      */
    285:     public function testRegisterFilterBad() {
    286:         try {
    287:             $front = new FrontController();
    288:             $front->registerFilter(new FrontController());
    289:
    290:             $this->fail('testing the registerFilter method with a bad filter object');
    291:         }catch (IllegalArguementException $e) {
    292:             $this->assertEquals('Supplied filter object is not a valid AlphaFilterInterface instance!', $e->getMessage(), 'testing the registerFilter method with a bad filter object');
    293:         }
    294:     }
    295:
    296:     /**
    297:      * Testing the generateSecureURL method
    298:      *
    299:      * @since 1.2.1
    300:      */
    301:     public function testGenerateSecureURL() {
    302:
    303:         global $config;
    304:
    305:         $oldKey = $config->get('security.query.string.key');
    306:         $oldRewriteSetting = $config->get('app.use.mod.rewrite');
    307:
    308:         $config->set('security.query.string.key', 'testkey');
    309:         $params = 'act=ViewArticleTitle&title=Test_Title';
    310:
    311:         $config->set('app.use.mod.rewrite', true);
    312:         $this->assertEquals($config->get('app.url').'tk/8kqoeebEej0V-FN5-DOdA1HBDDieFcNWTib2yLSUNjq0B0FWzAupIA==', FrontController::generateSecureURL($params), 'Testing the generateSecureURL() returns the correct URL with mod_rewrite style URLs enabled');
    313:
    314:         $config->set('app.use.mod.rewrite', false);
    315:         $this->assertEquals($config->get('app.url').'?tk=8kqoeebEej0V-FN5-DOdA1HBDDieFcNWTib2yLSUNjq0B0FWzAupIA==', FrontController::generateSecureURL($params), 'Testing the generateSecureURL() returns the correct URL with mod_rewrite style URLs disabled');
    316:
    317:         $config->set('security.query.string.key', $oldKey);
    318:         $config->set('app.use.mod.rewrite', $oldRewriteSetting);
    319:     }
    320: }
    321:
    322: ?>