Frontend verify / commits (push) Skipped
Frontend verify / commits (pull_request) Failing after 40s
Frontend verify / security (pull_request) Skipped
Frontend verify / verify (pull_request) Skipped
Frontend verify / security (push) Successful in 11s
Frontend verify / verify (push) Failing after 7m35s
109 lines
3.9 KiB
TypeScript
109 lines
3.9 KiB
TypeScript
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(
|
|
<MantineProvider>
|
|
<MemoryRouter>
|
|
<AuthForm onSubmit={onSubmit} register />
|
|
</MemoryRouter>
|
|
</MantineProvider>,
|
|
);
|
|
|
|
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<void>();
|
|
const onSubmit = vi.fn(() => promise);
|
|
render(
|
|
<MantineProvider>
|
|
<MemoryRouter>
|
|
<AuthForm
|
|
onSubmit={onSubmit}
|
|
register={_mode === "register"}
|
|
/>
|
|
</MemoryRouter>
|
|
</MantineProvider>,
|
|
);
|
|
|
|
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(
|
|
<MantineProvider>
|
|
<MemoryRouter>
|
|
<AuthForm onSubmit={onSubmit} register={mode === "register"} />
|
|
</MemoryRouter>
|
|
</MantineProvider>,
|
|
);
|
|
|
|
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);
|
|
});
|
|
});
|