// @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<T>(text: string, values?: readonly unknown[]) {
this.queries.push({ text, values });
return { rows: (this.results.shift() ?? []) as T[] };
}
}