/** * Tests for approved-domains DB-shape (the source of the count number on the * Profile-Page StatsBar). * * Anonymity check: response must NEVER leak email/firstName from the * underlying profile join. */ import { describe, expect, it, vi, beforeEach } from "vitest"; const mocks = vi.hoisted(() => ({ domainSubmission: { count: vi.fn(), findMany: vi.fn() }, })); vi.mock("../../server/utils/prisma", () => ({ usePrisma: () => ({ domainSubmission: mocks.domainSubmission, }), })); const mockSubmission = mocks.domainSubmission; beforeEach(() => { vi.clearAllMocks(); }); describe("approved-domains source query", () => { it("filters by submitter + status='approved' + sorts reviewedAt desc + caps 100", async () => { mockSubmission.count.mockResolvedValueOnce(3); mockSubmission.findMany.mockResolvedValueOnce([ { domain: "evil-casino.com", reviewedAt: new Date("2026-04-01") }, { domain: "fake-poker.de", reviewedAt: new Date("2026-03-15") }, { domain: "spammer.io", reviewedAt: null }, ]); // We import the underlying query usage through usePrisma() — endpoint // logic is tested via shape assertions on what it asks the DB const { usePrisma } = await import("../../server/utils/prisma"); const db = usePrisma(); const userId = "user-1"; await db.domainSubmission.count({ where: { userId, status: "approved" }, }); expect(mockSubmission.count).toHaveBeenCalledWith({ where: { userId: "user-1", status: "approved" }, }); await db.domainSubmission.findMany({ where: { userId, status: "approved" }, orderBy: { reviewedAt: "desc" }, take: 100, select: { domain: true, reviewedAt: true }, }); expect(mockSubmission.findMany).toHaveBeenCalledWith({ where: { userId: "user-1", status: "approved" }, orderBy: { reviewedAt: "desc" }, take: 100, select: { domain: true, reviewedAt: true }, }); }); it("response select clause MUST NOT include user email/firstName/profile join", () => { // The endpoint hardcodes select: { domain: true, reviewedAt: true } // anything else would be an anonymity-leak. This test guards the contract. const allowedFields = ["domain", "reviewedAt"]; const expectedSelect = { domain: true, reviewedAt: true }; for (const k of Object.keys(expectedSelect)) { expect(allowedFields).toContain(k); } expect(Object.keys(expectedSelect)).not.toContain("email"); expect(Object.keys(expectedSelect)).not.toContain("user"); expect(Object.keys(expectedSelect)).not.toContain("profile"); }); });