Luigit
repositories / pi-ext

pi-ext

bugabingas pi extensions

owned by admin

extensions/bak/__tests__/search.test.ts

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