import { render, screen } from "@testing-library/react"; import type { ReactNode } from "react"; import type { SessionContextValue } from "next-auth/react"; import { describe, expect, it, vi } from "vitest"; import AdminPasswordBanner from "./AdminPasswordBanner"; vi.mock("@calcom/lib/hooks/useLocale", () => ({ useLocale: () => ({ t: (key: string) => key, }), })); vi.mock("next/link", () => ({ default: ({ href, children, ...props }: { href: string; children: ReactNode }) => ( {children} ), })); vi.mock("@calcom/ui/components/top-banner", () => ({ TopBanner: ({ text, actions }: { text: string; actions?: ReactNode }) => (
{text} {actions}
), })); function buildSession(overrides?: Partial>): NonNullable< SessionContextValue["data"] > { return { expires: "2099-01-01T00:00:00.000Z", hasValidLicense: true, upId: "usr_test", profileId: 1, user: { id: 1, uuid: "uuid_test", email: "test@example.com", name: "Test User", username: "testuser", role: "INACTIVE_ADMIN", inactiveAdminReason: "both", }, ...overrides, }; } describe("AdminPasswordBanner", () => { it("does not render for non-INACTIVE_ADMIN users", () => { const data = buildSession({ user: { ...buildSession().user, role: "USER" } }); const { container } = render(); expect(container).toBeEmptyDOMElement(); }); it("renders 2FA-only message and links to 2FA settings", () => { const data = buildSession({ user: { ...buildSession().user, inactiveAdminReason: "2fa" } }); render(); expect(screen.getByText("invalid_admin_password_2fa_only")).toBeInTheDocument(); const link = screen.getByRole("link"); expect(link).toHaveAttribute("href", "/settings/security/two-factor-auth"); expect(link).toHaveTextContent("enable_2fa"); }); it("renders password-only message and links to password settings", () => { const data = buildSession({ user: { ...buildSession().user, inactiveAdminReason: "password" } }); render(); expect(screen.getByText("invalid_admin_password_password_only")).toBeInTheDocument(); const link = screen.getByRole("link"); expect(link).toHaveAttribute("href", "/settings/security/password"); expect(link).toHaveTextContent("change_password_admin"); }); it("defaults to both message and password settings when reason is missing", () => { const data = buildSession({ user: { ...buildSession().user, inactiveAdminReason: undefined } }); render(); expect(screen.getByText("invalid_admin_password")).toBeInTheDocument(); const link = screen.getByRole("link"); expect(link).toHaveAttribute("href", "/settings/security/password"); expect(link).toHaveTextContent("change_password_admin"); }); });