import { expect, test } from "bun:test"; import { randomUUID } from "node:crypto"; import { WidgetRequestHandler } from "@/widgetrequesthandler/handler"; import { VoidLogger } from "@/shared/t"; import { WidgetRequest, WidgetRequestT } from "@/shared/schema"; import { ProcessorResponse, WidgetRequestProcessor, } from "@/widgetrequesthandler/processors"; const testWidget = () => WidgetRequest.parse({ type: "create", requestId: randomUUID(), owner: "simponic", widgetId: randomUUID(), }); test("when invalid body then returns 400", async () => { const logger = new VoidLogger(); const mockProcessor = {} as unknown as WidgetRequestProcessor; const request = new Request("http://localhost"); const handler = new WidgetRequestHandler(mockProcessor, logger); const response = await handler.handleRequest(request); expect(response.status).toBe(400); }); test("when processor fails then returns 500", async () => { const logger = new VoidLogger(); const mockProcessor = { async handle(_widgetRequest: WidgetRequestT) { throw new Error("failure"); }, } as unknown as WidgetRequestProcessor; const newWidgetRequest = testWidget(); const request = new Request("http://localhost", { body: JSON.stringify({ event: newWidgetRequest }), }); const handler = new WidgetRequestHandler(mockProcessor, logger); const response = await handler.handleRequest(request); const responseBody = (await response.json()) as ProcessorResponse; expect(response.status).toBe(500); expect(responseBody.success).toBe(false); }); test("when processor succeeds and correct widget request then returns 200", async () => { const logger = new VoidLogger(); const message = randomUUID(); const mockProcessor = { async handle(_widgetRequest: WidgetRequestT) { return { success: true, message }; }, } as unknown as WidgetRequestProcessor; const newWidgetRequest = testWidget(); const request = new Request("http://localhost", { body: JSON.stringify({ event: newWidgetRequest }), }); const handler = new WidgetRequestHandler(mockProcessor, logger); const response = await handler.handleRequest(request); const responseBody = (await response.json()) as ProcessorResponse; expect(response.status).toBe(200); expect(responseBody.success).toBe(true); expect(responseBody.message).toBe(message); });