Luigit
repositories / pi-ext

pi-ext

bugabingas pi extensions

owned by admin

extensions/bak/__tests__/state.test.ts

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