import { beforeEach, describe, expect, it, vi } from "vitest" const { mockDb } = vi.hoisted(() => ({ mockDb: { page: { create: vi.fn(), update: vi.fn(), delete: vi.fn(), findUnique: vi.fn(), findMany: vi.fn(), }, navigationMenu: { create: vi.fn(), findMany: vi.fn(), findFirst: vi.fn(), }, navigationItem: { create: vi.fn(), update: vi.fn(), delete: vi.fn(), }, }, })) vi.mock("./client", () => ({ db: mockDb, })) import { createNavigationItem, createNavigationMenu, createPage, listPublicNavigation, updatePage, } from "./pages-navigation" describe("pages-navigation service", () => { beforeEach(() => { for (const value of Object.values(mockDb)) { for (const fn of Object.values(value)) { if (typeof fn === "function") { fn.mockReset() } } } }) it("creates published pages with publishedAt", async () => { mockDb.page.create.mockResolvedValue({ id: "page-1" }) await createPage({ title: "About", slug: "about", status: "published", content: "hello", }) expect(mockDb.page.create).toHaveBeenCalledTimes(1) expect(mockDb.page.create.mock.calls[0]?.[0].data.publishedAt).toBeInstanceOf(Date) }) it("updates page status publication timestamp", async () => { mockDb.page.update.mockResolvedValue({ id: "page-1" }) await updatePage({ id: "550e8400-e29b-41d4-a716-446655440000", status: "draft", }) expect(mockDb.page.update).toHaveBeenCalledTimes(1) expect(mockDb.page.update.mock.calls[0]?.[0].data.publishedAt).toBeNull() }) it("creates menus and items with schema parsing", async () => { mockDb.navigationMenu.create.mockResolvedValue({ id: "menu-1" }) mockDb.navigationItem.create.mockResolvedValue({ id: "item-1" }) await createNavigationMenu({ name: "Primary", slug: "primary", location: "header", }) await createNavigationItem({ menuId: "550e8400-e29b-41d4-a716-446655440001", label: "Home", href: "/", sortOrder: 0, }) expect(mockDb.navigationMenu.create).toHaveBeenCalledTimes(1) expect(mockDb.navigationItem.create).toHaveBeenCalledTimes(1) }) it("maps public navigation href from linked pages", async () => { mockDb.navigationMenu.findFirst.mockResolvedValue({ id: "menu-1", items: [ { id: "item-1", label: "Home", href: null, parentId: null, page: { slug: "home", status: "published", }, }, ], }) const navigation = await listPublicNavigation("header") expect(navigation).toEqual([ { id: "item-1", label: "Home", href: "/", children: [], }, ]) }) })