import { describe, expect, it } from "vitest"; import { searchRecords } from "../implementation.js"; import type { CatalogCache, SessionRecord } from "../state.js"; const hostId = "12345678-1234-1234-1234-123456789abc"; const id = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"; function record( id: string, name: string | undefined, created: string, ): SessionRecord { return { id, key: `sessions/${hostId}/${id}.jsonl`, ...(name ? { name } : {}), cwd: "/projects/pi-ext", created, }; } function cache(sessions: SessionRecord[]): CatalogCache { return { refreshedAt: "2026-01-01T00:00:00.000Z", catalog: { version: 1, hosts: [{ hostId, alias: "laptop" }] }, indexes: [{ version: 1, hostId, alias: "laptop", sessions }], }; } describe("bak catalog search", () => { it("matches names and paths without reading sessions, newest first", () => { const older = record(id, "Design Notes", "2025-01-01T00:00:00.000Z"); const newer = record( "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb", undefined, "2026-01-01T00:00:00.000Z", ); const catalog = cache([older, newer]); expect( searchRecords(catalog, "DESIGN").map(({ record }) => record.id), ).toEqual([id]); expect( searchRecords(catalog, "PI-EXT").map(({ record }) => record.id), ).toEqual([newer.id, older.id]); expect(searchRecords(catalog, " ")).toEqual([]); }); it("limits output and uses unambiguous restore prefixes", () => { const records = Array.from({ length: 12 }, (_, index) => record( `aaaaaaaa-aaaa-aaaa-aaaa-${index.toString().padStart(12, "0")}`, "common", new Date(Date.UTC(2025, 0, index + 1)).toISOString(), ), ); const matches = searchRecords(cache(records), "common"); expect(matches).toHaveLength(10); expect(matches[0]?.record.id).toBe(records[11]?.id); expect( matches.every(({ prefix, record }) => record.id.startsWith(prefix)), ).toBe(true); expect(new Set(matches.map(({ prefix }) => prefix)).size).toBe(10); expect(matches.every(({ prefix }) => prefix.length > 8)).toBe(true); }); });