import { MantineProvider } from "@mantine/core"; import { fireEvent, render, screen, waitFor } from "@testing-library/react"; import { MemoryRouter } from "react-router"; import { describe, expect, it, vi } from "vitest"; import { AuthForm } from "./AuthForm"; describe("AuthForm", () => { it("does not submit registration when password confirmation differs", async () => { const onSubmit = vi.fn(); render( , ); fireEvent.change(screen.getByLabelText("Email"), { target: { value: "user@example.com" }, }); fireEvent.change(screen.getByLabelText("Пароль"), { target: { value: "a secure password" }, }); fireEvent.change(screen.getByLabelText("Подтвердите пароль"), { target: { value: "another secure password" }, }); fireEvent.click(screen.getByRole("button", { name: "Регистрация" })); await waitFor(() => expect(onSubmit).not.toHaveBeenCalled()); expect(await screen.findByText("Пароли не совпадают")).toBeInTheDocument(); }); it.each([ ["register", "Регистрация", "Уже есть аккаунт? Войти"], ["login", "Вход", "Нет аккаунта? Зарегистрироваться"], ])("blocks the switch-auth link while %s is submitting", async (_mode, submitLabel, linkLabel) => { const { promise, resolve } = Promise.withResolvers(); const onSubmit = vi.fn(() => promise); render( , ); fireEvent.change(screen.getByLabelText("Email"), { target: { value: "user@example.com" }, }); fireEvent.change(screen.getByLabelText("Пароль"), { target: { value: "a secure password" }, }); if (_mode === "register") { fireEvent.change(screen.getByLabelText("Подтвердите пароль"), { target: { value: "a secure password" }, }); } fireEvent.click(screen.getByRole("button", { name: submitLabel })); await waitFor(() => expect(onSubmit).toHaveBeenCalled()); expect(screen.queryByRole("link", { name: linkLabel })).not.toBeInTheDocument(); expect(screen.getByRole("button", { name: linkLabel })).toBeDisabled(); resolve(); await screen.findByRole("link", { name: linkLabel }); }); // Register policy is 8..72 printable ASCII; login accepts legacy passwords. it.each([ ["register", "Регистрация", "пароль-пароль", false], ["register", "Регистрация", "passw😀rd", false], ["register", "Регистрация", "a".repeat(7), false], ["register", "Регистрация", "a".repeat(8), true], ["register", "Регистрация", "a".repeat(72), true], ["register", "Регистрация", "a".repeat(73), false], ["login", "Вход", "пароль-пароль", true], ])("%s submits password %j: %s", async (mode, submitLabel, password, submitted) => { const onSubmit = vi.fn().mockResolvedValue(undefined); render( , ); fireEvent.change(screen.getByLabelText("Email"), { target: { value: "user@example.com" } }); fireEvent.change(screen.getByLabelText("Пароль"), { target: { value: password } }); if (mode === "register") { fireEvent.change(screen.getByLabelText("Подтвердите пароль"), { target: { value: password } }); } fireEvent.click(screen.getByRole("button", { name: submitLabel })); await waitFor(() => expect( screen.queryByText(/Пароль: от 8 до 72 символов/) === null, ).toBe(submitted)); expect(onSubmit).toHaveBeenCalledTimes(submitted ? 1 : 0); }); });