File
Blob: tests/worker/queues/dispatch.workers.test.ts
| 1 | import { env } from "cloudflare:workers"; |
| 2 | import { createExecutionContext, createMessageBatch, getQueueResult } from "cloudflare:test"; |
| 3 | import { beforeEach, describe, expect, it } from "vitest"; |
| 4 | |
| 5 | import { GRADIENT_PRESETS } from "@/shared/page-cover"; |
| 6 | import worker from "@/worker/index"; |
| 7 | import type { TasksQueueMessage } from "@/worker/queues/messages"; |
| 8 | import { siteCoverKey } from "@/worker/sites/cover"; |
| 9 | import { resetD1Tables } from "@tests/worker/helpers/db"; |
| 10 | import { seedPage, seedUser, seedWorkspace } from "@tests/worker/helpers/seeds"; |
| 11 | |
| 12 | async 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 | |
| 17 | describe("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 | }); |