Files
WRNexusJS/packages/queue/test/defined.test.ts
T
Clintchiz 1d305f36b2
Quality / quality (ubuntu-latest) (push) Failing after 9m50s
Quality / quality (windows-latest) (push) Canceled after 0s
feat(queue): add typed application queue lifecycle
2026-08-23 09:17:33 +05:30

63 lines
2.1 KiB
TypeScript

import { expect, test } from "bun:test";
import { createDurableQueue, defineQueue, memoryQueueStore } from "../src/index.ts";
test("defineQueue creates typed producers and registers workers", async () => {
const seen: number[] = [];
const email = defineQueue({
name: "email",
options: { store: memoryQueueStore() },
jobs: {
send: {
maxAttempts: 4,
idempotency: (data: { messageId: number }) => `message:${data.messageId}`,
validate: (data: unknown): data is { messageId: number } =>
typeof data === "object" &&
data !== null &&
Number.isInteger((data as { messageId?: unknown }).messageId),
run: async ({ messageId }: { messageId: number }) => void seen.push(messageId),
},
},
});
const first = await email.send.add({ messageId: 7 });
const duplicate = await email.jobs.send.add({ messageId: 7 });
expect(duplicate.id).toBe(first.id);
expect(await email.send.status(first.id)).toBe("queued");
expect(await email.drain()).toBe(1);
expect(seen).toEqual([7]);
expect(await email.send.status(first.id)).toBe("completed");
});
test("durable queues expose lifecycle, health and events", async () => {
const events: string[] = [];
const queue = createDurableQueue({
pollMs: 10,
onEvent: (event) => void events.push(event.type),
});
queue.process("work", async () => {});
queue.start();
expect(queue.isRunning()).toBe(true);
await queue.add("work", {});
await queue.drain();
const health = await queue.health();
expect(health.pending).toBe(0);
expect(events).toContain("job.added");
expect(events).toContain("job.completed");
queue.stop();
expect(queue.isRunning()).toBe(false);
await queue.shutdown();
});
test("defineQueue validates payloads before persistence", async () => {
const queue = defineQueue({
name: "safe",
jobs: {
number: {
validate: (data: unknown): data is number => typeof data === "number",
run: async (_data: number) => {},
},
},
});
await expect(queue.number.add("no" as never)).rejects.toThrow("WRN-QUEUE-PAYLOAD");
});