Files
old.cms.fellies.org/packages/db/src/settings.test.ts

93 lines
2.2 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from "vitest"
const { mockDb } = vi.hoisted(() => ({
mockDb: {
systemSetting: {
findUnique: vi.fn(),
upsert: vi.fn(),
},
},
}))
vi.mock("./client", () => ({
db: mockDb,
}))
import {
getPublicHeaderBanner,
getPublicHeaderBannerConfig,
isAdminSelfRegistrationEnabled,
setPublicHeaderBannerConfig,
} from "./settings"
describe("settings service", () => {
const previousEnv = process.env.CMS_ADMIN_SELF_REGISTRATION_ENABLED
beforeEach(() => {
mockDb.systemSetting.findUnique.mockReset()
mockDb.systemSetting.upsert.mockReset()
process.env.CMS_ADMIN_SELF_REGISTRATION_ENABLED = previousEnv
})
it("falls back to env flag when registration setting is missing", async () => {
process.env.CMS_ADMIN_SELF_REGISTRATION_ENABLED = "true"
mockDb.systemSetting.findUnique.mockResolvedValue(null)
const enabled = await isAdminSelfRegistrationEnabled()
expect(enabled).toBe(true)
})
it("reads active public header banner payload", async () => {
mockDb.systemSetting.findUnique.mockResolvedValue({
value: JSON.stringify({
enabled: true,
message: "Commissions open",
ctaLabel: "Book now",
ctaHref: "/contact",
}),
})
const banner = await getPublicHeaderBanner()
expect(banner).toEqual({
message: "Commissions open",
ctaLabel: "Book now",
ctaHref: "/contact",
})
})
it("returns a disabled default config for invalid data", async () => {
mockDb.systemSetting.findUnique.mockResolvedValue({
value: "not-json",
})
const config = await getPublicHeaderBannerConfig()
expect(config).toEqual({
enabled: false,
message: "",
ctaLabel: null,
ctaHref: null,
})
})
it("writes banner config to system settings", async () => {
mockDb.systemSetting.upsert.mockResolvedValue({})
await setPublicHeaderBannerConfig({
enabled: true,
message: "Holiday schedule",
ctaLabel: "Details",
ctaHref: "/news",
})
expect(mockDb.systemSetting.upsert).toHaveBeenCalledTimes(1)
expect(mockDb.systemSetting.upsert.mock.calls[0]?.[0]).toMatchObject({
where: {
key: "public.header_banner",
},
})
})
})