ErrorHandler: Return 404 on ModelNotFoundException

This commit is contained in:
Igor Scheller 2020-02-29 18:37:44 +01:00 committed by msquare
parent edf3220824
commit 36da807ca2
2 changed files with 48 additions and 0 deletions

View File

@ -6,6 +6,7 @@ use Engelsystem\Http\Exceptions\HttpException;
use Engelsystem\Http\Exceptions\ValidationException; use Engelsystem\Http\Exceptions\ValidationException;
use Engelsystem\Http\Request; use Engelsystem\Http\Request;
use Engelsystem\Http\Response; use Engelsystem\Http\Response;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Support\Arr; use Illuminate\Support\Arr;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ServerRequestInterface;
@ -69,6 +70,8 @@ class ErrorHandler implements MiddlewareInterface
if ($request instanceof Request) { if ($request instanceof Request) {
$response->withInput(Arr::except($request->request->all(), $this->formIgnore)); $response->withInput(Arr::except($request->request->all(), $this->formIgnore));
} }
} catch (ModelNotFoundException $e) {
$response = $this->createResponse('', 404);
} }
$statusCode = $response->getStatusCode(); $statusCode = $response->getStatusCode();

View File

@ -13,6 +13,7 @@ use Engelsystem\Http\ResponseServiceProvider;
use Engelsystem\Http\Validation\Validator; use Engelsystem\Http\Validation\Validator;
use Engelsystem\Middleware\ErrorHandler; use Engelsystem\Middleware\ErrorHandler;
use Engelsystem\Test\Unit\Middleware\Stub\ReturnResponseMiddlewareHandler; use Engelsystem\Test\Unit\Middleware\Stub\ReturnResponseMiddlewareHandler;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
@ -219,6 +220,50 @@ class ErrorHandlerTest extends TestCase
$this->assertEquals('/foo/batz', $return->getHeaderLine('location')); $this->assertEquals('/foo/batz', $return->getHeaderLine('location'));
} }
/**
* @covers \Engelsystem\Middleware\ErrorHandler::process
*/
public function testProcessModelNotFoundException()
{
/** @var ServerRequestInterface|MockObject $request */
$request = $this->createMock(ServerRequestInterface::class);
/** @var ResponseInterface|MockObject $psrResponse */
$psrResponse = $this->getMockForAbstractClass(ResponseInterface::class);
/** @var ReturnResponseMiddlewareHandler|MockObject $returnResponseHandler */
$returnResponseHandler = $this->getMockBuilder(ReturnResponseMiddlewareHandler::class)
->disableOriginalConstructor()
->getMock();
$psrResponse->expects($this->once())
->method('getStatusCode')
->willReturn(404);
$psrResponse->expects($this->once())
->method('getHeader')
->with('content-type')
->willReturn([]);
$returnResponseHandler->expects($this->once())
->method('handle')
->willReturnCallback(function () {
throw new ModelNotFoundException('Some model could not be found');
});
/** @var ErrorHandler|MockObject $errorHandler */
$errorHandler = $this->getMockBuilder(ErrorHandler::class)
->disableOriginalConstructor()
->onlyMethods(['createResponse'])
->getMock();
$errorHandler->expects($this->once())
->method('createResponse')
->with('', 404)
->willReturn($psrResponse);
$return = $errorHandler->process($request, $returnResponseHandler);
$this->assertEquals($psrResponse, $return);
}
/** /**
* @covers \Engelsystem\Middleware\ErrorHandler::process * @covers \Engelsystem\Middleware\ErrorHandler::process
*/ */