fix(audit-log) : reset pendingLogs sur onFlush + valide filtres + documente contrat rollback
Trois corrections issues du code review multi-agent sur la PR audit-log : - AuditListener : reset defensif de pendingLogs en debut de onFlush. Si un flush precedent a leve une exception avant postFlush (qui n'est jamais appele sur un flush rate), le state listener gardait des changements jamais committes, ecrits a tort par le prochain postFlush reussi — audit_log pouvait donc contenir des lignes decrivant des evenements qui n'ont pas eu lieu en DB. Test de regression via Reflection pour injecter un log orphelin et verifier qu'il n'arrive pas dans audit_log. - AuditLogProvider : validation explicite des filtres performed_at[after] et performed_at[before] (strtotime) + whitelist stricte sur `action` (create|update|delete). Avant, un input malforme remontait jusqu'a Postgres et faisait un 500 (SQLSTATE[22007]). Desormais 400 explicite, pas de log pollue. - doc/audit-log.md : ajoute une section "Contrat" qui explicite ce que audit_log garantit (journal des intentions appliquees par l'ORM) et ne garantit PAS (reflet exact du commit outermost — une ligne audit peut persister si une transaction outermost rollback apres un flush inner reussi, parce que l'audit ecrit sur une connexion DBAL dediee). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -188,6 +188,27 @@ final class AuditLogApiTest extends AbstractApiTestCase
|
||||
self::assertSame($row['id'], $data['id']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validation des filtres : un input malforme doit retourner un 400
|
||||
* explicite, pas un 500 (Postgres qui rejette le cast timestamp) ni
|
||||
* un match silencieux sur une valeur inattendue.
|
||||
*/
|
||||
public function testInvalidPerformedAtFilterReturns400(): void
|
||||
{
|
||||
$client = $this->authenticatedClient('admin', 'admin');
|
||||
$response = $client->request('GET', '/api/audit-logs?performed_at[after]=pas-une-date');
|
||||
|
||||
self::assertSame(400, $response->getStatusCode());
|
||||
}
|
||||
|
||||
public function testInvalidActionFilterReturns400(): void
|
||||
{
|
||||
$client = $this->authenticatedClient('admin', 'admin');
|
||||
$response = $client->request('GET', '/api/audit-logs?action=dropTable');
|
||||
|
||||
self::assertSame(400, $response->getStatusCode());
|
||||
}
|
||||
|
||||
public function testPostIsNotAllowed(): void
|
||||
{
|
||||
$client = $this->authenticatedClient('admin', 'admin');
|
||||
|
||||
Reference in New Issue
Block a user