From 6bf4b90c90f15f4ab60833bddf5b5756d1a6b1f6 Mon Sep 17 00:00:00 2001 From: Elizabeth Alexander Hunt Date: Thu, 2 Jul 2026 11:55:17 -0700 Subject: Init --- Homework/cs5260/consumer/t/Loop.spec.ts | 48 +++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 Homework/cs5260/consumer/t/Loop.spec.ts (limited to 'Homework/cs5260/consumer/t/Loop.spec.ts') diff --git a/Homework/cs5260/consumer/t/Loop.spec.ts b/Homework/cs5260/consumer/t/Loop.spec.ts new file mode 100644 index 0000000..44ba517 --- /dev/null +++ b/Homework/cs5260/consumer/t/Loop.spec.ts @@ -0,0 +1,48 @@ +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); +}); -- cgit v1.3