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 }]);
});
});