import { S3WidgetRequestRetriever } from "@/consumer/retrievers"; import { WidgetRequest } from "@/shared/schema"; import { DeleteObjectCommand, GetObjectCommand, ListObjectsV2Command, S3Client, } from "@aws-sdk/client-s3"; import { expect, mock, test } from "bun:test"; import { randomUUID } from "node:crypto"; import { VoidLogger } from "@/shared/t"; test("when widget request in S3 then reads, deletes, and returns", async () => { const logger = new VoidLogger(); const widgetRequest = WidgetRequest.parse({ type: "create", requestId: randomUUID(), owner: "simponic", widgetId: randomUUID(), }); const key = "test-key"; const deleteKeyMock = mock(() => true); const listKeyMock = mock(() => { return { Contents: [{ Key: key }], }; }); const getKeyMock = mock(() => { return { Body: { transformToString: async () => JSON.stringify(widgetRequest), }, }; }); const mockS3Client = { send: async ( req: ListObjectsV2Command | DeleteObjectCommand | GetObjectCommand, ) => { if (req instanceof ListObjectsV2Command) { return listKeyMock(); } if (req instanceof DeleteObjectCommand) { return deleteKeyMock(); } if (req instanceof GetObjectCommand) { if (req.input.Key === key) { return getKeyMock(); } } }, }; const retriever = new S3WidgetRequestRetriever( "test-bucket", mockS3Client as unknown as S3Client, logger, ); expect(await retriever.refreshRequests()).toEqual([widgetRequest]); expect(getKeyMock).toHaveBeenCalledTimes(1); expect(listKeyMock).toHaveBeenCalledTimes(1); expect(deleteKeyMock).toHaveBeenCalledTimes(1); }); test("when empty widget request in S3 then deletes and returns empty", async () => { const logger = new VoidLogger(); const key = "test-key"; const deleteKeyMock = mock(() => true); const listKeyMock = mock(() => { return { Contents: [{ Key: key }], }; }); const getKeyMock = mock(() => { return { Body: { transformToString: async () => "", }, }; }); const mockS3Client = { send: mock( async ( req: ListObjectsV2Command | DeleteObjectCommand | GetObjectCommand, ) => { if (req instanceof ListObjectsV2Command) { return listKeyMock(); } if (req instanceof DeleteObjectCommand) { return deleteKeyMock(); } if (req instanceof GetObjectCommand) { if (req.input.Key === key) { return getKeyMock(); } } }, ), }; const retriever = new S3WidgetRequestRetriever( "test-bucket", mockS3Client as unknown as S3Client, logger, ); expect(await retriever.refreshRequests()).toBeEmpty(); expect(getKeyMock).toHaveBeenCalledTimes(1); expect(listKeyMock).toHaveBeenCalledTimes(1); expect(deleteKeyMock).toHaveBeenCalledTimes(1); }); test("when no keys then returns empty", async () => { const logger = new VoidLogger(); const key = "test-key"; const deleteKeyMock = mock(() => true); const listKeyMock = mock(() => { return { Contents: [], }; }); const getKeyMock = mock(() => { return { Body: { transformToString: async () => "", }, }; }); const mockS3Client = { send: mock( async ( req: ListObjectsV2Command | DeleteObjectCommand | GetObjectCommand, ) => { if (req instanceof ListObjectsV2Command) { return listKeyMock(); } if (req instanceof DeleteObjectCommand) { return deleteKeyMock(); } if (req instanceof GetObjectCommand) { if (req.input.Key === key) { return getKeyMock(); } } }, ), }; const retriever = new S3WidgetRequestRetriever( "test-bucket", mockS3Client as unknown as S3Client, logger, ); expect(await retriever.refreshRequests()).toEqual([]); expect(listKeyMock).toHaveBeenCalledTimes(1); expect(getKeyMock).toHaveBeenCalledTimes(0); expect(deleteKeyMock).toHaveBeenCalledTimes(0); });