test(audit-log) : ajoute 403 sur GET item et invariant page=0
- testItemEndpointWithoutPermissionGets403 : symetrique de
testAuthenticatedUserWithoutPermissionGets403 sur /api/audit-logs/{id},
prouve que la security expression `is_granted('core.audit_log.view')`
est appliquee aussi sur l'operation Get item (couvre M-4 du backlog).
- testPageZeroDoesNotProduceServerError : verrouille l'invariant
fonctionnel "?page=0 ne produit jamais 500 PG", quel que soit le
mecanisme protecteur (clamp provider ou validation API Platform amont).
Couvre M-7 du backlog.
This commit is contained in:
@@ -188,6 +188,48 @@ final class AuditLogApiTest extends AbstractApiTestCase
|
||||
self::assertSame($row['id'], $data['id']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Symetrique de `testAuthenticatedUserWithoutPermissionGets403` mais sur
|
||||
* l'endpoint item. Le `security: is_granted('core.audit_log.view')` declare
|
||||
* sur `Get` dans `AuditLogResource` doit refuser 403 (pas 200, pas 404).
|
||||
*/
|
||||
public function testItemEndpointWithoutPermissionGets403(): void
|
||||
{
|
||||
$row = $this->auditConnection->fetchAssociative(
|
||||
'SELECT id FROM audit_log WHERE request_id = :tag LIMIT 1',
|
||||
['tag' => $this->runTag],
|
||||
);
|
||||
self::assertIsArray($row);
|
||||
|
||||
// Permission "voisine" : prouve que l'auth seule ne suffit pas.
|
||||
$credentials = $this->createUserWithPermission('core.users.view');
|
||||
$client = $this->authenticatedClient($credentials['username'], $credentials['password']);
|
||||
$response = $client->request('GET', '/api/audit-logs/'.$row['id']);
|
||||
|
||||
self::assertSame(403, $response->getStatusCode());
|
||||
}
|
||||
|
||||
/**
|
||||
* `?page=0` provoquait historiquement un OFFSET negatif → 500 PG
|
||||
* `SQLSTATE[22023] OFFSET must not be negative`. API Platform 4 valide
|
||||
* desormais `page >= 1` en amont (rejette 400) avant que le provider ne
|
||||
* soit appele ; le clamp `max(1, ...)` cote provider reste en place comme
|
||||
* defense-in-depth si un futur upgrade ou un changement de configuration
|
||||
* leve cette validation. Ce test verrouille l'invariant fonctionnel :
|
||||
* aucun 500 PG quel que soit le mecanisme protecteur en place.
|
||||
*/
|
||||
public function testPageZeroDoesNotProduceServerError(): void
|
||||
{
|
||||
$client = $this->authenticatedClient('admin', 'admin');
|
||||
$response = $client->request('GET', '/api/audit-logs?page=0');
|
||||
|
||||
self::assertContains(
|
||||
$response->getStatusCode(),
|
||||
[200, 400],
|
||||
'page=0 doit etre traite proprement (clamp 200 ou 400 explicite), jamais 500 PG.',
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validation des filtres : un input malforme doit retourner un 400
|
||||
* explicite, pas un 500 (Postgres qui rejette le cast timestamp) ni
|
||||
|
||||
Reference in New Issue
Block a user