// @vitest-environment node import { afterEach, describe, expect, it, vi } from "vitest"; const { send } = vi.hoisted(() => ({ send: vi.fn() })); vi.mock("server-only", () => ({})); vi.mock("@aws-sdk/client-s3", () => ({ GetObjectCommand: class GetObjectCommand { constructor(readonly input: unknown) {} }, S3Client: class S3Client { send = send; }, })); import { getAttachmentObject } from "@/lib/storage/s3"; afterEach(() => { vi.unstubAllEnvs(); send.mockReset(); }); describe("legacy S3 attachment storage", () => { it("streams an existing private object-key row during migration retention", async () => { vi.stubEnv("S3_ENDPOINT", "http://localhost:9000"); vi.stubEnv("S3_BUCKET", "chat-attachments"); vi.stubEnv("S3_ACCESS_KEY_ID", "test"); vi.stubEnv("S3_SECRET_ACCESS_KEY", "test"); const stream = new ReadableStream(); send.mockResolvedValue({ Body: { transformToWebStream: () => stream } }); await expect( getAttachmentObject("users/user-1/attachments/legacy-object"), ).resolves.toBe(stream); expect(send).toHaveBeenCalledWith( expect.objectContaining({ input: { Bucket: "chat-attachments", Key: "users/user-1/attachments/legacy-object", }, }), ); }); });