assertSame($result, $response); } /** * Test an invalid rendering class. * * @expectedException Exception * @expectedExceptionMessage The 'TotallyInvalid' renderer class could not be found */ public function testInvalidRenderer() { $request = ServerRequestFactory::fromGlobals(); $response = new Response(); $middleware = new ErrorHandlerMiddleware('TotallyInvalid'); $next = function ($req, $res) { throw new \Exception('Something bad'); }; $middleware($request, $response, $next); } /** * Test using a factory method to make a renderer. * * @return void */ public function testRendererFactory() { $request = ServerRequestFactory::fromGlobals(); $response = new Response(); $factory = function ($exception) { $this->assertInstanceOf('LogicException', $exception); $cakeResponse = new CakeResponse; $mock = $this->getMock('StdClass', ['render']); $mock->expects($this->once()) ->method('render') ->will($this->returnValue($cakeResponse)); return $mock; }; $middleware = new ErrorHandlerMiddleware($factory); $next = function ($req, $res) { throw new LogicException('Something bad'); }; $middleware($request, $response, $next); } /** * Test rendering an error page * * @return void */ public function testHandleException() { Configure::write('App.namespace', 'TestApp'); $request = ServerRequestFactory::fromGlobals(); $response = new Response(); $middleware = new ErrorHandlerMiddleware(); $next = function ($req, $res) { throw new \Cake\Network\Exception\NotFoundException('whoops'); }; $result = $middleware($request, $response, $next); $this->assertNotSame($result, $response); $this->assertEquals(404, $result->getStatusCode()); $this->assertContains("was not found", '' . $result->getBody()); } /** * Test handling an error and having rendering fail. * * @return void */ public function testHandleExceptionRenderingFails() { Configure::write('App.namespace', 'TestApp'); $request = ServerRequestFactory::fromGlobals(); $response = new Response(); $factory = function ($exception) { $mock = $this->getMock('StdClass', ['render']); $mock->expects($this->once()) ->method('render') ->will($this->throwException(new LogicException('Rendering failed'))); return $mock; }; $middleware = new ErrorHandlerMiddleware($factory); $next = function ($req, $res) { throw new \Cake\Network\Exception\ServiceUnavailableException('whoops'); }; $response = $middleware($request, $response, $next); $this->assertEquals(500, $response->getStatusCode()); $this->assertEquals('An Internal Server Error Occurred', '' . $response->getBody()); } }