import { describe, it, expect, vi } from "vitest"; import type { Payload } from "payload"; import { buildRetentionPurgeTask } from "@/payload/retention-purge/task"; function makeFakePayload() { const find = vi.fn().mockResolvedValue({ docs: [] }); const jobsQueue = vi.fn().mockResolvedValue({ id: "job-1" }); const payload = { config: { collections: [ { slug: "users", custom: { retention: { purgeSchedule: "daily", postDeletion: { duration: "P30D", trigger: "after-deletion", action: "hard-delete", }, }, }, fields: [], }, ], }, find, update: vi.fn(), delete: vi.fn(), jobs: { queue: jobsQueue }, } as unknown as Payload; return { payload, find, jobsQueue }; } describe("buildRetentionPurgeTask (A3)", () => { it("uses the retention-purge-- task slug", () => { expect(buildRetentionPurgeTask("users").slug).toBe( "retention-purge--users", ); }); it("runs the purge against req.payload and re-enqueues the next cycle", async () => { const { payload, find, jobsQueue } = makeFakePayload(); const task = buildRetentionPurgeTask("users"); const result = await task.handler({ req: { payload } }); expect(result).toEqual({ output: {} }); // postDeletion branch queried the tombstone field expect(find).toHaveBeenCalledWith( expect.objectContaining({ collection: "users", where: { deletedAt: expect.anything() }, }), ); // self-re-enqueue went through the payload job queue expect(jobsQueue).toHaveBeenCalledWith( expect.objectContaining({ task: "retention-purge--users" }), ); }); });