diff --git a/src/app/admin/quick-modals.test.tsx b/src/app/admin/quick-modals.test.tsx new file mode 100644 index 0000000..59a91c4 --- /dev/null +++ b/src/app/admin/quick-modals.test.tsx @@ -0,0 +1,149 @@ +import { describe, expect, it, vi, beforeEach } from "vitest" +import type { ReactElement } from "react" + +import { AdminDevicesOverview } from "@/components/admin/devices/admin-devices-overview" +import { AdminCompaniesManager } from "@/components/admin/companies/admin-companies-manager" +import { AdminUsersWorkspace } from "@/components/admin/users/admin-users-workspace" + +// Shared mocks for server-side helpers +const requireStaffSession = vi.fn() +const fetchCompaniesByTenant = vi.fn() +const normalizeCompany = vi.fn((c) => c) +const prismaUserFindMany = vi.fn() +const prismaAuthUserFindMany = vi.fn() +const prismaAuthSessionFindMany = vi.fn() + +vi.mock("@/lib/auth-server", () => ({ + requireStaffSession, +})) + +vi.mock("@/server/company-service", () => ({ + fetchCompaniesByTenant, + normalizeCompany, +})) + +vi.mock("@/lib/prisma", () => ({ + prisma: { + user: { findMany: prismaUserFindMany }, + authUser: { findMany: prismaAuthUserFindMany }, + authSession: { findMany: prismaAuthSessionFindMany }, + }, +})) + +// Helpers +function getSingleChild(element: ReactElement): ReactElement { + const child = (element.props as { children?: ReactElement | ReactElement[] }).children + if (!child) throw new Error("Expected element to have children") + return Array.isArray(child) ? child[0] : child +} + +describe("admin quick actions -> auto-open flags", () => { + describe("devices page", () => { + it("passes autoOpenCreateDevice=true when quick=new-device", async () => { + const { default: AdminDevicesPage } = await import("./devices/page") + + const element = (await AdminDevicesPage({ + searchParams: Promise.resolve({ quick: "new-device" }), + } as unknown as { searchParams: Promise> })) as ReactElement + + const outerDiv = getSingleChild(element) + const overview = getSingleChild(outerDiv) + + expect(overview.type).toBe(AdminDevicesOverview) + expect(overview.props.autoOpenCreateDevice).toBe(true) + }) + + it("passes autoOpenCreateDevice=false when quick is missing", async () => { + const { default: AdminDevicesPage } = await import("./devices/page") + + const element = (await AdminDevicesPage({ + searchParams: Promise.resolve({}), + } as unknown as { searchParams: Promise> })) as ReactElement + + const outerDiv = getSingleChild(element) + const overview = getSingleChild(outerDiv) + + expect(overview.type).toBe(AdminDevicesOverview) + expect(overview.props.autoOpenCreateDevice).toBe(false) + }) + }) + + describe("companies page", () => { + beforeEach(() => { + requireStaffSession.mockResolvedValue({ + user: { tenantId: "tenant-1" }, + }) + fetchCompaniesByTenant.mockResolvedValue([]) + normalizeCompany.mockImplementation((c) => c) + }) + + it("passes autoOpenCreate=true when quick=new-company", async () => { + const { default: AdminCompaniesPage } = await import("./companies/page") + + const element = (await AdminCompaniesPage({ + searchParams: Promise.resolve({ quick: "new-company" }), + } as unknown as { searchParams: Promise> })) as ReactElement + + const outerDiv = getSingleChild(element) + const manager = getSingleChild(outerDiv) + + expect(manager.type).toBe(AdminCompaniesManager) + expect(manager.props.autoOpenCreate).toBe(true) + }) + + it("passes autoOpenCreate=false when quick is missing", async () => { + const { default: AdminCompaniesPage } = await import("./companies/page") + + const element = (await AdminCompaniesPage({ + searchParams: Promise.resolve({}), + } as unknown as { searchParams: Promise> })) as ReactElement + + const outerDiv = getSingleChild(element) + const manager = getSingleChild(outerDiv) + + expect(manager.type).toBe(AdminCompaniesManager) + expect(manager.props.autoOpenCreate).toBe(false) + }) + }) + + describe("users page", () => { + beforeEach(() => { + requireStaffSession.mockResolvedValue({ + user: { tenantId: "tenant-1" }, + }) + prismaUserFindMany.mockResolvedValue([]) + prismaAuthUserFindMany.mockResolvedValue([]) + prismaAuthSessionFindMany.mockResolvedValue([]) + fetchCompaniesByTenant.mockResolvedValue([]) + normalizeCompany.mockImplementation((c) => c) + }) + + it("passes autoOpenCreate=true when quick=new-user", async () => { + const { default: AdminUsersPage } = await import("./users/page") + + const element = (await AdminUsersPage({ + searchParams: Promise.resolve({ quick: "new-user" }), + } as unknown as { searchParams: Promise> })) as ReactElement + + const outerDiv = getSingleChild(element) + const workspace = getSingleChild(outerDiv) + + expect(workspace.type).toBe(AdminUsersWorkspace) + expect(workspace.props.autoOpenCreate).toBe(true) + }) + + it("passes autoOpenCreate=false when quick is missing", async () => { + const { default: AdminUsersPage } = await import("./users/page") + + const element = (await AdminUsersPage({ + searchParams: Promise.resolve({}), + } as unknown as { searchParams: Promise> })) as ReactElement + + const outerDiv = getSingleChild(element) + const workspace = getSingleChild(outerDiv) + + expect(workspace.type).toBe(AdminUsersWorkspace) + expect(workspace.props.autoOpenCreate).toBe(false) + }) + }) +})