feat: add extensive test suite
This commit is contained in:
+17
-10
@@ -7,16 +7,23 @@ import { adminCheck } from "@/lib/auth";
|
||||
import { db } from "@/lib/db";
|
||||
import { guides } from "@/lib/db/schema";
|
||||
import { forceRefresh } from "../settings/api";
|
||||
import { hideGuideService } from "./service";
|
||||
|
||||
export async function hideGuide(id: string) {
|
||||
if (!(await adminCheck())) redirect("/login");
|
||||
await db
|
||||
.update(guides)
|
||||
.set({
|
||||
hidden: not(guides.hidden),
|
||||
})
|
||||
.where(eq(guides.id, id));
|
||||
|
||||
forceRefresh("/guide");
|
||||
revalidatePath("/admin/guide");
|
||||
return hideGuideService(id, {
|
||||
adminCheck: async () => {
|
||||
if (!(await adminCheck())) redirect("/login");
|
||||
return true;
|
||||
},
|
||||
toggle: async (guideId) => {
|
||||
await db
|
||||
.update(guides)
|
||||
.set({ hidden: not(guides.hidden) })
|
||||
.where(eq(guides.id, guideId));
|
||||
},
|
||||
afterToggle: async () => {
|
||||
await forceRefresh("/guide");
|
||||
revalidatePath("/admin/guide");
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
import { describe, expect, mock, test } from "bun:test";
|
||||
import { hideGuideService } from "./service";
|
||||
|
||||
describe("hideGuideService", () => {
|
||||
test("rejects anonymous callers before mutation", async () => {
|
||||
const toggle = mock(async (_id: string) => {});
|
||||
expect(
|
||||
hideGuideService("guide", {
|
||||
adminCheck: async () => false,
|
||||
toggle,
|
||||
afterToggle: async () => {},
|
||||
}),
|
||||
).rejects.toBe("Unauthorized");
|
||||
expect(toggle).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
test("toggles before refreshing guide views", async () => {
|
||||
const calls: string[] = [];
|
||||
await hideGuideService("guide", {
|
||||
adminCheck: async () => true,
|
||||
toggle: async (id) => {
|
||||
calls.push(`toggle:${id}`);
|
||||
},
|
||||
afterToggle: async () => {
|
||||
calls.push("refresh");
|
||||
},
|
||||
});
|
||||
expect(calls).toEqual(["toggle:guide", "refresh"]);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,14 @@
|
||||
export interface HideGuideDependencies {
|
||||
adminCheck: () => Promise<unknown>;
|
||||
toggle: (id: string) => Promise<void>;
|
||||
afterToggle: () => Promise<void> | void;
|
||||
}
|
||||
|
||||
export async function hideGuideService(
|
||||
id: string,
|
||||
dependencies: HideGuideDependencies,
|
||||
) {
|
||||
if (!(await dependencies.adminCheck())) throw "Unauthorized";
|
||||
await dependencies.toggle(id);
|
||||
await dependencies.afterToggle();
|
||||
}
|
||||
Reference in New Issue
Block a user