summaryrefslogtreecommitdiff
path: root/Homework/cs5260/consumer/t/S3WidgetRequestRetriever.spec.ts
diff options
context:
space:
mode:
authorElizabeth Alexander Hunt <me@liz.coffee>2026-07-02 11:55:17 -0700
committerElizabeth Alexander Hunt <me@liz.coffee>2026-07-02 11:55:17 -0700
commit6bf4b90c90f15f4ab60833bddf5b5756d1a6b1f6 (patch)
treeed97e39ec77c5231ffd2c394493e68d00ddac5a4 /Homework/cs5260/consumer/t/S3WidgetRequestRetriever.spec.ts
downloadmisc-undergrad-6bf4b90c90f15f4ab60833bddf5b5756d1a6b1f6.tar.gz
misc-undergrad-6bf4b90c90f15f4ab60833bddf5b5756d1a6b1f6.zip
Diffstat (limited to 'Homework/cs5260/consumer/t/S3WidgetRequestRetriever.spec.ts')
-rw-r--r--Homework/cs5260/consumer/t/S3WidgetRequestRetriever.spec.ts172
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);
+});