createMock(TwigLoader::class); /** @var ServerRequestInterface|MockObject $request */ $request = $this->createMock(ServerRequestInterface::class); /** @var ResponseInterface|MockObject $psrResponse */ $psrResponse = $this->getMockForAbstractClass(ResponseInterface::class); $returnResponseHandler = new ReturnResponseMiddlewareHandler($psrResponse); $psrResponse->expects($this->once()) ->method('getStatusCode') ->willReturn(505); $errorHandler = new ErrorHandler($twigLoader); $return = $errorHandler->process($request, $returnResponseHandler); $this->assertEquals($psrResponse, $return, 'Plain PSR-7 Response should be passed directly'); /** @var Response|MockObject $response */ $response = $this->createMock(Response::class); $response->expects($this->exactly(3)) ->method('getStatusCode') ->willReturnOnConsecutiveCalls( 200, 418, 505 ); $returnResponseHandler->setResponse($response); $return = $errorHandler->process($request, $returnResponseHandler); $this->assertEquals($response, $return, 'Only Responses >= 400 should be processed'); $twigLoader->expects($this->exactly(4)) ->method('exists') ->withConsecutive( ['errors/418'], ['errors/4'], ['errors/400'], ['errors/505'] ) ->willReturnOnConsecutiveCalls( false, false, false, true ); $response->expects($this->exactly(2)) ->method('getContent') ->willReturnOnConsecutiveCalls( 'Teapot', 'Internal Error!' ); $response->expects($this->exactly(2)) ->method('withView') ->withConsecutive( ['errors/default', ['status' => 418, 'content' => 'Teapot'], 418], ['errors/505', ['status' => 505, 'content' => 'Internal Error!'], 505] ) ->willReturn($response); $errorHandler->process($request, $returnResponseHandler); $errorHandler->process($request, $returnResponseHandler); } }