import { mkdtempSync, readdirSync, readFileSync, rmSync } from "node:fs"; import { tmpdir } from "node:os"; import path from "node:path"; import { fileURLToPath } from "node:url"; import { afterEach, describe, expect, it, vi } from "vitest"; import { createPiSession, type PiSession, } from "../../../test/fixture/create-pi-session.ts"; const extensionPath = fileURLToPath(new URL("../index.ts", import.meta.url)); let root: string | undefined; let session: PiSession | undefined; afterEach(async () => { await session?.dispose(); if (root) rmSync(root, { recursive: true, force: true }); session = undefined; root = undefined; }); describe("footer debug diagnostics", () => { it("writes its lifecycle records in the isolated sandbox", async () => { root = mkdtempSync(path.join(tmpdir(), "pi-ext-footer-debug-")); session = await createPiSession({ cwd: root, env: { PI_FOOTER_DEBUG: "1" }, extensionPaths: [extensionPath], }); await session.session.extensionRunner.emit({ type: "session_start", reason: "startup", }); await session.session.extensionRunner.emit({ type: "session_shutdown", reason: "quit", }); const directory = path.join( session.env["XDG_STATE_HOME"] ?? path.join(root, ".test-state"), "pi-ext", "debug", "footer", ); const readRecords = () => readdirSync(directory).flatMap((file) => readFileSync(path.join(directory, file), "utf8") .trim() .split("\n") .filter(Boolean) .map( (line) => JSON.parse(line) as { event: string; extension: string }, ), ); const records = await vi.waitFor(() => { const current = readRecords(); expect(current).toContainEqual( expect.objectContaining({ event: "session.start", extension: "footer", }), ); expect(current).toContainEqual( expect.objectContaining({ event: "session.shutdown", extension: "footer", }), ); return current; }); expect(records).toContainEqual( expect.objectContaining({ event: "session.start", extension: "footer" }), ); expect(records).toContainEqual( expect.objectContaining({ event: "session.shutdown", extension: "footer", }), ); }); });