import { describe, expect, it } from "vite-plus/test"; import { sortThreads, type ThreadSortInput } from "./threadSort.ts"; type TestThread = { readonly id: string } & ThreadSortInput; function makeThread(overrides: Partial = {}): TestThread { return { id: "thread-1", createdAt: "2026-03-09T10:00:00.000Z", updatedAt: "2026-03-09T10:00:00.000Z", messages: [], latestUserMessageAt: null, ...overrides, }; } describe("sortThreads", () => { it("falls back to updatedAt and createdAt when latestUserMessageAt is invalid and there are no messages", () => { const sorted = sortThreads( [ makeThread({ id: "thread-1", latestUserMessageAt: "not-a-date", createdAt: "2026-03-09T10:00:00.000Z", updatedAt: "2026-03-09T10:05:00.000Z", }), makeThread({ id: "thread-2", latestUserMessageAt: "still-not-a-date", createdAt: "invalid-created-at", updatedAt: "invalid-updated-at", }), makeThread({ id: "thread-3", latestUserMessageAt: "invalid-latest-user-message-at", createdAt: "2026-03-09T10:06:00.000Z", updatedAt: "invalid-updated-at", }), ], "updated_at", ); expect(sorted.map((thread) => thread.id)).toEqual(["thread-3", "thread-1", "thread-2"]); }); it("falls back to the latest valid user message when latestUserMessageAt is invalid", () => { const sorted = sortThreads( [ makeThread({ id: "thread-1", latestUserMessageAt: "invalid-latest-user-message-at", updatedAt: "2026-03-09T10:00:00.000Z", messages: [ { role: "user", createdAt: "2026-03-09T10:05:00.000Z" }, { role: "assistant", createdAt: "2026-03-09T10:30:00.000Z" }, { role: "user", createdAt: "2026-03-09T10:20:00.000Z" }, ], }), makeThread({ id: "thread-2", createdAt: "2026-03-09T10:15:00.000Z", updatedAt: "2026-03-09T10:15:00.000Z", }), ], "updated_at", ); expect(sorted.map((thread) => thread.id)).toEqual(["thread-1", "thread-2"]); }); });