import { describe, it, expect, vi, beforeEach } from 'vitest' import { screen } from '@testing-library/react' import userEvent from '@testing-library/user-event' import DefinirMotDePasse from '../../pages/DefinirMotDePasse' import { resetPasswordApi } from '../../services/auth' import { renderWithProviders } from '../renderWithProviders' vi.mock('../../services/auth', () => ({ resetPasswordApi: vi.fn(), })) async function remplir(password, confirmPassword = password) { await userEvent.type(screen.getByLabelText(/^nouveau mot de passe/i), password) await userEvent.type(screen.getByLabelText(/^confirmer/i), confirmPassword) await userEvent.click(screen.getByRole('button', { name: /enregistrer/i })) } describe('DefinirMotDePasse', () => { beforeEach(() => vi.clearAllMocks()) it('affiche les règles du mot de passe', () => { const { container } = renderWithProviders(, { route: '/definir-mot-de-passe/abc' }) expect(container.querySelector('[data-rule="length"]')).toBeInTheDocument() expect(container.querySelector('[data-rule="special"]')).toBeInTheDocument() }) it("refuse un mot de passe sans caractère spécial sans appeler l'API", async () => { renderWithProviders(, { route: '/definir-mot-de-passe/abc' }) await remplir('MonMotDePasse1') expect(screen.getByText(/dont un caractère spécial/i)).toBeInTheDocument() expect(resetPasswordApi).not.toHaveBeenCalled() }) it('propose de demander un nouveau lien quand celui-ci a expiré', async () => { resetPasswordApi.mockRejectedValue(new Error('Lien de réinitialisation invalide ou expiré.')) renderWithProviders(, { route: '/definir-mot-de-passe/abc' }) await remplir('MonMotDePasse1!') expect(await screen.findByRole('link', { name: /demander un nouveau lien/i })).toHaveAttribute('href', '/mot-de-passe-oublie') }) it('envoie un mot de passe conforme', async () => { resetPasswordApi.mockResolvedValue({ message: 'ok' }) renderWithProviders(, { route: '/definir-mot-de-passe/abc' }) await remplir('MonMotDePasse1!') expect(resetPasswordApi).toHaveBeenCalledWith( expect.objectContaining({ password: 'MonMotDePasse1!', confirmPassword: 'MonMotDePasse1!' }) ) }) })