diff --git a/src/actions/admin-applications.test.ts b/src/actions/admin-applications.test.ts new file mode 100644 index 0000000000..9bbcc8f7d4 --- /dev/null +++ b/src/actions/admin-applications.test.ts @@ -0,0 +1,39 @@ +// @ts-nocheck + +import { revalidatePath } from "next/cache"; +import { redirect } from "next/navigation"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { requirePermission } from "@/lib/admin/guard"; +import { PERMS } from "@/lib/permissions"; +import { prisma } from "@/lib/prisma"; +import { logStaffActivity } from "@/lib/services/staff-activity"; +import { reviewApplication } from "./admin-applications"; + +vi.mock("@/lib/admin/guard", () => ({ requirePermission: vi.fn() })); +vi.mock("@/lib/permissions", () => ({ + PERMS: { PAGES_EDIT: "pages.edit", USERS_EDIT: "users.edit" }, +})); +vi.mock("@/lib/prisma", () => ({ + prisma: { websiteSettings: { upsert: vi.fn() } }, +})); +vi.mock("@/lib/services/staff-activity", () => ({ logStaffActivity: vi.fn() })); +vi.mock("next/cache", () => ({ revalidatePath: vi.fn() })); +vi.mock("next/navigation", () => ({ redirect: vi.fn() })); + +const staff = { id: 1, rank: 7, username: "admin" }; +const fakeForm = (data: Record) => ({ + get: (k: string) => data[k] ?? null, +}); + +beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(requirePermission).mockResolvedValue(staff as never); + vi.mocked(prisma.websiteSettings.upsert).mockResolvedValue({} as never); +}); + +describe("application", () => { + it("saves settings", async () => { + await reviewApplication(fakeForm({ value: "test" }) as unknown as FormData); + expect(prisma.websiteSettings.upsert).toHaveBeenCalled(); + }); +}); diff --git a/src/actions/admin-articles.test.ts b/src/actions/admin-articles.test.ts new file mode 100644 index 0000000000..4f769fa971 --- /dev/null +++ b/src/actions/admin-articles.test.ts @@ -0,0 +1,39 @@ +// @ts-nocheck + +import { revalidatePath } from "next/cache"; +import { redirect } from "next/navigation"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { requirePermission } from "@/lib/admin/guard"; +import { PERMS } from "@/lib/permissions"; +import { prisma } from "@/lib/prisma"; +import { logStaffActivity } from "@/lib/services/staff-activity"; +import { saveArticle } from "./admin-articles"; + +vi.mock("@/lib/admin/guard", () => ({ requirePermission: vi.fn() })); +vi.mock("@/lib/permissions", () => ({ + PERMS: { PAGES_EDIT: "pages.edit", USERS_EDIT: "users.edit" }, +})); +vi.mock("@/lib/prisma", () => ({ + prisma: { websiteSettings: { upsert: vi.fn() } }, +})); +vi.mock("@/lib/services/staff-activity", () => ({ logStaffActivity: vi.fn() })); +vi.mock("next/cache", () => ({ revalidatePath: vi.fn() })); +vi.mock("next/navigation", () => ({ redirect: vi.fn() })); + +const staff = { id: 1, rank: 7, username: "admin" }; +const fakeForm = (data: Record) => ({ + get: (k: string) => data[k] ?? null, +}); + +beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(requirePermission).mockResolvedValue(staff as never); + vi.mocked(prisma.websiteSettings.upsert).mockResolvedValue({} as never); +}); + +describe("article", () => { + it("saves settings", async () => { + await saveArticle(fakeForm({ value: "test" }) as unknown as FormData); + expect(prisma.websiteSettings.upsert).toHaveBeenCalled(); + }); +}); diff --git a/src/actions/admin-autodj.test.ts b/src/actions/admin-autodj.test.ts new file mode 100644 index 0000000000..dfeaca219b --- /dev/null +++ b/src/actions/admin-autodj.test.ts @@ -0,0 +1,46 @@ +// @ts-nocheck + +import { revalidatePath } from "next/cache"; +import { redirect } from "next/navigation"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { requirePermission } from "@/lib/admin/guard"; +import { PERMS } from "@/lib/permissions"; +import { prisma } from "@/lib/prisma"; +import { logStaffActivity } from "@/lib/services/staff-activity"; +import { saveAutodj } from "./admin-autodj"; + +vi.mock("@/lib/admin/guard", () => ({ requirePermission: vi.fn() })); +vi.mock("@/lib/permissions", () => ({ + PERMS: { + PAGES_EDIT: "pages.edit", + USERS_EDIT: "users.edit", + SETTINGS_EDIT: "settings.edit", + }, +})); +vi.mock("@/lib/prisma", () => ({ + prisma: { + websiteSettings: { upsert: vi.fn() }, + websiteShopItems: { create: vi.fn(), update: vi.fn() }, + }, +})); +vi.mock("@/lib/services/staff-activity", () => ({ logStaffActivity: vi.fn() })); +vi.mock("next/cache", () => ({ revalidatePath: vi.fn() })); +vi.mock("next/navigation", () => ({ redirect: vi.fn() })); + +const staff = { id: 1, rank: 7, username: "admin" }; +const fakeForm = (data: Record) => ({ + get: (k: string) => data[k] ?? null, +}); + +beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(requirePermission).mockResolvedValue(staff as never); + vi.mocked(prisma.websiteSettings.upsert).mockResolvedValue({} as never); +}); + +describe("autodj", () => { + it("saves settings and redirects", async () => { + await saveAutodj(fakeForm({ enabled: "1" }) as unknown as FormData); + expect(revalidatePath).toHaveBeenCalled(); + }); +}); diff --git a/src/actions/admin-email-templates.test.ts b/src/actions/admin-email-templates.test.ts new file mode 100644 index 0000000000..99af1540fd --- /dev/null +++ b/src/actions/admin-email-templates.test.ts @@ -0,0 +1,39 @@ +// @ts-nocheck + +import { revalidatePath } from "next/cache"; +import { redirect } from "next/navigation"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { requirePermission } from "@/lib/admin/guard"; +import { PERMS } from "@/lib/permissions"; +import { prisma } from "@/lib/prisma"; +import { logStaffActivity } from "@/lib/services/staff-activity"; +import { saveEmailTemplate } from "./admin-email-templates"; + +vi.mock("@/lib/admin/guard", () => ({ requirePermission: vi.fn() })); +vi.mock("@/lib/permissions", () => ({ + PERMS: { PAGES_EDIT: "pages.edit", USERS_EDIT: "users.edit" }, +})); +vi.mock("@/lib/prisma", () => ({ + prisma: { websiteSettings: { upsert: vi.fn() } }, +})); +vi.mock("@/lib/services/staff-activity", () => ({ logStaffActivity: vi.fn() })); +vi.mock("next/cache", () => ({ revalidatePath: vi.fn() })); +vi.mock("next/navigation", () => ({ redirect: vi.fn() })); + +const staff = { id: 1, rank: 7, username: "admin" }; +const fakeForm = (data: Record) => ({ + get: (k: string) => data[k] ?? null, +}); + +beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(requirePermission).mockResolvedValue(staff as never); + vi.mocked(prisma.websiteSettings.upsert).mockResolvedValue({} as never); +}); + +describe("emailtemplate", () => { + it("saves settings", async () => { + await saveEmailTemplate(fakeForm({ value: "test" }) as unknown as FormData); + expect(prisma.websiteSettings.upsert).toHaveBeenCalled(); + }); +}); diff --git a/src/actions/admin-help-tickets.test.ts b/src/actions/admin-help-tickets.test.ts new file mode 100644 index 0000000000..b2e9e741cf --- /dev/null +++ b/src/actions/admin-help-tickets.test.ts @@ -0,0 +1,39 @@ +// @ts-nocheck + +import { revalidatePath } from "next/cache"; +import { redirect } from "next/navigation"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { requirePermission } from "@/lib/admin/guard"; +import { PERMS } from "@/lib/permissions"; +import { prisma } from "@/lib/prisma"; +import { logStaffActivity } from "@/lib/services/staff-activity"; +import { resolveTicket } from "./admin-help-tickets"; + +vi.mock("@/lib/admin/guard", () => ({ requirePermission: vi.fn() })); +vi.mock("@/lib/permissions", () => ({ + PERMS: { PAGES_EDIT: "pages.edit", USERS_EDIT: "users.edit" }, +})); +vi.mock("@/lib/prisma", () => ({ + prisma: { websiteSettings: { upsert: vi.fn() } }, +})); +vi.mock("@/lib/services/staff-activity", () => ({ logStaffActivity: vi.fn() })); +vi.mock("next/cache", () => ({ revalidatePath: vi.fn() })); +vi.mock("next/navigation", () => ({ redirect: vi.fn() })); + +const staff = { id: 1, rank: 7, username: "admin" }; +const fakeForm = (data: Record) => ({ + get: (k: string) => data[k] ?? null, +}); + +beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(requirePermission).mockResolvedValue(staff as never); + vi.mocked(prisma.websiteSettings.upsert).mockResolvedValue({} as never); +}); + +describe("helpticket", () => { + it("saves settings", async () => { + await resolveTicket(fakeForm({ value: "test" }) as unknown as FormData); + expect(prisma.websiteSettings.upsert).toHaveBeenCalled(); + }); +}); diff --git a/src/actions/admin-housekeeping.test.ts b/src/actions/admin-housekeeping.test.ts new file mode 100644 index 0000000000..42f2f9b3ac --- /dev/null +++ b/src/actions/admin-housekeeping.test.ts @@ -0,0 +1,39 @@ +// @ts-nocheck + +import { revalidatePath } from "next/cache"; +import { redirect } from "next/navigation"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { requirePermission } from "@/lib/admin/guard"; +import { PERMS } from "@/lib/permissions"; +import { prisma } from "@/lib/prisma"; +import { logStaffActivity } from "@/lib/services/staff-activity"; +import { runHousekeeping } from "./admin-housekeeping"; + +vi.mock("@/lib/admin/guard", () => ({ requirePermission: vi.fn() })); +vi.mock("@/lib/permissions", () => ({ + PERMS: { PAGES_EDIT: "pages.edit", USERS_EDIT: "users.edit" }, +})); +vi.mock("@/lib/prisma", () => ({ + prisma: { websiteSettings: { upsert: vi.fn() } }, +})); +vi.mock("@/lib/services/staff-activity", () => ({ logStaffActivity: vi.fn() })); +vi.mock("next/cache", () => ({ revalidatePath: vi.fn() })); +vi.mock("next/navigation", () => ({ redirect: vi.fn() })); + +const staff = { id: 1, rank: 7, username: "admin" }; +const fakeForm = (data: Record) => ({ + get: (k: string) => data[k] ?? null, +}); + +beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(requirePermission).mockResolvedValue(staff as never); + vi.mocked(prisma.websiteSettings.upsert).mockResolvedValue({} as never); +}); + +describe("housekeeping", () => { + it("saves settings", async () => { + await runHousekeeping(fakeForm({ value: "test" }) as unknown as FormData); + expect(prisma.websiteSettings.upsert).toHaveBeenCalled(); + }); +}); diff --git a/src/actions/admin-marketplace.test.ts b/src/actions/admin-marketplace.test.ts new file mode 100644 index 0000000000..91e5d04c0a --- /dev/null +++ b/src/actions/admin-marketplace.test.ts @@ -0,0 +1,46 @@ +// @ts-nocheck + +import { revalidatePath } from "next/cache"; +import { redirect } from "next/navigation"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { requirePermission } from "@/lib/admin/guard"; +import { PERMS } from "@/lib/permissions"; +import { prisma } from "@/lib/prisma"; +import { logStaffActivity } from "@/lib/services/staff-activity"; +import { saveMarketplace } from "./admin-marketplace"; + +vi.mock("@/lib/admin/guard", () => ({ requirePermission: vi.fn() })); +vi.mock("@/lib/permissions", () => ({ + PERMS: { + PAGES_EDIT: "pages.edit", + USERS_EDIT: "users.edit", + SETTINGS_EDIT: "settings.edit", + }, +})); +vi.mock("@/lib/prisma", () => ({ + prisma: { + websiteSettings: { upsert: vi.fn() }, + websiteShopItems: { create: vi.fn(), update: vi.fn() }, + }, +})); +vi.mock("@/lib/services/staff-activity", () => ({ logStaffActivity: vi.fn() })); +vi.mock("next/cache", () => ({ revalidatePath: vi.fn() })); +vi.mock("next/navigation", () => ({ redirect: vi.fn() })); + +const staff = { id: 1, rank: 7, username: "admin" }; +const fakeForm = (data: Record) => ({ + get: (k: string) => data[k] ?? null, +}); + +beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(requirePermission).mockResolvedValue(staff as never); + vi.mocked(prisma.websiteSettings.upsert).mockResolvedValue({} as never); +}); + +describe("marketplace", () => { + it("saves settings and redirects", async () => { + await saveMarketplace(fakeForm({ enabled: "1" }) as unknown as FormData); + expect(revalidatePath).toHaveBeenCalled(); + }); +}); diff --git a/src/actions/admin-radio-api-keys.test.ts b/src/actions/admin-radio-api-keys.test.ts new file mode 100644 index 0000000000..d07b2f4ae2 --- /dev/null +++ b/src/actions/admin-radio-api-keys.test.ts @@ -0,0 +1,46 @@ +// @ts-nocheck + +import { revalidatePath } from "next/cache"; +import { redirect } from "next/navigation"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { requirePermission } from "@/lib/admin/guard"; +import { PERMS } from "@/lib/permissions"; +import { prisma } from "@/lib/prisma"; +import { logStaffActivity } from "@/lib/services/staff-activity"; +import { saveRadioApiKey } from "./admin-radio-api-keys"; + +vi.mock("@/lib/admin/guard", () => ({ requirePermission: vi.fn() })); +vi.mock("@/lib/permissions", () => ({ + PERMS: { + PAGES_EDIT: "pages.edit", + USERS_EDIT: "users.edit", + SETTINGS_EDIT: "settings.edit", + }, +})); +vi.mock("@/lib/prisma", () => ({ + prisma: { + websiteSettings: { upsert: vi.fn() }, + websiteShopItems: { create: vi.fn(), update: vi.fn() }, + }, +})); +vi.mock("@/lib/services/staff-activity", () => ({ logStaffActivity: vi.fn() })); +vi.mock("next/cache", () => ({ revalidatePath: vi.fn() })); +vi.mock("next/navigation", () => ({ redirect: vi.fn() })); + +const staff = { id: 1, rank: 7, username: "admin" }; +const fakeForm = (data: Record) => ({ + get: (k: string) => data[k] ?? null, +}); + +beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(requirePermission).mockResolvedValue(staff as never); + vi.mocked(prisma.websiteSettings.upsert).mockResolvedValue({} as never); +}); + +describe("radioapikey", () => { + it("saves settings and redirects", async () => { + await saveRadioApiKey(fakeForm({ enabled: "1" }) as unknown as FormData); + expect(revalidatePath).toHaveBeenCalled(); + }); +}); diff --git a/src/actions/admin-radio-extra.test.ts b/src/actions/admin-radio-extra.test.ts new file mode 100644 index 0000000000..99591a0921 --- /dev/null +++ b/src/actions/admin-radio-extra.test.ts @@ -0,0 +1,46 @@ +// @ts-nocheck + +import { revalidatePath } from "next/cache"; +import { redirect } from "next/navigation"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { requirePermission } from "@/lib/admin/guard"; +import { PERMS } from "@/lib/permissions"; +import { prisma } from "@/lib/prisma"; +import { logStaffActivity } from "@/lib/services/staff-activity"; +import { saveRadioExtra } from "./admin-radio-extra"; + +vi.mock("@/lib/admin/guard", () => ({ requirePermission: vi.fn() })); +vi.mock("@/lib/permissions", () => ({ + PERMS: { + PAGES_EDIT: "pages.edit", + USERS_EDIT: "users.edit", + SETTINGS_EDIT: "settings.edit", + }, +})); +vi.mock("@/lib/prisma", () => ({ + prisma: { + websiteSettings: { upsert: vi.fn() }, + websiteShopItems: { create: vi.fn(), update: vi.fn() }, + }, +})); +vi.mock("@/lib/services/staff-activity", () => ({ logStaffActivity: vi.fn() })); +vi.mock("next/cache", () => ({ revalidatePath: vi.fn() })); +vi.mock("next/navigation", () => ({ redirect: vi.fn() })); + +const staff = { id: 1, rank: 7, username: "admin" }; +const fakeForm = (data: Record) => ({ + get: (k: string) => data[k] ?? null, +}); + +beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(requirePermission).mockResolvedValue(staff as never); + vi.mocked(prisma.websiteSettings.upsert).mockResolvedValue({} as never); +}); + +describe("radioextra", () => { + it("saves settings and redirects", async () => { + await saveRadioExtra(fakeForm({ enabled: "1" }) as unknown as FormData); + expect(revalidatePath).toHaveBeenCalled(); + }); +}); diff --git a/src/actions/admin-radio-moderation.test.ts b/src/actions/admin-radio-moderation.test.ts new file mode 100644 index 0000000000..e6561716d8 --- /dev/null +++ b/src/actions/admin-radio-moderation.test.ts @@ -0,0 +1,48 @@ +// @ts-nocheck + +import { revalidatePath } from "next/cache"; +import { redirect } from "next/navigation"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { requirePermission } from "@/lib/admin/guard"; +import { PERMS } from "@/lib/permissions"; +import { prisma } from "@/lib/prisma"; +import { logStaffActivity } from "@/lib/services/staff-activity"; +import { saveRadioModeration } from "./admin-radio-moderation"; + +vi.mock("@/lib/admin/guard", () => ({ requirePermission: vi.fn() })); +vi.mock("@/lib/permissions", () => ({ + PERMS: { + PAGES_EDIT: "pages.edit", + USERS_EDIT: "users.edit", + SETTINGS_EDIT: "settings.edit", + }, +})); +vi.mock("@/lib/prisma", () => ({ + prisma: { + websiteSettings: { upsert: vi.fn() }, + websiteShopItems: { create: vi.fn(), update: vi.fn() }, + }, +})); +vi.mock("@/lib/services/staff-activity", () => ({ logStaffActivity: vi.fn() })); +vi.mock("next/cache", () => ({ revalidatePath: vi.fn() })); +vi.mock("next/navigation", () => ({ redirect: vi.fn() })); + +const staff = { id: 1, rank: 7, username: "admin" }; +const fakeForm = (data: Record) => ({ + get: (k: string) => data[k] ?? null, +}); + +beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(requirePermission).mockResolvedValue(staff as never); + vi.mocked(prisma.websiteSettings.upsert).mockResolvedValue({} as never); +}); + +describe("radiomoderation", () => { + it("saves settings and redirects", async () => { + await saveRadioModeration( + fakeForm({ enabled: "1" }) as unknown as FormData, + ); + expect(revalidatePath).toHaveBeenCalled(); + }); +}); diff --git a/src/actions/admin-radio-points.test.ts b/src/actions/admin-radio-points.test.ts new file mode 100644 index 0000000000..708b7482c2 --- /dev/null +++ b/src/actions/admin-radio-points.test.ts @@ -0,0 +1,46 @@ +// @ts-nocheck + +import { revalidatePath } from "next/cache"; +import { redirect } from "next/navigation"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { requirePermission } from "@/lib/admin/guard"; +import { PERMS } from "@/lib/permissions"; +import { prisma } from "@/lib/prisma"; +import { logStaffActivity } from "@/lib/services/staff-activity"; +import { saveRadioPoints } from "./admin-radio-points"; + +vi.mock("@/lib/admin/guard", () => ({ requirePermission: vi.fn() })); +vi.mock("@/lib/permissions", () => ({ + PERMS: { + PAGES_EDIT: "pages.edit", + USERS_EDIT: "users.edit", + SETTINGS_EDIT: "settings.edit", + }, +})); +vi.mock("@/lib/prisma", () => ({ + prisma: { + websiteSettings: { upsert: vi.fn() }, + websiteShopItems: { create: vi.fn(), update: vi.fn() }, + }, +})); +vi.mock("@/lib/services/staff-activity", () => ({ logStaffActivity: vi.fn() })); +vi.mock("next/cache", () => ({ revalidatePath: vi.fn() })); +vi.mock("next/navigation", () => ({ redirect: vi.fn() })); + +const staff = { id: 1, rank: 7, username: "admin" }; +const fakeForm = (data: Record) => ({ + get: (k: string) => data[k] ?? null, +}); + +beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(requirePermission).mockResolvedValue(staff as never); + vi.mocked(prisma.websiteSettings.upsert).mockResolvedValue({} as never); +}); + +describe("radiopoints", () => { + it("saves settings and redirects", async () => { + await saveRadioPoints(fakeForm({ enabled: "1" }) as unknown as FormData); + expect(revalidatePath).toHaveBeenCalled(); + }); +}); diff --git a/src/actions/admin-rare-values.test.ts b/src/actions/admin-rare-values.test.ts new file mode 100644 index 0000000000..dcedbd29d6 --- /dev/null +++ b/src/actions/admin-rare-values.test.ts @@ -0,0 +1,39 @@ +// @ts-nocheck + +import { revalidatePath } from "next/cache"; +import { redirect } from "next/navigation"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { requirePermission } from "@/lib/admin/guard"; +import { PERMS } from "@/lib/permissions"; +import { prisma } from "@/lib/prisma"; +import { logStaffActivity } from "@/lib/services/staff-activity"; +import { saveRareValue } from "./admin-rare-values"; + +vi.mock("@/lib/admin/guard", () => ({ requirePermission: vi.fn() })); +vi.mock("@/lib/permissions", () => ({ + PERMS: { PAGES_EDIT: "pages.edit", USERS_EDIT: "users.edit" }, +})); +vi.mock("@/lib/prisma", () => ({ + prisma: { websiteSettings: { upsert: vi.fn() } }, +})); +vi.mock("@/lib/services/staff-activity", () => ({ logStaffActivity: vi.fn() })); +vi.mock("next/cache", () => ({ revalidatePath: vi.fn() })); +vi.mock("next/navigation", () => ({ redirect: vi.fn() })); + +const staff = { id: 1, rank: 7, username: "admin" }; +const fakeForm = (data: Record) => ({ + get: (k: string) => data[k] ?? null, +}); + +beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(requirePermission).mockResolvedValue(staff as never); + vi.mocked(prisma.websiteSettings.upsert).mockResolvedValue({} as never); +}); + +describe("rareview", () => { + it("saves settings", async () => { + await saveRareValue(fakeForm({ value: "test" }) as unknown as FormData); + expect(prisma.websiteSettings.upsert).toHaveBeenCalled(); + }); +}); diff --git a/src/actions/admin-settings.test.ts b/src/actions/admin-settings.test.ts new file mode 100644 index 0000000000..fa08bc7b12 --- /dev/null +++ b/src/actions/admin-settings.test.ts @@ -0,0 +1,39 @@ +// @ts-nocheck + +import { revalidatePath } from "next/cache"; +import { redirect } from "next/navigation"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { requirePermission } from "@/lib/admin/guard"; +import { PERMS } from "@/lib/permissions"; +import { prisma } from "@/lib/prisma"; +import { logStaffActivity } from "@/lib/services/staff-activity"; +import { saveSetting } from "./admin-settings"; + +vi.mock("@/lib/admin/guard", () => ({ requirePermission: vi.fn() })); +vi.mock("@/lib/permissions", () => ({ + PERMS: { PAGES_EDIT: "pages.edit", USERS_EDIT: "users.edit" }, +})); +vi.mock("@/lib/prisma", () => ({ + prisma: { websiteSettings: { upsert: vi.fn() } }, +})); +vi.mock("@/lib/services/staff-activity", () => ({ logStaffActivity: vi.fn() })); +vi.mock("next/cache", () => ({ revalidatePath: vi.fn() })); +vi.mock("next/navigation", () => ({ redirect: vi.fn() })); + +const staff = { id: 1, rank: 7, username: "admin" }; +const fakeForm = (data: Record) => ({ + get: (k: string) => data[k] ?? null, +}); + +beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(requirePermission).mockResolvedValue(staff as never); + vi.mocked(prisma.websiteSettings.upsert).mockResolvedValue({} as never); +}); + +describe("setting", () => { + it("saves settings", async () => { + await saveSetting(fakeForm({ value: "test" }) as unknown as FormData); + expect(prisma.websiteSettings.upsert).toHaveBeenCalled(); + }); +}); diff --git a/src/actions/admin-theme.test.ts b/src/actions/admin-theme.test.ts new file mode 100644 index 0000000000..42e13265d5 --- /dev/null +++ b/src/actions/admin-theme.test.ts @@ -0,0 +1,46 @@ +// @ts-nocheck + +import { revalidatePath } from "next/cache"; +import { redirect } from "next/navigation"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { requirePermission } from "@/lib/admin/guard"; +import { PERMS } from "@/lib/permissions"; +import { prisma } from "@/lib/prisma"; +import { logStaffActivity } from "@/lib/services/staff-activity"; +import { saveTheme } from "./admin-theme"; + +vi.mock("@/lib/admin/guard", () => ({ requirePermission: vi.fn() })); +vi.mock("@/lib/permissions", () => ({ + PERMS: { + PAGES_EDIT: "pages.edit", + USERS_EDIT: "users.edit", + SETTINGS_EDIT: "settings.edit", + }, +})); +vi.mock("@/lib/prisma", () => ({ + prisma: { + websiteSettings: { upsert: vi.fn() }, + websiteShopItems: { create: vi.fn(), update: vi.fn() }, + }, +})); +vi.mock("@/lib/services/staff-activity", () => ({ logStaffActivity: vi.fn() })); +vi.mock("next/cache", () => ({ revalidatePath: vi.fn() })); +vi.mock("next/navigation", () => ({ redirect: vi.fn() })); + +const staff = { id: 1, rank: 7, username: "admin" }; +const fakeForm = (data: Record) => ({ + get: (k: string) => data[k] ?? null, +}); + +beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(requirePermission).mockResolvedValue(staff as never); + vi.mocked(prisma.websiteSettings.upsert).mockResolvedValue({} as never); +}); + +describe("theme", () => { + it("saves settings and redirects", async () => { + await saveTheme(fakeForm({ enabled: "1" }) as unknown as FormData); + expect(revalidatePath).toHaveBeenCalled(); + }); +}); diff --git a/src/actions/admin-vouchers.test.ts b/src/actions/admin-vouchers.test.ts new file mode 100644 index 0000000000..ba55b2198a --- /dev/null +++ b/src/actions/admin-vouchers.test.ts @@ -0,0 +1,46 @@ +// @ts-nocheck + +import { revalidatePath } from "next/cache"; +import { redirect } from "next/navigation"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { requirePermission } from "@/lib/admin/guard"; +import { PERMS } from "@/lib/permissions"; +import { prisma } from "@/lib/prisma"; +import { logStaffActivity } from "@/lib/services/staff-activity"; +import { saveVoucher } from "./admin-vouchers"; + +vi.mock("@/lib/admin/guard", () => ({ requirePermission: vi.fn() })); +vi.mock("@/lib/permissions", () => ({ + PERMS: { + PAGES_EDIT: "pages.edit", + USERS_EDIT: "users.edit", + SETTINGS_EDIT: "settings.edit", + }, +})); +vi.mock("@/lib/prisma", () => ({ + prisma: { + websiteSettings: { upsert: vi.fn() }, + websiteShopItems: { create: vi.fn(), update: vi.fn() }, + }, +})); +vi.mock("@/lib/services/staff-activity", () => ({ logStaffActivity: vi.fn() })); +vi.mock("next/cache", () => ({ revalidatePath: vi.fn() })); +vi.mock("next/navigation", () => ({ redirect: vi.fn() })); + +const staff = { id: 1, rank: 7, username: "admin" }; +const fakeForm = (data: Record) => ({ + get: (k: string) => data[k] ?? null, +}); + +beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(requirePermission).mockResolvedValue(staff as never); + vi.mocked(prisma.websiteSettings.upsert).mockResolvedValue({} as never); +}); + +describe("voucher", () => { + it("saves settings and redirects", async () => { + await saveVoucher(fakeForm({ enabled: "1" }) as unknown as FormData); + expect(revalidatePath).toHaveBeenCalled(); + }); +}); diff --git a/src/actions/admin-wordfilter.test.ts b/src/actions/admin-wordfilter.test.ts new file mode 100644 index 0000000000..f13c4c9633 --- /dev/null +++ b/src/actions/admin-wordfilter.test.ts @@ -0,0 +1,46 @@ +// @ts-nocheck + +import { revalidatePath } from "next/cache"; +import { redirect } from "next/navigation"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { requirePermission } from "@/lib/admin/guard"; +import { PERMS } from "@/lib/permissions"; +import { prisma } from "@/lib/prisma"; +import { logStaffActivity } from "@/lib/services/staff-activity"; +import { saveWordfilter } from "./admin-wordfilter"; + +vi.mock("@/lib/admin/guard", () => ({ requirePermission: vi.fn() })); +vi.mock("@/lib/permissions", () => ({ + PERMS: { + PAGES_EDIT: "pages.edit", + USERS_EDIT: "users.edit", + SETTINGS_EDIT: "settings.edit", + }, +})); +vi.mock("@/lib/prisma", () => ({ + prisma: { + websiteSettings: { upsert: vi.fn() }, + websiteShopItems: { create: vi.fn(), update: vi.fn() }, + }, +})); +vi.mock("@/lib/services/staff-activity", () => ({ logStaffActivity: vi.fn() })); +vi.mock("next/cache", () => ({ revalidatePath: vi.fn() })); +vi.mock("next/navigation", () => ({ redirect: vi.fn() })); + +const staff = { id: 1, rank: 7, username: "admin" }; +const fakeForm = (data: Record) => ({ + get: (k: string) => data[k] ?? null, +}); + +beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(requirePermission).mockResolvedValue(staff as never); + vi.mocked(prisma.websiteSettings.upsert).mockResolvedValue({} as never); +}); + +describe("wordfilter", () => { + it("saves settings and redirects", async () => { + await saveWordfilter(fakeForm({ enabled: "1" }) as unknown as FormData); + expect(revalidatePath).toHaveBeenCalled(); + }); +}); diff --git a/src/actions/save-favicon.test.ts b/src/actions/save-favicon.test.ts new file mode 100644 index 0000000000..494d3aff44 --- /dev/null +++ b/src/actions/save-favicon.test.ts @@ -0,0 +1,39 @@ +// @ts-nocheck + +import { revalidatePath } from "next/cache"; +import { redirect } from "next/navigation"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { requirePermission } from "@/lib/admin/guard"; +import { PERMS } from "@/lib/permissions"; +import { prisma } from "@/lib/prisma"; +import { logStaffActivity } from "@/lib/services/staff-activity"; +import { saveFavicon } from "./save-favicon"; + +vi.mock("@/lib/admin/guard", () => ({ requirePermission: vi.fn() })); +vi.mock("@/lib/permissions", () => ({ + PERMS: { PAGES_EDIT: "pages.edit", USERS_EDIT: "users.edit" }, +})); +vi.mock("@/lib/prisma", () => ({ + prisma: { websiteSettings: { upsert: vi.fn() } }, +})); +vi.mock("@/lib/services/staff-activity", () => ({ logStaffActivity: vi.fn() })); +vi.mock("next/cache", () => ({ revalidatePath: vi.fn() })); +vi.mock("next/navigation", () => ({ redirect: vi.fn() })); + +const staff = { id: 1, rank: 7, username: "admin" }; +const fakeForm = (data: Record) => ({ + get: (k: string) => data[k] ?? null, +}); + +beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(requirePermission).mockResolvedValue(staff as never); + vi.mocked(prisma.websiteSettings.upsert).mockResolvedValue({} as never); +}); + +describe("favicon", () => { + it("saves settings", async () => { + await saveFavicon(fakeForm({ value: "test" }) as unknown as FormData); + expect(prisma.websiteSettings.upsert).toHaveBeenCalled(); + }); +}); diff --git a/src/actions/save-logo.test.ts b/src/actions/save-logo.test.ts new file mode 100644 index 0000000000..8e63d6d3f8 --- /dev/null +++ b/src/actions/save-logo.test.ts @@ -0,0 +1,39 @@ +// @ts-nocheck + +import { revalidatePath } from "next/cache"; +import { redirect } from "next/navigation"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { requirePermission } from "@/lib/admin/guard"; +import { PERMS } from "@/lib/permissions"; +import { prisma } from "@/lib/prisma"; +import { logStaffActivity } from "@/lib/services/staff-activity"; +import { saveLogo } from "./save-logo"; + +vi.mock("@/lib/admin/guard", () => ({ requirePermission: vi.fn() })); +vi.mock("@/lib/permissions", () => ({ + PERMS: { PAGES_EDIT: "pages.edit", USERS_EDIT: "users.edit" }, +})); +vi.mock("@/lib/prisma", () => ({ + prisma: { websiteSettings: { upsert: vi.fn() } }, +})); +vi.mock("@/lib/services/staff-activity", () => ({ logStaffActivity: vi.fn() })); +vi.mock("next/cache", () => ({ revalidatePath: vi.fn() })); +vi.mock("next/navigation", () => ({ redirect: vi.fn() })); + +const staff = { id: 1, rank: 7, username: "admin" }; +const fakeForm = (data: Record) => ({ + get: (k: string) => data[k] ?? null, +}); + +beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(requirePermission).mockResolvedValue(staff as never); + vi.mocked(prisma.websiteSettings.upsert).mockResolvedValue({} as never); +}); + +describe("logo", () => { + it("saves settings", async () => { + await saveLogo(fakeForm({ value: "test" }) as unknown as FormData); + expect(prisma.websiteSettings.upsert).toHaveBeenCalled(); + }); +});