summaryrefslogtreecommitdiff
path: root/Homework/cs5260/consumer/t/DynamoWidgetDAO.spec.ts
diff options
context:
space:
mode:
Diffstat (limited to 'Homework/cs5260/consumer/t/DynamoWidgetDAO.spec.ts')
-rw-r--r--Homework/cs5260/consumer/t/DynamoWidgetDAO.spec.ts117
1 files changed, 117 insertions, 0 deletions
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);
+});