diff --git a/app/FrontController.php b/app/FrontController.php index 23cc62e..4e79609 100644 --- a/app/FrontController.php +++ b/app/FrontController.php @@ -41,8 +41,10 @@ class FrontController /** * Refuse cloning */ - private function __clone(){} - + private function __clone() + { + } + /** * @return FrontController */ @@ -126,14 +128,20 @@ class FrontController } } return $html; - } catch(Exception $e) { + } catch (Exception $e) { if (DEBUG == true) { if (!headers_sent()) { header('HTTP/1.0 500 Internal Server Error'); } return ErrorHandler::showDebug($e); } - $layout = new ErrorLayout(); + $layout_class = $this->getRouter()->getErrorLayout(); + + /** + * @var ErrorLayout $layout + */ + $layout = new $layout_class(); + $layout->setException($e); return $layout->fetch(new ErrorAction($e)); } } diff --git a/app/router/Router.php b/app/router/Router.php index 5eca53d..f79f588 100644 --- a/app/router/Router.php +++ b/app/router/Router.php @@ -18,6 +18,8 @@ class Router protected $default_layout = 'Default'; + protected $error_layout = 'Error'; + /** * @var Route */ @@ -51,6 +53,24 @@ class Router $this->default_layout = $layout; } + /** + * Sets the name of error page layout + * @param string $layout + */ + public function setErrorLayout($layout = 'Error') + { + $this->error_layout = $layout; + } + + /** + * Returns error layout name + * @return string Error layout name + */ + public function getErrorLayout() + { + return $this->error_layout . 'Layout'; + } + public function getRouteName() { return $this->route_name; diff --git a/layout/Error.layout.php b/layout/Error.layout.php index d8fe312..c50b866 100644 --- a/layout/Error.layout.php +++ b/layout/Error.layout.php @@ -11,5 +11,20 @@ class ErrorLayout extends Layout { - protected function execute(){} + /** + * @var GeneralException + */ + protected $exception; + + protected function execute() + { + } + + /** + * @param GeneralException $exception + */ + public function setException(GeneralException $exception) + { + $this->exception = $exception; + } } \ No newline at end of file diff --git a/tests/app/FrontControllerTest.php b/tests/app/FrontControllerTest.php index 7f2d4bc..59b0c8f 100644 --- a/tests/app/FrontControllerTest.php +++ b/tests/app/FrontControllerTest.php @@ -44,7 +44,7 @@ class FrontControllerTest extends PHPUnit_Framework_TestCase $this->getMock('View'); } if (!class_exists('ErrorLayout')) { - $this->getMock('ErrorLayout', array('fetch'), array(), 'ErrorLayoutMock'); + $this->getMock('ErrorLayout', array('fetch', 'setException'), array(), 'ErrorLayoutMock'); } if (!class_exists('ErrorActionMock')) { $this->getMock('ErrorAction', array(), array(), 'ErrorActionMock', false); @@ -190,7 +190,7 @@ class FrontControllerTest extends PHPUnit_Framework_TestCase $router = $controller->getRouter(); $router->add('user', 'user/account/:id', 'user'); $result = $controller->execute(); - $this->assertEmpty($result); + $this->assertNull($result); } /** * @runInSeparateProcess @@ -205,7 +205,7 @@ class FrontControllerTest extends PHPUnit_Framework_TestCase $router = $controller->getRouter(); $router->add('user', 'user/account/:id', 'NewAjax'); $result = $controller->execute(); - $this->assertEmpty($result); + $this->assertNull($result); } private function setConstants($val = false) @@ -227,8 +227,6 @@ class FrontControllerTest extends PHPUnit_Framework_TestCase return 'PHPViewMock'; case 'DefaultLayout': return 'DefaultLayoutMock'; - case 'userAction': - return 'userAction'; case 'ErrorAction': return 'ErrorActionMock'; case 'ErrorLayout': diff --git a/tests/app/router/RouterTest.php b/tests/app/router/RouterTest.php index d2c831f..a91e4ae 100644 --- a/tests/app/router/RouterTest.php +++ b/tests/app/router/RouterTest.php @@ -106,4 +106,17 @@ class RouterTest extends PHPUnit_Framework_TestCase $this->assertTrue($router->routeIsExists($name)); $this->assertFalse($router->routeIsExists($name_is_not_exists)); } + + public function testGetDefaultErrorLayout() + { + $router = new Router(); + $this->assertSame('ErrorLayout', $router->getErrorLayout()); + } + + public function testSetErrorLayout() + { + $router = new Router(); + $router->setErrorLayout('CustomError'); + $this->assertSame('CustomErrorLayout', $router->getErrorLayout()); + } } diff --git a/tests/layout/ErrorLayoutTest.php b/tests/layout/ErrorLayoutTest.php new file mode 100644 index 0000000..4efb16f --- /dev/null +++ b/tests/layout/ErrorLayoutTest.php @@ -0,0 +1,82 @@ + + * @link http://netmonsters.ru + * @package Majestic + * @subpackage UnitTests + * @since 04-06-2012 + * @user: agrebnev + */ + +require_once dirname(__FILE__) . '/../../exception/ErrorHandler.php'; +require_once dirname(__FILE__) . '/../../exception/GeneralException.php'; +require_once dirname(__FILE__) . '/../../app/FrontController.php'; +require_once dirname(__FILE__) . '/../../layout/Layout.php'; +require_once dirname(__FILE__) . '/../../layout/Error.layout.php'; + +/** + * @runTestsInSeparateProcesses + */ +class ErrorLayoutTest extends PHPUnit_Framework_TestCase +{ + + public function run(PHPUnit_Framework_TestResult $result = NULL) + { + $this->setPreserveGlobalState(false); + return parent::run($result); + } + + public function setUp() + { + if (!class_exists('RouterMock')) { + $this->getMock('Router', array(), array(), 'RouterMock', false); + } + if (!class_exists('PHPViewMock')) { + $this->getMock('PHPView', array('fetch', 'append', 'prepend', 'assign', 'getTemplate'), array(), 'PHPViewMock', false); + } + + set_new_overload(array($this, 'newCallback')); + } + + public function testSetException() + { + if (!defined('DEBUG')) { + define('DEBUG', false); + } + $layout = new ErrorLayout(); + $layout->setException(new GeneralException()); + $this->assertAttributeInstanceOf('GeneralException', 'exception', $layout); + } + + public function testExecute() + { + if (!defined('DEBUG')) { + define('DEBUG', false); + } + $action = $this->getMock('Action', array('fetch')); + $action->expects($this->once()) + ->method('fetch') + ->will($this->returnValue('this is the result of Action::fetch()')); + + $layout = new ErrorLayout(); + $layout->fetch($action); + } + + + protected function newCallback($className) + { + switch ($className) { + case 'Router': + return 'RouterMock'; + case 'PHPView': + return 'PHPViewMock'; + default: + return $className; + } + } + + public function tearDown() + { + unset_new_overload(); + } +}