Skip to content
File

Blob: tests/worker/queues/dispatch.workers.test.ts

typescript72 lines
1import { env } from "cloudflare:workers";
2import { createExecutionContext, createMessageBatch, getQueueResult } from "cloudflare:test";
3import { beforeEach, describe, expect, it } from "vitest";
4 
5import { GRADIENT_PRESETS } from "@/shared/page-cover";
6import worker from "@/worker/index";
7import type { TasksQueueMessage } from "@/worker/queues/messages";
8import { siteCoverKey } from "@/worker/sites/cover";
9import { resetD1Tables } from "@tests/worker/helpers/db";
10import { seedPage, seedUser, seedWorkspace } from "@tests/worker/helpers/seeds";
11 
12async function clearSitesBucket(): Promise<void> {
13 const listing = await env.SITES.list();
14 await Promise.all(listing.objects.map((object) => env.SITES.delete(object.key)));
15}
16 
17describe("worker queue dispatch", () => {
18 beforeEach(async () => {
19 await resetD1Tables();
20 await clearSitesBucket();
21 });
22 
23 it("dispatches workspace Sites cleanup messages and acknowledges the batch", async () => {
24 await env.SITES.put("ws-clean/page-a.json", "{}");
25 await env.SITES.put("ws-clean/page-b.json", "{}");
26 await env.SITES.put("ws-keep/page-c.json", "{}");
27 
28 const batch = createMessageBatch<TasksQueueMessage>("bland-tasks", [
29 {
30 id: "cleanup-1",
31 timestamp: new Date("2026-05-24T00:00:00.000Z"),
32 attempts: 1,
33 body: { type: "workspace-sites-cleanup", workspaceId: "ws-clean" },
34 },
35 ]);
36 const ctx = createExecutionContext();
37 
38 expect(worker.queue).toBeDefined();
39 await worker.queue!(batch, env, ctx);
40 const result = await getQueueResult(batch, ctx);
41 
42 expect(result.retryMessages).toHaveLength(0);
43 expect(result.explicitAcks).toEqual(["cleanup-1"]);
44 await expect(env.SITES.get("ws-clean/page-a.json")).resolves.toBeNull();
45 await expect(env.SITES.get("ws-clean/page-b.json")).resolves.toBeNull();
46 await expect(env.SITES.get("ws-keep/page-c.json")).resolves.not.toBeNull();
47 });
48 
49 it("dispatches site cover messages and acknowledges the batch", async () => {
50 const owner = await seedUser();
51 const ws = await seedWorkspace({ owner_id: owner.id });
52 const page = await seedPage({ workspace_id: ws.id, created_by: owner.id, cover_url: GRADIENT_PRESETS[0] });
53 
54 const batch = createMessageBatch<TasksQueueMessage>("bland-tasks", [
55 {
56 id: "cover-1",
57 timestamp: new Date("2026-05-24T00:00:00.000Z"),
58 attempts: 1,
59 body: { type: "site-cover", pageId: page.id },
60 },
61 ]);
62 const ctx = createExecutionContext();
63 
64 await worker.queue!(batch, env, ctx);
65 const result = await getQueueResult(batch, ctx);
66 
67 expect(result.retryMessages).toHaveLength(0);
68 expect(result.explicitAcks).toEqual(["cover-1"]);
69 await expect(env.SITES.get(siteCoverKey(ws.id, page.id))).resolves.not.toBeNull();
70 });
71});