repositories / pi-ext
pi-ext
bugabingas pi extensions
owned by admin
extensions/bak/__tests__/search.test.ts
Rawimport { 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);
});
});