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/S3WidgetDao.spec.ts | 115 +++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 Homework/cs5260/consumer/t/S3WidgetDao.spec.ts (limited to 'Homework/cs5260/consumer/t/S3WidgetDao.spec.ts') diff --git a/Homework/cs5260/consumer/t/S3WidgetDao.spec.ts b/Homework/cs5260/consumer/t/S3WidgetDao.spec.ts new file mode 100644 index 0000000..5eb4602 --- /dev/null +++ b/Homework/cs5260/consumer/t/S3WidgetDao.spec.ts @@ -0,0 +1,115 @@ +import { Widget } from "@/shared/schema"; +import { expect, test, mock } from "bun:test"; +import { S3WidgetKeyGenerator } from "@/consumer/dao/keys"; +import { + DeleteObjectCommand, + GetObjectCommand, + PutObjectCommand, + S3Client, +} from "@aws-sdk/client-s3"; +import { S3WidgetDAO } from "@/consumer/dao"; +import { VoidLogger } from "@/shared/t"; + +const testBucket = "test-bucket"; +const testWidget = Widget.parse({ + id: "testWidgetId", + owner: "simponic", + label: "A Widget", + description: "Nothing to see here!", +}); + +const testKeyGenerator = new S3WidgetKeyGenerator().withPrefix("test-widgets"); + +const mockedGetSend = mock(async (req: GetObjectCommand) => { + if (req.input.Key == "test-widgets/simponic/testWidgetId") { + return { + Body: { + transformToString: () => { + return JSON.stringify(testWidget); + }, + }, + }; + } + return {}; +}); + +const mockedPutSendSuccessful = mock(async (req: PutObjectCommand) => { + if (req.input.Key == "test-widgets/simponic/testWidgetId") { + return { + ChecksumSHA256: "laksdjf-lkejfoaj", + }; + } +}); + +const mockedDeleteSendSuccessful = mock(async (req: DeleteObjectCommand) => { + if (req.input.Key == "test-widgets/simponic/testWidgetId") { + return { + $metadata: true, + }; + } +}); + +test("when given widget then retrieves from s3", async () => { + const mockedClient = { send: mockedGetSend }; + const logger = new VoidLogger(); + + const dao = new S3WidgetDAO( + testBucket, + mockedClient as unknown as S3Client, + testKeyGenerator, + logger, + ); + + const resp = await dao.retrieve({ id: "testWidgetId", owner: "simponic" }); + + expect(resp?.label).toEqual(testWidget.label); + expect(resp?.id).toEqual(testWidget.id); +}); + +test("when cannot retrieve widget then returns undefined", async () => { + const mockedClient = { send: mockedGetSend }; + const logger = new VoidLogger(); + + const dao = new S3WidgetDAO( + testBucket, + mockedClient as unknown as S3Client, + testKeyGenerator, + logger, + ); + + const resp = await dao.retrieve({ + id: "thisWidgetDoesNotExist", + owner: "simponic", + }); + + expect(resp).toBeUndefined(); +}); + +test("when given widget then puts in s3 and returns", async () => { + const mockedClient = { send: mockedPutSendSuccessful }; + const logger = new VoidLogger(); + const dao = new S3WidgetDAO( + testBucket, + mockedClient as unknown as S3Client, + testKeyGenerator, + logger, + ); + + const resp = await dao.save(testWidget); + expect(resp).toEqual(testWidget); +}); + +test("when given widget then deletes in s3 and returns", async () => { + const mockedClient = { send: mockedDeleteSendSuccessful }; + const logger = new VoidLogger(); + + const dao = new S3WidgetDAO( + testBucket, + mockedClient as unknown as S3Client, + testKeyGenerator, + logger, + ); + + const resp = await dao.delete(testWidget); + expect(resp).toEqual(testWidget); +}); -- cgit v1.3