import { mkdtemp, rm } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { afterEach, describe, expect, it } from "vitest"; import { clearPending, markPending, normalizeAlias, readPending, statePaths, } from "../state.js"; let directory: string | undefined; afterEach(async () => { if (directory) await rm(directory, { recursive: true, force: true }); directory = undefined; }); describe("bak state", () => { it("keeps machine identity outside Pi configuration", () => { expect( statePaths( { XDG_STATE_HOME: "/state", XDG_CACHE_HOME: "/cache" }, "linux", "/home/me", ), ).toEqual({ identity: "/state/pi/bak/identity.json", cache: "/cache/pi/bak/catalog.json", pendingDir: "/state/pi/bak/pending", }); }); it("keeps concurrent pending markers independent", async () => { directory = await mkdtemp(join(tmpdir(), "pi-bak-state-")); const pendingDir = join(directory, "pending"); const [first, second, newer] = await Promise.all([ markPending(pendingDir, "/sessions/a.jsonl"), markPending(pendingDir, "/sessions/b.jsonl"), markPending(pendingDir, "/sessions/a.jsonl"), ]); expect( (await readPending(pendingDir)).map((entry) => entry.path).sort(), ).toEqual(["/sessions/a.jsonl", "/sessions/a.jsonl", "/sessions/b.jsonl"]); await clearPending(pendingDir, first.id); expect( (await readPending(pendingDir)).map((entry) => entry.id).sort(), ).toEqual([second.id, newer.id].sort()); }); it("normalizes safe human aliases", () => { expect(normalizeAlias(" Work-Laptop ")).toBe("work-laptop"); expect(normalizeAlias("bad alias")).toBeUndefined(); expect(normalizeAlias("-bad")).toBeUndefined(); }); });