// @vitest-environment node import { describe, expect, it } from "vitest"; import { listGatewayMessages } from "@/lib/db/conversations"; describe("listGatewayMessages", () => { it("keeps text-only history as strings and emits native Gate file parts", async () => { const database = new ResultDatabase([ [ { id: "message-1", role: "user", content: "earlier text" }, { id: "message-2", role: "assistant", content: "answer" }, { id: "message-3", role: "user", content: "review this" }, { id: "message-4", role: "user", content: "" }, ], [ { message_id: "message-3", gate_file_id: "file-first" }, { message_id: "message-3", gate_file_id: "file-second" }, { message_id: "message-4", gate_file_id: "file-only" }, ], ]); await expect( listGatewayMessages(database, "user-1", "conversation-1"), ).resolves.toEqual([ { role: "user", content: "earlier text" }, { role: "assistant", content: "answer" }, { role: "user", content: [ { type: "text", text: "review this" }, { type: "file", file: { file_id: "file-first" } }, { type: "file", file: { file_id: "file-second" } }, ], }, { role: "user", content: [{ type: "file", file: { file_id: "file-only" } }], }, ]); expect(database.queries[1].text).toContain("attachment.gate_file_id IS NOT NULL"); expect(database.queries[1].values).toEqual(["conversation-1", "user-1"]); }); }); class ResultDatabase { queries: Array<{ text: string; values?: readonly unknown[] }> = []; constructor(private readonly results: unknown[][]) {} async query(text: string, values?: readonly unknown[]) { this.queries.push({ text, values }); return { rows: (this.results.shift() ?? []) as T[] }; } }