import { describe, it, expect, vi, beforeEach } from "vitest";
import { handleQueue } from "../src/queue-consumer.js";
/**
* Create a mock queue message with ack/retry tracking
*/
function mockMessage(body) {
return {
body,
ack: vi.fn(),
retry: vi.fn(),
};
}
describe("handleQueue", () => {
let env;
beforeEach(() => {
env = {
BOT_TOKEN: "test-token",
claude_status: {
delete: vi.fn(),
},
};
vi.restoreAllMocks();
});
it("acks on successful send", async () => {
vi.stubGlobal("fetch", vi.fn().mockResolvedValue({ ok: true, status: 200 }));
const msg = mockMessage({ chatId: 123, html: "test" });
await handleQueue({ messages: [msg] }, env);
expect(msg.ack).toHaveBeenCalled();
expect(msg.retry).not.toHaveBeenCalled();
});
it("removes subscriber and acks on 403", async () => {
vi.stubGlobal("fetch", vi.fn().mockResolvedValue({ ok: false, status: 403 }));
const msg = mockMessage({ chatId: 123, threadId: null, html: "test" });
await handleQueue({ messages: [msg] }, env);
expect(msg.ack).toHaveBeenCalled();
expect(env.claude_status.delete).toHaveBeenCalled();
});
it("retries on 429 rate limit", async () => {
vi.stubGlobal(
"fetch",
vi.fn().mockResolvedValue({
ok: false,
status: 429,
headers: new Headers({ "Retry-After": "5" }),
})
);
const msg = mockMessage({ chatId: 123, html: "test" });
await handleQueue({ messages: [msg] }, env);
expect(msg.retry).toHaveBeenCalled();
expect(msg.ack).not.toHaveBeenCalled();
});
it("retries on 5xx server error", async () => {
vi.stubGlobal("fetch", vi.fn().mockResolvedValue({ ok: false, status: 502 }));
const msg = mockMessage({ chatId: 123, html: "test" });
await handleQueue({ messages: [msg] }, env);
expect(msg.retry).toHaveBeenCalled();
expect(msg.ack).not.toHaveBeenCalled();
});
it("retries on network error", async () => {
vi.stubGlobal("fetch", vi.fn().mockRejectedValue(new Error("network fail")));
const msg = mockMessage({ chatId: 123, html: "test" });
await handleQueue({ messages: [msg] }, env);
expect(msg.retry).toHaveBeenCalled();
});
it("skips malformed messages", async () => {
const msg = mockMessage({ chatId: null, html: null });
await handleQueue({ messages: [msg] }, env);
expect(msg.ack).toHaveBeenCalled();
});
});