aegida-console / lib / chat / request-limits.test.ts
request-limits.test.ts
Raw
import { describe, expect, it } from "vitest";

import {
  MAX_CHAT_MESSAGE_CHARACTERS,
  createRequestMessages,
} from "@/lib/chat/request-limits";
import type { ChatMessage } from "@/lib/chat/types";

function completeMessage(index: number, content: string): ChatMessage {
  return {
    id: `message-${index}`,
    role: index % 2 === 0 ? "user" : "assistant",
    content,
    createdAt: "2026-07-26T10:00:00.000Z",
    status: "complete",
  };
}

describe("createRequestMessages", () => {
  it("keeps the exact 100-message boundary and trims older completed history", () => {
    const exactBoundary = Array.from({ length: 100 }, (_, index) =>
      completeMessage(index, `message-${index}`),
    );
    const overBoundary = [completeMessage(-1, "oldest"), ...exactBoundary];

    expect(createRequestMessages(exactBoundary)).toHaveLength(100);
    expect(createRequestMessages(overBoundary)).toEqual(
      exactBoundary.map(({ role, content }) => ({ role, content })),
    );
  });

  it("keeps exactly 128,000 characters and trims the oldest overflow", () => {
    const exactBoundary = Array.from({ length: 4 }, (_, index) =>
      completeMessage(index, String(index).repeat(32_000)),
    );

    expect(
      createRequestMessages(exactBoundary).reduce(
        (total, message) => total + message.content.length,
        0,
      ),
    ).toBe(128_000);
    expect(
      createRequestMessages([completeMessage(-1, "x"), ...exactBoundary]),
    ).toEqual(exactBoundary.map(({ role, content }) => ({ role, content })));
  });

  it("stops before an oversized historical message so the newest context stays valid", () => {
    const latest = completeMessage(2, "latest user message");

    expect(
      createRequestMessages([
        completeMessage(0, "older message"),
        completeMessage(1, "x".repeat(MAX_CHAT_MESSAGE_CHARACTERS + 1)),
        latest,
      ]),
    ).toEqual([{ role: latest.role, content: latest.content }]);
  });
});