123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819 |
- <?php
- /**
- * ExceptionRendererTest file
- *
- * PHP 5
- *
- * CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
- * Copyright 2005-2012, Cake Software Foundation, Inc. (http://cakefoundation.org)
- *
- * Licensed under The MIT License
- * Redistributions of files must retain the above copyright notice
- *
- * @copyright Copyright 2005-2012, Cake Software Foundation, Inc. (http://cakefoundation.org)
- * @link http://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests
- * @package Cake.Test.Case.Error
- * @since CakePHP(tm) v 2.0
- * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
- */
- App::uses('ExceptionRenderer', 'Error');
- App::uses('Controller', 'Controller');
- App::uses('Component', 'Controller');
- App::uses('Router', 'Routing');
- /**
- * Short description for class.
- *
- * @package Cake.Test.Case.Error
- */
- class AuthBlueberryUser extends CakeTestModel {
- /**
- * name property
- *
- * @var string 'AuthBlueberryUser'
- */
- public $name = 'AuthBlueberryUser';
- /**
- * useTable property
- *
- * @var string
- */
- public $useTable = false;
- }
- /**
- * BlueberryComponent class
- *
- * @package Cake.Test.Case.Error
- */
- class BlueberryComponent extends Component {
- /**
- * testName property
- *
- * @return void
- */
- public $testName = null;
- /**
- * initialize method
- *
- * @return void
- */
- public function initialize(Controller $controller) {
- $this->testName = 'BlueberryComponent';
- }
- }
- /**
- * TestErrorController class
- *
- * @package Cake.Test.Case.Error
- */
- class TestErrorController extends Controller {
- /**
- * uses property
- *
- * @var array
- */
- public $uses = array();
- /**
- * components property
- *
- * @return void
- */
- public $components = array('Blueberry');
- /**
- * beforeRender method
- *
- * @return void
- */
- public function beforeRender() {
- echo $this->Blueberry->testName;
- }
- /**
- * index method
- *
- * @return void
- */
- public function index() {
- $this->autoRender = false;
- return 'what up';
- }
- }
- /**
- * MyCustomExceptionRenderer class
- *
- * @package Cake.Test.Case.Error
- */
- class MyCustomExceptionRenderer extends ExceptionRenderer {
- /**
- * custom error message type.
- *
- * @return void
- */
- public function missingWidgetThing() {
- echo 'widget thing is missing';
- }
- }
- /**
- * Exception class for testing app error handlers and custom errors.
- *
- * @package Cake.Test.Case.Error
- */
- class MissingWidgetThingException extends NotFoundException {
- }
- /**
- * ExceptionRendererTest class
- *
- * @package Cake.Test.Case.Error
- */
- class ExceptionRendererTest extends CakeTestCase {
- protected $_restoreError = false;
- /**
- * setup create a request object to get out of router later.
- *
- * @return void
- */
- public function setUp() {
- parent::setUp();
- App::build(array(
- 'View' => array(
- CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS
- )
- ), App::RESET);
- Router::reload();
- $request = new CakeRequest(null, false);
- $request->base = '';
- Router::setRequestInfo($request);
- Configure::write('debug', 2);
- }
- /**
- * tearDown
- *
- * @return void
- */
- public function tearDown() {
- parent::tearDown();
- if ($this->_restoreError) {
- restore_error_handler();
- }
- }
- /**
- * Mocks out the response on the ExceptionRenderer object so headers aren't modified.
- *
- * @return void
- */
- protected function _mockResponse($error) {
- $error->controller->response = $this->getMock('CakeResponse', array('_sendHeader'));
- return $error;
- }
- /**
- * test that methods declared in an ExceptionRenderer subclass are not converted
- * into error400 when debug > 0
- *
- * @return void
- */
- public function testSubclassMethodsNotBeingConvertedToError() {
- Configure::write('debug', 2);
- $exception = new MissingWidgetThingException('Widget not found');
- $ExceptionRenderer = $this->_mockResponse(new MyCustomExceptionRenderer($exception));
- ob_start();
- $ExceptionRenderer->render();
- $result = ob_get_clean();
- $this->assertEquals('widget thing is missing', $result);
- }
- /**
- * test that subclass methods are not converted when debug = 0
- *
- * @return void
- */
- public function testSubclassMethodsNotBeingConvertedDebug0() {
- Configure::write('debug', 0);
- $exception = new MissingWidgetThingException('Widget not found');
- $ExceptionRenderer = $this->_mockResponse(new MyCustomExceptionRenderer($exception));
- $this->assertEquals('missingWidgetThing', $ExceptionRenderer->method);
- ob_start();
- $ExceptionRenderer->render();
- $result = ob_get_clean();
- $this->assertEquals('widget thing is missing', $result, 'Method declared in subclass converted to error400');
- }
- /**
- * test that ExceptionRenderer subclasses properly convert framework errors.
- *
- * @return void
- */
- public function testSubclassConvertingFrameworkErrors() {
- Configure::write('debug', 0);
- $exception = new MissingControllerException('PostsController');
- $ExceptionRenderer = $this->_mockResponse(new MyCustomExceptionRenderer($exception));
- $this->assertEquals('error400', $ExceptionRenderer->method);
- ob_start();
- $ExceptionRenderer->render();
- $result = ob_get_clean();
- $this->assertRegExp('/Not Found/', $result, 'Method declared in error handler not converted to error400. %s');
- }
- /**
- * test things in the constructor.
- *
- * @return void
- */
- public function testConstruction() {
- $exception = new NotFoundException('Page not found');
- $ExceptionRenderer = new ExceptionRenderer($exception);
- $this->assertInstanceOf('CakeErrorController', $ExceptionRenderer->controller);
- $this->assertEquals('error400', $ExceptionRenderer->method);
- $this->assertEquals($exception, $ExceptionRenderer->error);
- }
- /**
- * test that method gets coerced when debug = 0
- *
- * @return void
- */
- public function testErrorMethodCoercion() {
- Configure::write('debug', 0);
- $exception = new MissingActionException('Page not found');
- $ExceptionRenderer = new ExceptionRenderer($exception);
- $this->assertInstanceOf('CakeErrorController', $ExceptionRenderer->controller);
- $this->assertEquals('error400', $ExceptionRenderer->method);
- $this->assertEquals($exception, $ExceptionRenderer->error);
- }
- /**
- * test that helpers in custom CakeErrorController are not lost
- */
- public function testCakeErrorHelpersNotLost() {
- $testApp = CAKE . 'Test' . DS . 'test_app' . DS;
- App::build(array(
- 'Controller' => array(
- $testApp . 'Controller' . DS
- ),
- 'View/Helper' => array(
- $testApp . 'View' . DS . 'Helper' . DS
- ),
- 'View/Layouts' => array(
- $testApp . 'View' . DS . 'Layouts' . DS
- ),
- 'Error' => array(
- $testApp . 'Error' . DS
- ),
- ), App::RESET);
- App::uses('TestAppsExceptionRenderer', 'Error');
- $exception = new SocketException('socket exception');
- $renderer = new TestAppsExceptionRenderer($exception);
- ob_start();
- $renderer->render();
- $result = ob_get_clean();
- $this->assertContains('<b>peeled</b>', $result);
- }
- /**
- * test that unknown exception types with valid status codes are treated correctly.
- *
- * @return void
- */
- public function testUnknownExceptionTypeWithExceptionThatHasA400Code() {
- $exception = new MissingWidgetThingException('coding fail.');
- $ExceptionRenderer = new ExceptionRenderer($exception);
- $ExceptionRenderer->controller->response = $this->getMock('CakeResponse', array('statusCode', '_sendHeader'));
- $ExceptionRenderer->controller->response->expects($this->once())->method('statusCode')->with(404);
- ob_start();
- $ExceptionRenderer->render();
- $result = ob_get_clean();
- $this->assertFalse(method_exists($ExceptionRenderer, 'missingWidgetThing'), 'no method should exist.');
- $this->assertEquals('error400', $ExceptionRenderer->method, 'incorrect method coercion.');
- $this->assertContains('coding fail', $result, 'Text should show up.');
- }
- /**
- * test that unknown exception types with valid status codes are treated correctly.
- *
- * @return void
- */
- public function testUnknownExceptionTypeWithNoCodeIsA500() {
- $exception = new OutOfBoundsException('foul ball.');
- $ExceptionRenderer = new ExceptionRenderer($exception);
- $ExceptionRenderer->controller->response = $this->getMock('CakeResponse', array('statusCode', '_sendHeader'));
- $ExceptionRenderer->controller->response->expects($this->once())
- ->method('statusCode')
- ->with(500);
- ob_start();
- $ExceptionRenderer->render();
- $result = ob_get_clean();
- $this->assertEquals('error500', $ExceptionRenderer->method, 'incorrect method coercion.');
- $this->assertContains('foul ball.', $result, 'Text should show up as its debug mode.');
- }
- /**
- * test that unknown exceptions have messages ignored.
- *
- * @return void
- */
- public function testUnknownExceptionInProduction() {
- Configure::write('debug', 0);
- $exception = new OutOfBoundsException('foul ball.');
- $ExceptionRenderer = new ExceptionRenderer($exception);
- $ExceptionRenderer->controller->response = $this->getMock('CakeResponse', array('statusCode', '_sendHeader'));
- $ExceptionRenderer->controller->response->expects($this->once())
- ->method('statusCode')
- ->with(500);
- ob_start();
- $ExceptionRenderer->render();
- $result = ob_get_clean();
- $this->assertEquals('error500', $ExceptionRenderer->method, 'incorrect method coercion.');
- $this->assertNotContains('foul ball.', $result, 'Text should no show up.');
- $this->assertContains('Internal Error', $result, 'Generic message only.');
- }
- /**
- * test that unknown exception types with valid status codes are treated correctly.
- *
- * @return void
- */
- public function testUnknownExceptionTypeWithCodeHigherThan500() {
- $exception = new OutOfBoundsException('foul ball.', 501);
- $ExceptionRenderer = new ExceptionRenderer($exception);
- $ExceptionRenderer->controller->response = $this->getMock('CakeResponse', array('statusCode', '_sendHeader'));
- $ExceptionRenderer->controller->response->expects($this->once())->method('statusCode')->with(501);
- ob_start();
- $ExceptionRenderer->render();
- $result = ob_get_clean();
- $this->assertEquals('error500', $ExceptionRenderer->method, 'incorrect method coercion.');
- $this->assertContains('foul ball.', $result, 'Text should show up as its debug mode.');
- }
- /**
- * testerror400 method
- *
- * @return void
- */
- public function testError400() {
- Router::reload();
- $request = new CakeRequest('posts/view/1000', false);
- Router::setRequestInfo($request);
- $exception = new NotFoundException('Custom message');
- $ExceptionRenderer = new ExceptionRenderer($exception);
- $ExceptionRenderer->controller->response = $this->getMock('CakeResponse', array('statusCode', '_sendHeader'));
- $ExceptionRenderer->controller->response->expects($this->once())->method('statusCode')->with(404);
- ob_start();
- $ExceptionRenderer->render();
- $result = ob_get_clean();
- $this->assertRegExp('/<h2>Custom message<\/h2>/', $result);
- $this->assertRegExp("/<strong>'.*?\/posts\/view\/1000'<\/strong>/", $result);
- }
- /**
- * test that error400 only modifies the messages on CakeExceptions.
- *
- * @return void
- */
- public function testerror400OnlyChangingCakeException() {
- Configure::write('debug', 0);
- $exception = new NotFoundException('Custom message');
- $ExceptionRenderer = $this->_mockResponse(new ExceptionRenderer($exception));
- ob_start();
- $ExceptionRenderer->render();
- $result = ob_get_clean();
- $this->assertContains('Custom message', $result);
- $exception = new MissingActionException(array('controller' => 'PostsController', 'action' => 'index'));
- $ExceptionRenderer = $this->_mockResponse(new ExceptionRenderer($exception));
- ob_start();
- $ExceptionRenderer->render();
- $result = ob_get_clean();
- $this->assertContains('Not Found', $result);
- }
- /**
- * test that error400 doesn't expose XSS
- *
- * @return void
- */
- public function testError400NoInjection() {
- Router::reload();
- $request = new CakeRequest('pages/<span id=333>pink</span></id><script>document.body.style.background = t=document.getElementById(333).innerHTML;window.alert(t);</script>', false);
- Router::setRequestInfo($request);
- $exception = new NotFoundException('Custom message');
- $ExceptionRenderer = $this->_mockResponse(new ExceptionRenderer($exception));
- ob_start();
- $ExceptionRenderer->render();
- $result = ob_get_clean();
- $this->assertNotRegExp('#<script>document#', $result);
- $this->assertNotRegExp('#alert\(t\);</script>#', $result);
- }
- /**
- * testError500 method
- *
- * @return void
- */
- public function testError500Message() {
- $exception = new InternalErrorException('An Internal Error Has Occurred');
- $ExceptionRenderer = new ExceptionRenderer($exception);
- $ExceptionRenderer->controller->response = $this->getMock('CakeResponse', array('statusCode', '_sendHeader'));
- $ExceptionRenderer->controller->response->expects($this->once())->method('statusCode')->with(500);
- ob_start();
- $ExceptionRenderer->render();
- $result = ob_get_clean();
- $this->assertRegExp('/<h2>An Internal Error Has Occurred<\/h2>/', $result);
- }
- /**
- * testExceptionResponseHeader method
- *
- * @return void
- */
- public function testExceptionResponseHeader() {
- $exception = new MethodNotAllowedException('Only allowing POST and DELETE');
- $exception->responseHeader(array('Allow: POST, DELETE'));
- $ExceptionRenderer = new ExceptionRenderer($exception);
- //Replace response object with mocked object add back the original headers which had been set in ExceptionRenderer constructor
- $headers = $ExceptionRenderer->controller->response->header();
- $ExceptionRenderer->controller->response = $this->getMock('CakeResponse', array('_sendHeader'));
- $ExceptionRenderer->controller->response->header($headers);
- $ExceptionRenderer->controller->response->expects($this->at(1))->method('_sendHeader')->with('Allow', 'POST, DELETE');
- ob_start();
- $ExceptionRenderer->render();
- ob_get_clean();
- }
- /**
- * testMissingController method
- *
- * @return void
- */
- public function testMissingController() {
- $exception = new MissingControllerException(array('class' => 'PostsController'));
- $ExceptionRenderer = $this->_mockResponse(new ExceptionRenderer($exception));
- ob_start();
- $ExceptionRenderer->render();
- $result = ob_get_clean();
- $this->assertRegExp('/<h2>Missing Controller<\/h2>/', $result);
- $this->assertRegExp('/<em>PostsController<\/em>/', $result);
- }
- /**
- * Returns an array of tests to run for the various CakeException classes.
- *
- * @return void
- */
- public static function testProvider() {
- return array(
- array(
- new MissingActionException(array('controller' => 'PostsController', 'action' => 'index')),
- array(
- '/<h2>Missing Method in PostsController<\/h2>/',
- '/<em>PostsController::<\/em><em>index\(\)<\/em>/'
- ),
- 404
- ),
- array(
- new PrivateActionException(array('controller' => 'PostsController' , 'action' => '_secretSauce')),
- array(
- '/<h2>Private Method in PostsController<\/h2>/',
- '/<em>PostsController::<\/em><em>_secretSauce\(\)<\/em>/'
- ),
- 404
- ),
- array(
- new MissingTableException(array('table' => 'articles', 'class' => 'Article', 'ds' => 'test')),
- array(
- '/<h2>Missing Database Table<\/h2>/',
- '/Table <em>articles<\/em> for model <em>Article<\/em> was not found in datasource <em>test<\/em>/'
- ),
- 500
- ),
- array(
- new MissingDatabaseException(array('connection' => 'default')),
- array(
- '/<h2>Missing Database Connection<\/h2>/',
- '/Confirm you have created the file/'
- ),
- 500
- ),
- array(
- new MissingViewException(array('file' => '/posts/about.ctp')),
- array(
- "/posts\/about.ctp/"
- ),
- 500
- ),
- array(
- new MissingLayoutException(array('file' => 'layouts/my_layout.ctp')),
- array(
- "/Missing Layout/",
- "/layouts\/my_layout.ctp/"
- ),
- 500
- ),
- array(
- new MissingConnectionException(array('class' => 'Mysql')),
- array(
- '/<h2>Missing Database Connection<\/h2>/',
- '/A Database connection using "Mysql" was missing or unable to connect./',
- ),
- 500
- ),
- array(
- new MissingConnectionException(array('class' => 'Mysql', 'enabled' => false)),
- array(
- '/<h2>Missing Database Connection<\/h2>/',
- '/A Database connection using "Mysql" was missing or unable to connect./',
- '/Mysql driver is NOT enabled/'
- ),
- 500
- ),
- array(
- new MissingDatasourceConfigException(array('config' => 'default')),
- array(
- '/<h2>Missing Datasource Configuration<\/h2>/',
- '/The datasource configuration <em>default<\/em> was not found in database.php/'
- ),
- 500
- ),
- array(
- new MissingDatasourceException(array('class' => 'MyDatasource', 'plugin' => 'MyPlugin')),
- array(
- '/<h2>Missing Datasource<\/h2>/',
- '/Datasource class <em>MyPlugin.MyDatasource<\/em> could not be found/'
- ),
- 500
- ),
- array(
- new MissingHelperException(array('class' => 'MyCustomHelper')),
- array(
- '/<h2>Missing Helper<\/h2>/',
- '/<em>MyCustomHelper<\/em> could not be found./',
- '/Create the class <em>MyCustomHelper<\/em> below in file:/',
- '/(\/|\\\)MyCustomHelper.php/'
- ),
- 500
- ),
- array(
- new MissingBehaviorException(array('class' => 'MyCustomBehavior')),
- array(
- '/<h2>Missing Behavior<\/h2>/',
- '/Create the class <em>MyCustomBehavior<\/em> below in file:/',
- '/(\/|\\\)MyCustomBehavior.php/'
- ),
- 500
- ),
- array(
- new MissingComponentException(array('class' => 'SideboxComponent')),
- array(
- '/<h2>Missing Component<\/h2>/',
- '/Create the class <em>SideboxComponent<\/em> below in file:/',
- '/(\/|\\\)SideboxComponent.php/'
- ),
- 500
- ),
- array(
- new Exception('boom'),
- array(
- '/Internal Error/'
- ),
- 500
- ),
- array(
- new RuntimeException('another boom'),
- array(
- '/Internal Error/'
- ),
- 500
- ),
- array(
- new CakeException('base class'),
- array('/Internal Error/'),
- 500
- ),
- array(
- new ConfigureException('No file'),
- array('/Internal Error/'),
- 500
- )
- );
- }
- /**
- * Test the various CakeException sub classes
- *
- * @dataProvider testProvider
- * @return void
- */
- public function testCakeExceptionHandling($exception, $patterns, $code) {
- $ExceptionRenderer = new ExceptionRenderer($exception);
- $ExceptionRenderer->controller->response = $this->getMock('CakeResponse', array('statusCode', '_sendHeader'));
- $ExceptionRenderer->controller->response->expects($this->once())
- ->method('statusCode')
- ->with($code);
- ob_start();
- $ExceptionRenderer->render();
- $result = ob_get_clean();
- foreach ($patterns as $pattern) {
- $this->assertRegExp($pattern, $result);
- }
- }
- /**
- * Test exceptions being raised when helpers are missing.
- *
- * @return void
- */
- public function testMissingRenderSafe() {
- $exception = new MissingHelperException(array('class' => 'Fail'));
- $ExceptionRenderer = new ExceptionRenderer($exception);
- $ExceptionRenderer->controller = $this->getMock('Controller', array('render'));
- $ExceptionRenderer->controller->helpers = array('Fail', 'Boom');
- $ExceptionRenderer->controller->request = $this->getMock('CakeRequest');
- $ExceptionRenderer->controller->expects($this->at(0))
- ->method('render')
- ->with('missingHelper')
- ->will($this->throwException($exception));
- $response = $this->getMock('CakeResponse');
- $response->expects($this->once())
- ->method('body')
- ->with($this->stringContains('Helper class Fail'));
- $ExceptionRenderer->controller->response = $response;
- $ExceptionRenderer->render();
- sort($ExceptionRenderer->controller->helpers);
- $this->assertEquals(array('Form', 'Html', 'Session'), $ExceptionRenderer->controller->helpers);
- }
- /**
- * Test that exceptions in beforeRender() are handled by outputMessageSafe
- *
- * @return void
- */
- public function testRenderExceptionInBeforeRender() {
- $exception = new NotFoundException('Not there, sorry');
- $ExceptionRenderer = new ExceptionRenderer($exception);
- $ExceptionRenderer->controller = $this->getMock('Controller', array('beforeRender'));
- $ExceptionRenderer->controller->request = $this->getMock('CakeRequest');
- $ExceptionRenderer->controller->expects($this->any())
- ->method('beforeRender')
- ->will($this->throwException($exception));
- $response = $this->getMock('CakeResponse');
- $response->expects($this->once())
- ->method('body')
- ->with($this->stringContains('Not there, sorry'));
- $ExceptionRenderer->controller->response = $response;
- $ExceptionRenderer->render();
- }
- /**
- * Test that missing subDir/layoutPath don't cause other fatal errors.
- *
- * @return void
- */
- public function testMissingSubdirRenderSafe() {
- $exception = new NotFoundException();
- $ExceptionRenderer = new ExceptionRenderer($exception);
- $ExceptionRenderer->controller = $this->getMock('Controller', array('render'));
- $ExceptionRenderer->controller->helpers = array('Fail', 'Boom');
- $ExceptionRenderer->controller->layoutPath = 'json';
- $ExceptionRenderer->controller->subDir = 'json';
- $ExceptionRenderer->controller->viewClass = 'Json';
- $ExceptionRenderer->controller->request = $this->getMock('CakeRequest');
- $ExceptionRenderer->controller->expects($this->once())
- ->method('render')
- ->with('error400')
- ->will($this->throwException($exception));
- $response = $this->getMock('CakeResponse');
- $response->expects($this->once())
- ->method('body')
- ->with($this->stringContains('Not Found'));
- $response->expects($this->once())
- ->method('type')
- ->with('html');
- $ExceptionRenderer->controller->response = $response;
- $ExceptionRenderer->render();
- $this->assertEquals('', $ExceptionRenderer->controller->layoutPath);
- $this->assertEquals('', $ExceptionRenderer->controller->subDir);
- $this->assertEquals('Errors/', $ExceptionRenderer->controller->viewPath);
- }
- /**
- * Test that exceptions can be rendered when an request hasn't been registered
- * with Router
- *
- * @return void
- */
- public function testRenderWithNoRequest() {
- Router::reload();
- $this->assertNull(Router::getRequest(false));
- $exception = new Exception('Terrible');
- $ExceptionRenderer = new ExceptionRenderer($exception);
- $ExceptionRenderer->controller->response = $this->getMock('CakeResponse', array('statusCode', '_sendHeader'));
- $ExceptionRenderer->controller->response->expects($this->once())
- ->method('statusCode')
- ->with(500);
- ob_start();
- $ExceptionRenderer->render();
- $result = ob_get_clean();
- $this->assertContains('Internal Error', $result);
- }
- /**
- * Tests the output of rendering a PDOException
- *
- * @return void
- */
- public function testPDOException() {
- $exception = new PDOException('There was an error in the SQL query');
- $exception->queryString = 'SELECT * from poo_query < 5 and :seven';
- $exception->params = array('seven' => 7);
- $ExceptionRenderer = new ExceptionRenderer($exception);
- $ExceptionRenderer->controller->response = $this->getMock('CakeResponse', array('statusCode', '_sendHeader'));
- $ExceptionRenderer->controller->response->expects($this->once())->method('statusCode')->with(500);
- ob_start();
- $ExceptionRenderer->render();
- $result = ob_get_clean();
- $this->assertContains('<h2>Database Error</h2>', $result);
- $this->assertContains('There was an error in the SQL query', $result);
- $this->assertContains(h('SELECT * from poo_query < 5 and :seven'), $result);
- $this->assertContains("'seven' => (int) 7", $result);
- }
- }
|