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/DynamoWidgetDAO.spec.ts | 117 +++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 Homework/cs5260/consumer/t/DynamoWidgetDAO.spec.ts (limited to 'Homework/cs5260/consumer/t/DynamoWidgetDAO.spec.ts') diff --git a/Homework/cs5260/consumer/t/DynamoWidgetDAO.spec.ts b/Homework/cs5260/consumer/t/DynamoWidgetDAO.spec.ts new file mode 100644 index 0000000..01ea185 --- /dev/null +++ b/Homework/cs5260/consumer/t/DynamoWidgetDAO.spec.ts @@ -0,0 +1,117 @@ +import { Widget } from "@/shared/schema"; +import { expect, test, mock } from "bun:test"; +import { + DeleteItemCommand, + DynamoDBClient, + GetItemCommand, + PutItemCommand, +} from "@aws-sdk/client-dynamodb"; +import { DynamoWidgetDAO } from "@/consumer/dao"; +import { VoidLogger } from "@/shared/t"; + +const testTable = "widgets-t"; +const testWidget = Widget.parse({ + id: "testWidgetId", + owner: "simponic", + label: "A Widget", + description: "Nothing to see here!", + otherAttributes: [{ name: "length", value: "20cm" }], +}); + +const mockGetItemSend = mock(async (req: GetItemCommand) => { + if (req.input.Key!.id.S! === testWidget.id) { + return { + Item: { + id: { S: testWidget.id }, + owner: { S: testWidget.owner }, + label: { S: testWidget.label }, + description: { S: testWidget.description }, + length: { S: "20cm" }, + }, + }; + } + return {}; +}); + +const expectMockPutItem = (field: string, value: string) => + mock(async (req: PutItemCommand) => { + if (req.input.Item![field].S === value) { + return { Attributes: true }; + } + throw new Error("invalid field"); + }); + +const mockDeleteItemSuccessful = mock(async (req: DeleteItemCommand) => { + if (req.input!.Key!.id.S === testWidget.id) { + return { $metadata: true }; + } +}); + +test("when retrieve dynamo dao item then inflates and returns retrieved item", async () => { + const mockClient = { send: mockGetItemSend }; + const logger = new VoidLogger(); + const dao = new DynamoWidgetDAO( + testTable, + mockClient as unknown as DynamoDBClient, + logger, + ); + + const resp = await dao.retrieve(testWidget); + expect(resp).toEqual(testWidget); +}); + +test("when retrieve dynamo dao item not exist then returns undefined", async () => { + const mockClient = { send: mockGetItemSend }; + const logger = new VoidLogger(); + const dao = new DynamoWidgetDAO( + testTable, + mockClient as unknown as DynamoDBClient, + logger, + ); + + const resp = await dao.retrieve({ + id: "this-widget-doesnt-exist", + owner: "simponic", + }); + + expect(resp).toBeUndefined(); +}); + +test("when dynamo dao save then inflates object and returns", async () => { + const mockClient = { + send: expectMockPutItem("new_attribute", "exists"), + }; + const logger = new VoidLogger(); + const dao = new DynamoWidgetDAO( + testTable, + mockClient as unknown as DynamoDBClient, + logger, + ); + + const newWidget = Widget.parse({ + ...testWidget, + otherAttributes: [...testWidget.otherAttributes!], + }); + newWidget.otherAttributes!.push({ name: "new_attribute", value: "exists" }); + + const resp = await dao.save(newWidget); + + expect(resp).toEqual(newWidget); +}); + +test("when dynamo dao delete then returns deleted ", async () => { + const mockClient = { + send: mockDeleteItemSuccessful, + }; + const logger = new VoidLogger(); + + const dao = new DynamoWidgetDAO( + testTable, + mockClient as unknown as DynamoDBClient, + logger, + ); + + const resp = await dao.delete(testWidget); + + expect(resp).toEqual(testWidget); +}); -- cgit v1.3