tests: add coverage for src/actions/ (15 files) and src/lib/{admin,auth} (3 files)

- src/actions coverage: 2.4% -> 13.55%
- src/lib/admin coverage: 44.3% -> 84.81%
- src/lib/auth coverage: 90.52%
- vitest.config.ts: exclude .next.prev/ from test discovery
This commit is contained in:
openhands committed 2026-07-30 18:48:51 +02:00
1 parent c433e5a52f
commit ea7d861e69
19 files changed
+1262 -1

No files matched your search

+100
View File
@@ -0,0 +1,100 @@
import { redirect } from "next/navigation";
import { beforeEach, describe, expect, it, vi } from "vitest";
import { auth } from "@/lib/auth";
import { prisma } from "@/lib/prisma";
import { clientIp, rateLimit } from "@/lib/rate-limit";
import { applyStaff, applyTeam } from "./applications";
vi.mock("@/lib/auth", () => ({ auth: vi.fn() }));
vi.mock("@/lib/prisma", () => ({
prisma: { websiteStaffApplications: { findFirst: vi.fn(), create: vi.fn() } },
}));
vi.mock("@/lib/rate-limit", () => ({ clientIp: vi.fn(), rateLimit: vi.fn() }));
vi.mock("next/cache", () => ({ revalidatePath: vi.fn() }));
vi.mock("next/navigation", () => ({ redirect: vi.fn() }));
const fakeForm = (data: Record<string, string>) => ({
get: (key: string) => data[key] ?? null,
});
beforeEach(() => {
vi.clearAllMocks();
vi.mocked(auth).mockResolvedValue({ user: { id: "42" } } as never);
vi.mocked(clientIp).mockResolvedValue("127.0.0.1");
vi.mocked(rateLimit).mockResolvedValue({ ok: true });
});
describe("applyStaff", () => {
it("submits staff application", async () => {
vi.mocked(prisma.websiteStaffApplications.findFirst).mockResolvedValue(
null,
);
vi.mocked(prisma.websiteStaffApplications.create).mockResolvedValue(
{} as never,
);
await applyStaff(
fakeForm({
rankId: "3",
content: "I want to help!",
}) as unknown as FormData,
);
expect(prisma.websiteStaffApplications.create).toHaveBeenCalled();
expect(redirect).toHaveBeenCalledWith("/apply/staff?submitted=1");
});
it("redirects to login when not authenticated", async () => {
vi.mocked(auth).mockResolvedValue(null);
await applyStaff(fakeForm({}) as unknown as FormData);
expect(redirect).toHaveBeenCalledWith("/login");
});
it("returns duplicate status when application exists", async () => {
vi.mocked(prisma.websiteStaffApplications.findFirst).mockResolvedValue({
id: 1,
} as never);
await applyStaff(
fakeForm({
rankId: "3",
content: "I want to help!",
}) as unknown as FormData,
);
expect(prisma.websiteStaffApplications.create).not.toHaveBeenCalled();
expect(redirect).toHaveBeenCalledWith("/apply/staff?error=duplicate");
});
it("handles rate limit", async () => {
vi.mocked(rateLimit).mockResolvedValue({ ok: false });
await applyStaff(
fakeForm({
rankId: "3",
content: "I want to help!",
}) as unknown as FormData,
);
expect(redirect).toHaveBeenCalledWith("/apply/staff?error=ratelimit");
});
});
describe("applyTeam", () => {
it("submits team application", async () => {
vi.mocked(prisma.websiteStaffApplications.findFirst).mockResolvedValue(
null,
);
vi.mocked(prisma.websiteStaffApplications.create).mockResolvedValue(
{} as never,
);
await applyTeam(
fakeForm({
teamId: "2",
content: "I want to join team!",
}) as unknown as FormData,
);
expect(prisma.websiteStaffApplications.create).toHaveBeenCalled();
expect(redirect).toHaveBeenCalledWith("/apply/team?submitted=1");
});
it("redirects to login when not authenticated", async () => {
vi.mocked(auth).mockResolvedValue(null);
await applyTeam(fakeForm({}) as unknown as FormData);
expect(redirect).toHaveBeenCalledWith("/login");
});
});