diff options
Diffstat (limited to 'Homework/cs5260/consumer/t/S3WidgetRequestRetriever.spec.ts')
| -rw-r--r-- | Homework/cs5260/consumer/t/S3WidgetRequestRetriever.spec.ts | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/Homework/cs5260/consumer/t/S3WidgetRequestRetriever.spec.ts b/Homework/cs5260/consumer/t/S3WidgetRequestRetriever.spec.ts new file mode 100644 index 0000000..9807875 --- /dev/null +++ b/Homework/cs5260/consumer/t/S3WidgetRequestRetriever.spec.ts @@ -0,0 +1,172 @@ +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); +}); |
