Files
dusuniot/tests/jobs.test.ts
T

21 lines
1.1 KiB
TypeScript

import { describe, test, expect } from "bun:test";
import { SQL } from "bun";
/** 后台任务队列:入队 → worker 处理 → done 状态 */
describe("jobs 队列", () => {
test("email.send 任务被 worker 消费并标记 done", async () => {
const sql = new SQL(process.env.DATABASE_URL || "postgres://dusuniot:dusuniot@127.0.0.1:25432/dusuniot");
const [row]: any = await sql`INSERT INTO jobs (type, payload) VALUES ('email.send', ${JSON.stringify({ to: "t@t.io", subject: "s", body: "b" })}::jsonb) RETURNING id`.values();
const id = row[0];
// 跑一次 worker 主循环(10 秒后自动退出)
const { runWorkerLoop } = await import("../src/server/jobs");
const controller = new AbortController();
// 用短超时跑一轮:直接调用 claimJob 的逻辑由 loop 内部处理,这里以 1 个任务处理完为标准
await Promise.race([runWorkerLoop(1500), Bun.sleep(4000)]);
const [status]: any = await sql`SELECT status FROM jobs WHERE id=${id}`.values();
expect(status[0]).toBe("done");
await sql`DELETE FROM jobs WHERE id=${id}`;
sql.end();
}, 10000);
});