b3a7f98e5a
CI / E2E Cloudflare (4/8) (push) Failing after 0s
CI / E2E Cloudflare (8/8) (push) Failing after 1s
CI / Lint (push) Failing after 1s
Auto Extract / Extract (push) Failing after 4s
CI / Version Check (push) Failing after 9s
CI / Integration Tests (push) Failing after 1s
CI / E2E tests (1/8) (push) Failing after 1s
CI / E2E tests (2/8) (push) Failing after 2s
CI / E2E tests (3/8) (push) Failing after 2s
CI / Browser Tests (push) Failing after 1s
CI / E2E tests (5/8) (push) Failing after 1s
CI / E2E Cloudflare (2/8) (push) Failing after 2s
CI / Typecheck (push) Failing after 1s
CI / Changeset Validation (push) Failing after 2s
CI / E2E Cloudflare (5/8) (push) Failing after 1s
CI / E2E Cloudflare (6/8) (push) Failing after 1s
CI / E2E Cloudflare (7/8) (push) Failing after 1s
CodeQL / Analyze (javascript-typescript) (push) Failing after 1s
Format / Format (push) Failing after 0s
CodeQL / Analyze (actions) (push) Failing after 4s
CI / E2E tests (4/8) (push) Failing after 1s
CI / E2E tests (6/8) (push) Failing after 1s
CI / E2E tests (7/8) (push) Failing after 2s
CI / E2E tests (8/8) (push) Failing after 1s
CI / E2E Cloudflare (1/8) (push) Failing after 1s
CI / E2E Cloudflare (3/8) (push) Failing after 2s
Preview Releases / Publish Preview (push) Failing after 0s
zizmor / Run zizmor (push) Failing after 1s
Release / Release (push) Failing after 2s
CI / Smoke Tests (push) Failing after 5m36s
CI / Tests (push) Failing after 6m36s
Release / Sync Templates (push) Has been skipped
CI / E2E Tests (push) Has been cancelled
86 lines
3.1 KiB
TypeScript
86 lines
3.1 KiB
TypeScript
import { userEvent } from "@vitest/browser/context";
|
|
import * as React from "react";
|
|
import { describe, it, expect, vi } from "vitest";
|
|
|
|
import { InviteUserModal } from "../../../src/components/users/InviteUserModal";
|
|
import { render } from "../../utils/render";
|
|
|
|
const noop = () => {};
|
|
|
|
describe("InviteUserModal", () => {
|
|
it("shows email input and role select when open", async () => {
|
|
const screen = await render(
|
|
<InviteUserModal open={true} onOpenChange={noop} onInvite={noop} />,
|
|
);
|
|
await expect.element(screen.getByLabelText("Email address")).toBeInTheDocument();
|
|
await expect.element(screen.getByLabelText("Role")).toBeInTheDocument();
|
|
});
|
|
|
|
it("default role is Author (30)", async () => {
|
|
const screen = await render(
|
|
<InviteUserModal open={true} onOpenChange={noop} onInvite={noop} />,
|
|
);
|
|
// The select should display "Author" as the selected value
|
|
await expect.element(screen.getByText("Author")).toBeInTheDocument();
|
|
});
|
|
|
|
it("submit calls onInvite with email and role", async () => {
|
|
const onInvite = vi.fn();
|
|
const screen = await render(
|
|
<InviteUserModal open={true} onOpenChange={noop} onInvite={onInvite} />,
|
|
);
|
|
const emailInput = screen.getByLabelText("Email address");
|
|
await userEvent.type(emailInput, "new@example.com");
|
|
const submitButton = screen.getByText("Send Invite").element().closest("button")!;
|
|
submitButton.click();
|
|
expect(onInvite).toHaveBeenCalledWith("new@example.com", 30);
|
|
});
|
|
|
|
it("submit button disabled when email is empty", async () => {
|
|
const screen = await render(
|
|
<InviteUserModal open={true} onOpenChange={noop} onInvite={noop} />,
|
|
);
|
|
const submitButton = screen.getByText("Send Invite").element().closest("button")!;
|
|
expect(submitButton.disabled).toBe(true);
|
|
});
|
|
|
|
it("submit button disabled when isSending", async () => {
|
|
const screen = await render(
|
|
<InviteUserModal open={true} isSending={true} onOpenChange={noop} onInvite={noop} />,
|
|
);
|
|
const submitButton = screen.getByText("Sending...").element().closest("button")!;
|
|
expect(submitButton.disabled).toBe(true);
|
|
});
|
|
|
|
it("shows error message when error prop provided", async () => {
|
|
const screen = await render(
|
|
<InviteUserModal
|
|
open={true}
|
|
error="Email already exists"
|
|
onOpenChange={noop}
|
|
onInvite={noop}
|
|
/>,
|
|
);
|
|
await expect.element(screen.getByText("Email already exists")).toBeInTheDocument();
|
|
});
|
|
|
|
it("form resets when modal opens", async () => {
|
|
const result = await render(
|
|
<InviteUserModal open={false} onOpenChange={noop} onInvite={noop} />,
|
|
);
|
|
// Open the modal - the effect should reset email to "" and role to 30
|
|
await result.rerender(<InviteUserModal open={true} onOpenChange={noop} onInvite={noop} />);
|
|
await expect.element(result.getByLabelText("Email address")).toHaveValue("");
|
|
});
|
|
|
|
it("cancel button closes modal", async () => {
|
|
const onOpenChange = vi.fn();
|
|
const screen = await render(
|
|
<InviteUserModal open={true} onOpenChange={onOpenChange} onInvite={noop} />,
|
|
);
|
|
const cancelButton = screen.getByText("Cancel").element().closest("button")!;
|
|
cancelButton.click();
|
|
expect(onOpenChange).toHaveBeenCalledWith(false);
|
|
});
|
|
});
|