summaryrefslogtreecommitdiff
path: root/Homework/cs5260/consumer/t/S3WidgetDao.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/S3WidgetDao.spec.ts
downloadmisc-undergrad-6bf4b90c90f15f4ab60833bddf5b5756d1a6b1f6.tar.gz
misc-undergrad-6bf4b90c90f15f4ab60833bddf5b5756d1a6b1f6.zip
Diffstat (limited to 'Homework/cs5260/consumer/t/S3WidgetDao.spec.ts')
-rw-r--r--Homework/cs5260/consumer/t/S3WidgetDao.spec.ts115
1 files changed, 115 insertions, 0 deletions
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);
+});