import { MainLoop } from "@/consumer/Loop"; import { WidgetRequestProcessor } from "@/consumer/processor"; import { WidgetRequestRetriever } from "@/consumer/retrievers"; import { expect, mock, test } from "bun:test"; import { VoidLogger } from "@/shared/t"; import { WidgetRequest } from "@/shared/schema"; import { randomUUID } from "node:crypto"; test("main loop exits after max poll attempts", async () => { const logger = new VoidLogger(); const maxPollAttempts = 3; const timesToGiveData = 5; let timesGivenData = 0; const mockRetriever: WidgetRequestRetriever = { refreshRequests: mock(async () => { if (timesGivenData < timesToGiveData) { timesGivenData++; return [ WidgetRequest.parse({ type: "create", owner: "simponic", widgetId: randomUUID(), requestId: randomUUID(), }), ]; } return []; }), }; const mockProcessor: WidgetRequestProcessor = { processRequest: mock(async (_r) => {}), }; await MainLoop( [mockRetriever], [mockProcessor], maxPollAttempts, 200, logger, ); expect(mockRetriever.refreshRequests).toHaveBeenCalledTimes( timesGivenData + maxPollAttempts, ); expect(mockProcessor.processRequest).toHaveBeenCalledTimes(timesGivenData); });