feat(core) : footer sidebar — compte connecté + déconnexion inline + version

Déconnexion déplacée du menu vers le footer (compte connecté au survol +
version). useLogout() appelle clearSession() (reset des stores singletons via
onAuthSessionCleared) puis redirige vers /login, sans page /logout intermédiaire.
This commit is contained in:
2026-06-29 10:24:57 +02:00
parent d5bbe8afd9
commit d6a40e4843
10 changed files with 120 additions and 62 deletions
+7 -2
View File
@@ -1,5 +1,6 @@
import { expect, test } from '@playwright/test'
import { LoginPage } from '../helpers/pages/LoginPage'
import { SidebarComponent } from '../helpers/pages/SidebarComponent'
import { getPersona } from '../_fixtures/personas'
/**
@@ -53,8 +54,12 @@ test.describe('Login', () => {
await loginPage.fillAndSubmit(superAdmin.username, superAdmin.password)
await page.waitForURL('/')
// 2. Navigation vers /logout (il y a un lien "Deconnexion" dans la sidebar)
await page.goto('/logout')
// 2. Deconnexion via le footer de la sidebar : survol du bloc compte
// (revele le bouton) puis clic. Le handler appelle useLogout() qui POST
// /api/logout, reset les stores, et redirige vers /login (sans page /logout).
const sidebar = new SidebarComponent(page)
await sidebar.accountBlock().hover()
await sidebar.logoutButton().click()
await page.waitForURL(/\/login$/)
// 3. Le cookie BEARER doit avoir ete supprime par le firewall de logout
@@ -27,7 +27,21 @@ export class SidebarComponent {
return this.page.locator('a[href="/"]').first()
}
logoutLink(): Locator {
return this.page.locator('a[href="/logout"]')
/**
* Bloc « compte connecte » du footer de la sidebar. Cible de survol qui
* revele le bouton de deconnexion (la deconnexion n'est plus un item de nav
* `/logout` mais un lien du footer, cf. default.vue + useLogout).
*/
accountBlock(): Locator {
return this.page.locator('[data-test="sidebar-account"]')
}
/**
* Bouton de deconnexion du footer (revele au survol du bloc compte en mode
* deplie, ou directement la pastille en mode replie). Selecteur par
* `data-test` : stable au renommage/retraduction du label.
*/
logoutButton(): Locator {
return this.page.locator('[data-test="sidebar-logout"]')
}
}
@@ -72,7 +72,10 @@ test.describe('Sidebar visibility', () => {
// Meme strategie que ci-dessus : ancrage semantique plutot que
// `networkidle` pour eviter les faux timeouts en CI.
await expect(sidebar.accountDashboardLink()).toBeVisible({ timeout: 10000 })
await expect(sidebar.logoutLink()).toBeVisible()
// La deconnexion vit dans le footer (rendu sans condition de permission).
// Le bouton est revele au survol du bloc compte.
await sidebar.accountBlock().hover()
await expect(sidebar.logoutButton()).toBeVisible()
})
test('la liste des personas dans personas.ts couvre toutes les combinaisons admin attendues', () => {