Luigit
repositories / pi-ext

pi-ext

bugabingas pi extensions

owned by admin

extensions/usage/__tests__/contract.test.ts

Raw
import { readdirSync, readFileSync } from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";
import { afterEach, describe, expect, it } from "vitest";
import {
	createPiSession,
	type PiSession,
} from "../../../test/fixture/create-pi-session.ts";

describe("usage pi-test-harness", () => {
	let session: PiSession | undefined;

	afterEach(async () => {
		await session?.dispose();
		session = undefined;
	});

	it("loads in real Pi extension runtime", async () => {
		session = await createPiSession({
			extensionPaths: [fileURLToPath(new URL("../index.ts", import.meta.url))],
		});

		expect(session.extensions).toHaveLength(1);
	});

	it("writes debug lifecycle records in its sandbox when enabled", async () => {
		session = await createPiSession({
			env: { PI_USAGE_DEBUG: "1" },
			extensionPaths: [fileURLToPath(new URL("../index.ts", import.meta.url))],
		});
		const extension = session.extensions[0]!;
		const context = session.session.extensionRunner.createCommandContext();
		for (const handler of extension.handlers.get("session_start") ?? [])
			await handler({ type: "session_start" }, context);
		for (const handler of extension.handlers.get("session_shutdown") ?? [])
			await handler({ type: "session_shutdown" }, context);
		const directory = path.join(
			session.cwd,
			".test-state",
			"pi-ext",
			"debug",
			"usage",
		);
		const records = readFileSync(
			path.join(directory, readdirSync(directory)[0]!),
			"utf8",
		)
			.trim()
			.split("\n")
			.map((line) => JSON.parse(line));
		expect(records.map((record) => record.event)).toEqual(
			expect.arrayContaining(["session.start", "session.shutdown"]),
		);
	});

	it("loads the dashboard implementation on first command use", async () => {
		session = await createPiSession({
			extensionPaths: [fileURLToPath(new URL("../index.ts", import.meta.url))],
		});
		const command = session.extensions[0]!.commands.get("usage")!;

		await expect(command.handler("", { hasUI: false } as never)).resolves.toBe(
			undefined,
		);
	});
});