124 lines
2.8 KiB
TypeScript
124 lines
2.8 KiB
TypeScript
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: [],
|
|
},
|
|
])
|
|
})
|
|
})
|