Files
Starseed/tests/Module/Core/Api/LogoutApiTest.php
T
tristan b93737391d
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Failing after 40s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m47s
fix(core) : logout API renvoie 204 sans redirection
Le firewall répondait par une 302 (target /login). Le fetch front suivait le
Location absolu (host upstream du proxy « nginx » en dev) → ERR_NAME_NOT_RESOLVED
+ ~3s de timeout DNS. ApiLogoutSuccessListener rétrograde la réponse en 204 en
conservant le Set-Cookie qui efface BEARER.
2026-06-29 10:25:03 +02:00

49 lines
1.7 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Tests\Module\Core\Api;
/**
* Logout de l'API JWT stateless (POST /api/logout).
*
* Garde-fou de regression : le logout doit renvoyer 204 sans redirection. Une
* 302 (comportement Symfony par defaut via `target`) ferait suivre au `fetch`
* du front un Location absolu base sur le Host de la requete ; en dev, ce Host
* est l'upstream du proxy Nuxt (« nginx »), non resolvable par le navigateur =>
* `ERR_NAME_NOT_RESOLVED` + ~3 s de timeout DNS. Cf. ApiLogoutSuccessListener.
*
* @internal
*/
final class LogoutApiTest extends AbstractApiTestCase
{
public function testLogoutReturns204WithoutRedirectAndClearsBearerCookie(): void
{
$client = $this->authenticatedClient('admin', 'admin');
$response = $client->request('POST', '/api/logout');
self::assertSame(204, $response->getStatusCode(), 'Le logout API doit renvoyer 204 No Content.');
$headers = $response->getHeaders(false);
// Aucune redirection : un fetch ne doit pas avoir de Location a suivre.
self::assertArrayNotHasKey(
'location',
$headers,
'Le logout API ne doit pas rediriger (fetch suivrait un Location absolu => ERR_NAME_NOT_RESOLVED).',
);
// Le cookie BEARER est efface (Set-Cookie expire / supprime).
$clearsBearer = false;
foreach ($headers['set-cookie'] ?? [] as $cookie) {
if (str_starts_with($cookie, 'BEARER=')
&& (str_contains($cookie, 'BEARER=deleted') || str_contains($cookie, 'Max-Age=0'))
) {
$clearsBearer = true;
}
}
self::assertTrue($clearsBearer, 'Le cookie BEARER doit etre efface au logout.');
}
}