Le dépôt sortait 7 erreurs eslint au début de cette série de correctifs, dont certaines antérieures. Il n'en reste aucune. - Dashboard et Users appelaient setState de façon synchrone dans un effet, ce qui provoque des rendus en cascade. Le chargement initial passe par une fonction asynchrone qui n'écrit qu'après l'await, avec annulation au démontage. Sur le Dashboard, l'indicateur de chargement est allumé par les gestionnaires d'événement, et le bouton Actualiser relance l'effet via un compteur plutôt qu'en appelant le chargement. - L'import ExternalLink de Documentation.jsx n'était pas utilisé. - AuthContext.jsx exportait à la fois un composant, le contexte et un hook, ce qui désactivait le rafraîchissement à chaud de Vite pour ce fichier. Le contexte et le hook vivent désormais dans leurs propres modules ; les 5 fichiers concernés sont mis à jour.
51 lines
1.6 KiB
React
51 lines
1.6 KiB
React
/* Tests du contexte d'authentification : login / logout */
|
|
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
import { renderHook, act } from '@testing-library/react';
|
|
import { AuthProvider } from '../context/AuthContext';
|
|
import { useAuth } from '../context/useAuth';
|
|
import * as api from '../services/api';
|
|
|
|
describe('AuthContext', () => {
|
|
beforeEach(() => {
|
|
localStorage.clear();
|
|
vi.restoreAllMocks();
|
|
});
|
|
|
|
afterEach(() => {
|
|
vi.restoreAllMocks();
|
|
});
|
|
|
|
function wrapper({ children }) {
|
|
return <AuthProvider>{children}</AuthProvider>;
|
|
}
|
|
|
|
it('login renseigne l\'utilisateur, logout le vide', async () => {
|
|
const fakeUser = { username: 'bob', role: 'Consultant' };
|
|
vi.spyOn(api, 'login').mockResolvedValue(fakeUser);
|
|
const clearSpy = vi.spyOn(api, 'clearToken').mockImplementation(() => {});
|
|
|
|
const { result } = renderHook(() => useAuth(), { wrapper });
|
|
|
|
expect(result.current.user).toBeNull();
|
|
expect(result.current.isAuthenticated).toBe(false);
|
|
|
|
await act(async () => {
|
|
await result.current.login('bob', 'pwd');
|
|
});
|
|
|
|
expect(result.current.user).toEqual(fakeUser);
|
|
expect(result.current.isAuthenticated).toBe(true);
|
|
/* L'utilisateur est persisté dans le localStorage */
|
|
expect(JSON.parse(localStorage.getItem('ds_user'))).toEqual(fakeUser);
|
|
|
|
act(() => {
|
|
result.current.logout();
|
|
});
|
|
|
|
expect(result.current.user).toBeNull();
|
|
expect(result.current.isAuthenticated).toBe(false);
|
|
expect(localStorage.getItem('ds_user')).toBeNull();
|
|
expect(clearSpy).toHaveBeenCalled();
|
|
});
|
|
});
|