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); });