aegida-console / lib / db / conversations.test.ts
conversations.test.ts
Raw
// @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[] };
  }
}