fix api 404 on page parameter (#2468)

This commit is contained in:
Kevin Papst
2021-03-28 11:30:35 +02:00
committed by GitHub
parent f8a5ff7315
commit 7427187647
3 changed files with 42 additions and 40 deletions

View File

@@ -26,6 +26,7 @@ fos_rest:
'Symfony\Component\Routing\Exception\ResourceNotFoundException': 404 'Symfony\Component\Routing\Exception\ResourceNotFoundException': 404
'Symfony\Component\HttpKernel\Exception\NotFoundHttpException': 404 'Symfony\Component\HttpKernel\Exception\NotFoundHttpException': 404
'App\API\NotFoundException': 404 'App\API\NotFoundException': 404
'Pagerfanta\Exception\OutOfRangeCurrentPageException': 404
body_listener: body_listener:
enabled: true enabled: true
decoders: decoders:

View File

@@ -120,17 +120,10 @@ abstract class APIControllerBaseTest extends ControllerBaseTest
sprintf('The secure URL %s is not protected for role %s', $url, $role) sprintf('The secure URL %s is not protected for role %s', $url, $role)
); );
$expected = [ $this->assertApiException($client->getResponse(), [
'code' => 403, 'code' => 403,
'message' => 'Access denied.' 'message' => 'Access denied.'
]; ]);
self::assertEquals(403, $client->getResponse()->getStatusCode());
self::assertEquals(
$expected,
json_decode($client->getResponse()->getContent(), true)
);
} }
protected function request(HttpKernelBrowser $client, string $url, $method = 'GET', array $parameters = [], string $content = null): Crawler protected function request(HttpKernelBrowser $client, string $url, $method = 'GET', array $parameters = [], string $content = null): Crawler
@@ -144,23 +137,15 @@ abstract class APIControllerBaseTest extends ControllerBaseTest
{ {
$client = $this->getClientForAuthenticatedUser($role); $client = $this->getClientForAuthenticatedUser($role);
$this->request($client, $url, $method); $this->request($client, $url, $method);
$this->assertApiException($client->getResponse(), [
$expected = [
'code' => 404, 'code' => 404,
'message' => 'Not found' 'message' => 'Not found'
]; ]);
self::assertEquals(404, $client->getResponse()->getStatusCode());
self::assertEquals(
$expected,
json_decode($client->getResponse()->getContent(), true)
);
} }
protected function assertNotFoundForDelete(HttpKernelBrowser $client, string $url) protected function assertNotFoundForDelete(HttpKernelBrowser $client, string $url)
{ {
return $this->assertExceptionForMethod($client, $url, 'DELETE', [], [ $this->assertExceptionForMethod($client, $url, 'DELETE', [], [
'code' => 404, 'code' => 404,
'message' => 'Not found' 'message' => 'Not found'
]); ]);
@@ -168,7 +153,7 @@ abstract class APIControllerBaseTest extends ControllerBaseTest
protected function assertEntityNotFoundForDelete(string $role, string $url) protected function assertEntityNotFoundForDelete(string $role, string $url)
{ {
return $this->assertExceptionForDeleteAction($role, $url, [], [ $this->assertExceptionForDeleteAction($role, $url, [], [
'code' => 404, 'code' => 404,
'message' => 'Not found' 'message' => 'Not found'
]); ]);
@@ -176,7 +161,7 @@ abstract class APIControllerBaseTest extends ControllerBaseTest
protected function assertEntityNotFoundForPatch(string $role, string $url, array $data) protected function assertEntityNotFoundForPatch(string $role, string $url, array $data)
{ {
return $this->assertExceptionForPatchAction($role, $url, $data, [ $this->assertExceptionForPatchAction($role, $url, $data, [
'code' => 404, 'code' => 404,
'message' => 'Not found' 'message' => 'Not found'
]); ]);
@@ -184,7 +169,7 @@ abstract class APIControllerBaseTest extends ControllerBaseTest
protected function assertEntityNotFoundForPost(string $role, string $url, array $data, ?string $message = null) protected function assertEntityNotFoundForPost(string $role, string $url, array $data, ?string $message = null)
{ {
return $this->assertExceptionForPostAction($role, $url, $data, [ $this->assertExceptionForPostAction($role, $url, $data, [
'code' => 404, 'code' => 404,
'message' => $message ?? 'Not found' 'message' => $message ?? 'Not found'
]); ]);
@@ -208,15 +193,14 @@ abstract class APIControllerBaseTest extends ControllerBaseTest
protected function assertExceptionForMethod(HttpKernelBrowser $client, string $url, string $method, array $data, array $expectedErrors) protected function assertExceptionForMethod(HttpKernelBrowser $client, string $url, string $method, array $data, array $expectedErrors)
{ {
$this->request($client, $url, $method, [], json_encode($data)); $this->request($client, $url, $method, [], json_encode($data));
$response = $client->getResponse(); $this->assertApiException($client->getResponse(), $expectedErrors);
}
protected function assertApiException(Response $response, array $expectedErrors)
{
self::assertFalse($response->isSuccessful()); self::assertFalse($response->isSuccessful());
self::assertEquals($expectedErrors['code'], $response->getStatusCode());
self::assertEquals($expectedErrors['code'], $client->getResponse()->getStatusCode()); self::assertEquals($expectedErrors, json_decode($response->getContent(), true));
self::assertEquals(
$expectedErrors,
json_decode($client->getResponse()->getContent(), true)
);
} }
protected function assertExceptionForRole(string $role, string $url, string $method, array $data, array $expectedErrors) protected function assertExceptionForRole(string $role, string $url, string $method, array $data, array $expectedErrors)
@@ -225,11 +209,9 @@ abstract class APIControllerBaseTest extends ControllerBaseTest
$this->assertExceptionForMethod($client, $url, $method, $data, $expectedErrors); $this->assertExceptionForMethod($client, $url, $method, $data, $expectedErrors);
} }
protected function assertApiException(Response $response, string $message) protected function assertApi500Exception(Response $response, string $message)
{ {
self::assertFalse($response->isSuccessful()); $this->assertApiException($response, ['code' => 500, 'message' => $message]);
self::assertEquals(500, $response->getStatusCode());
self::assertEquals(['code' => 500, 'message' => $message], json_decode($response->getContent(), true));
} }
protected function assertApiAccessDenied(HttpKernelBrowser $client, string $url, string $message) protected function assertApiAccessDenied(HttpKernelBrowser $client, string $url, string $message)
@@ -240,10 +222,10 @@ abstract class APIControllerBaseTest extends ControllerBaseTest
protected function assertApiResponseAccessDenied(Response $response, string $message) protected function assertApiResponseAccessDenied(Response $response, string $message)
{ {
self::assertFalse($response->isSuccessful()); $this->assertApiException($response, [
self::assertEquals(Response::HTTP_FORBIDDEN, $response->getStatusCode()); 'code' => Response::HTTP_FORBIDDEN,
$expected = ['code' => Response::HTTP_FORBIDDEN, 'message' => $message]; 'message' => $message
self::assertEquals($expected, json_decode($response->getContent(), true)); ]);
} }
/** /**

View File

@@ -177,6 +177,25 @@ class TimesheetControllerTest extends APIControllerBaseTest
self::assertApiResponseTypeStructure('TimesheetCollection', $result[0]); self::assertApiResponseTypeStructure('TimesheetCollection', $result[0]);
} }
public function testGetCollectionWithQueryFailsWith404OnOutOfRangedPage()
{
$modifiedAfter = new \DateTime('-1 hour');
$begin = new \DateTime('first day of this month');
$begin->setTime(0, 0, 0);
$end = new \DateTime('last day of this month');
$end->setTime(23, 59, 59);
$query = [
'page' => 19,
'size' => 50,
];
$client = $this->getClientForAuthenticatedUser(User::ROLE_USER);
$this->importFixtureForUser(User::ROLE_USER);
$this->request($client, '/api/timesheets', 'GET', $query);
$this->assertApiException($client->getResponse(), ['code' => 404, 'message' => 'Page "19" does not exist. The currentPage must be inferior to "1"']);
}
public function testGetCollectionWithSingleParamsQuery() public function testGetCollectionWithSingleParamsQuery()
{ {
$begin = new \DateTime('first day of this month'); $begin = new \DateTime('first day of this month');
@@ -760,7 +779,7 @@ class TimesheetControllerTest extends APIControllerBaseTest
$id = $timesheets[0]->getId(); $id = $timesheets[0]->getId();
$this->request($client, '/api/timesheets/' . $id . '/stop', 'PATCH'); $this->request($client, '/api/timesheets/' . $id . '/stop', 'PATCH');
$this->assertApiException($client->getResponse(), 'Timesheet entry already stopped'); $this->assertApi500Exception($client->getResponse(), 'Timesheet entry already stopped');
} }
public function testStopThrowsNotFound() public function testStopThrowsNotFound()