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