Files
wehub-resource-sync 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
chore: import upstream snapshot with attribution
2026-07-13 12:23:53 +08:00

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);
});
});