122 lines
3.8 KiB
TypeScript
122 lines
3.8 KiB
TypeScript
import { fireEvent, screen, waitFor } from "@testing-library/react";
|
|
import { describe, expect, it, vi } from "vitest";
|
|
import { renderWithProviders } from "../utils/testHelpers";
|
|
import { ResetPasswordPage } from "./reset-password";
|
|
|
|
const mockNavigate = vi.fn();
|
|
|
|
vi.mock("react-i18next", () => ({
|
|
useTranslation: () => ({
|
|
t: (key: string) => key,
|
|
}),
|
|
}));
|
|
|
|
vi.mock("react-router-dom", async () => {
|
|
const actual = await vi.importActual("react-router-dom");
|
|
return {
|
|
...actual,
|
|
useNavigate: () => mockNavigate,
|
|
Link: ({ children, to }: { children: React.ReactNode; to: string }) => (
|
|
<a href={to}>{children}</a>
|
|
),
|
|
};
|
|
});
|
|
|
|
describe("ResetPasswordPage", () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
it("renders without crashing", () => {
|
|
const { container } = renderWithProviders(<ResetPasswordPage />);
|
|
expect(container).toBeInTheDocument();
|
|
});
|
|
|
|
it("renders form with email input", () => {
|
|
renderWithProviders(<ResetPasswordPage />);
|
|
|
|
expect(screen.getByText(/Mot de passe oublié/i)).toBeInTheDocument();
|
|
expect(screen.getByLabelText(/Email/i)).toBeInTheDocument();
|
|
expect(
|
|
screen.getByRole("button", { name: /Réinitialiser le mot de passe/i })
|
|
).toBeInTheDocument();
|
|
});
|
|
|
|
it("displays help text", () => {
|
|
renderWithProviders(<ResetPasswordPage />);
|
|
|
|
expect(screen.getByText(/Entrez votre adresse email/i)).toBeInTheDocument();
|
|
});
|
|
|
|
it("shows link back to login", () => {
|
|
renderWithProviders(<ResetPasswordPage />);
|
|
|
|
const loginLink = screen.getByText(/Retour à la connexion/i);
|
|
expect(loginLink).toBeInTheDocument();
|
|
});
|
|
|
|
it("updates email input on change", () => {
|
|
renderWithProviders(<ResetPasswordPage />);
|
|
|
|
const emailInput = screen.getByLabelText(/Email/i) as HTMLInputElement;
|
|
fireEvent.change(emailInput, { target: { value: "test@example.com" } });
|
|
|
|
expect(emailInput.value).toBe("test@example.com");
|
|
});
|
|
|
|
it.skip("submits form and shows success message", async () => {
|
|
renderWithProviders(<ResetPasswordPage />);
|
|
|
|
const emailInput = screen.getByLabelText(/Email/i);
|
|
const submitButton = screen.getByRole("button", { name: /Réinitialiser le mot de passe/i });
|
|
|
|
fireEvent.change(emailInput, { target: { value: "test@example.com" } });
|
|
fireEvent.click(submitButton);
|
|
|
|
await waitFor(() => {
|
|
expect(screen.getByText(/Email envoyé/i)).toBeInTheDocument();
|
|
});
|
|
});
|
|
|
|
it.skip("displays email in success message", async () => {
|
|
renderWithProviders(<ResetPasswordPage />);
|
|
|
|
const emailInput = screen.getByLabelText(/Email/i);
|
|
const submitButton = screen.getByRole("button", { name: /Réinitialiser le mot de passe/i });
|
|
|
|
fireEvent.change(emailInput, { target: { value: "test@example.com" } });
|
|
fireEvent.click(submitButton);
|
|
|
|
await waitFor(() => {
|
|
expect(screen.getByText(/test@example.com/i)).toBeInTheDocument();
|
|
});
|
|
});
|
|
|
|
it.skip("shows return to login button in success state", async () => {
|
|
renderWithProviders(<ResetPasswordPage />);
|
|
|
|
const emailInput = screen.getByLabelText(/Email/i);
|
|
const submitButton = screen.getByRole("button", { name: /Réinitialiser le mot de passe/i });
|
|
|
|
fireEvent.change(emailInput, { target: { value: "test@example.com" } });
|
|
fireEvent.click(submitButton);
|
|
|
|
await waitFor(() => {
|
|
expect(screen.getByRole("button", { name: /Retour à la connexion/i })).toBeInTheDocument();
|
|
});
|
|
});
|
|
|
|
it("requires email field to be filled", () => {
|
|
renderWithProviders(<ResetPasswordPage />);
|
|
|
|
const emailInput = screen.getByLabelText(/Email/i);
|
|
expect(emailInput).toHaveAttribute("required");
|
|
});
|
|
|
|
it("requires valid email format", () => {
|
|
renderWithProviders(<ResetPasswordPage />);
|
|
|
|
const emailInput = screen.getByLabelText(/Email/i);
|
|
expect(emailInput).toHaveAttribute("type", "email");
|
|
});
|
|
});
|