/* 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 {children}; } 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(); }); });