import { join } from "node:path"; import { expect, it } from "vitest"; import { isolatedEnvironment, selectedTasks, within } from "./e2e.ts"; it("keeps E2E browser, agent, cache, and temporary state inside one run root", () => { const root = "/tmp/pi-ext-e2e-example"; const env = isolatedEnvironment(root, { HOME: "/home/owner", XDG_DATA_HOME: "/home/owner/.local/share", XDG_CONFIG_HOME: "/home/owner/.config", PLAYWRIGHT_BROWSERS_PATH: "/home/owner/.cache/ms-playwright", PI_CODING_AGENT_DIR: "/home/owner/.pi/agent", TMPDIR: "/home/owner/project/.pi/tmp", PI_BAK_S3_ENDPOINT: "https://example.invalid", }); for (const key of [ "HOME", "USERPROFILE", "XDG_CONFIG_HOME", "XDG_CACHE_HOME", "XDG_DATA_HOME", "XDG_STATE_HOME", "TMPDIR", "TMP", "TEMP", "PLAYWRIGHT_BROWSERS_PATH", "PI_CODING_AGENT_DIR", "npm_config_cache", "MISE_CACHE_DIR", "MISE_STATE_DIR", ]) expect(within(root, env[key] ?? "/missing")).toBe(true); expect(env["MISE_DATA_DIR"]).toBe(join("/home/owner/.local/share", "mise")); expect(env["MISE_CONFIG_DIR"]).toBe(join("/home/owner/.config", "mise")); expect(env["PI_BAK_S3_ENDPOINT"]).toBeUndefined(); expect(env["PI_BAK_E2E_S3"]).toBe("0"); expect(env["PI_EXT_E2E_ROOT"]).toBe(root); expect(env["MISE_AUTO_INSTALL"]).toBe("0"); }); it("reuses only explicitly configured CI binary and download caches", () => { const env = isolatedEnvironment("/tmp/isolated", { HOME: "/tmp/ci-home", CI: "true", PI_EXT_CI_CACHE_ROOT: "/cache/toolchains", NPM_CONFIG_CACHE: "/cache/npm", }); expect(env["PLAYWRIGHT_BROWSERS_PATH"]).toBe( join("/cache/toolchains", "browsers"), ); expect(env["npm_config_cache"]).toBe("/cache/npm"); expect(env["MISE_CACHE_DIR"]).toBe(join("/cache/toolchains", "downloads")); expect(env["MISE_STATE_DIR"]).toBe(join("/tmp/isolated", "mise-state")); expect(env["HOME"]).toBe(join("/tmp/isolated", "home")); const local = isolatedEnvironment("/tmp/isolated", { HOME: "/home/owner", PI_EXT_CI_CACHE_ROOT: "/cache/toolchains", }); expect(local["PLAYWRIGHT_BROWSERS_PATH"]).toBe( join("/tmp/isolated", "browsers"), ); }); it("preserves Windows Mise installations before sandboxing AppData", () => { const parent = { USERPROFILE: "C:/Users/owner", LOCALAPPDATA: "D:/AppData/Local", }; expect( isolatedEnvironment("C:/Temp/run", parent, "win32")["MISE_DATA_DIR"], ).toBe(join(parent.LOCALAPPDATA, "mise")); expect( isolatedEnvironment( "C:/Temp/run", { USERPROFILE: parent.USERPROFILE }, "win32", )["MISE_DATA_DIR"], ).toBe(join(parent.USERPROFILE, "AppData", "Local", "mise")); expect( isolatedEnvironment( "C:/Temp/run", { ...parent, XDG_DATA_HOME: "D:/xdg" }, "win32", )["MISE_DATA_DIR"], ).toBe(join("D:/xdg", "mise")); expect( isolatedEnvironment( "C:/Temp/run", { ...parent, XDG_DATA_HOME: "D:/xdg", MISE_DATA_DIR: "D:/explicit" }, "win32", )["MISE_DATA_DIR"], ).toBe("D:/explicit"); }); it("filters only listed local E2E suites", () => { const tasks = ["//extensions/strata:e2e", "//extensions/chrome-cdp:e2e"]; expect(selectedTasks(tasks, "strata")).toEqual([tasks[0]]); expect(() => selectedTasks(tasks, "bak")).toThrow(/No local E2E task/); expect(() => selectedTasks(tasks, "../bak")).toThrow(/extension slug/); }); it("rejects a temporary root inside the repository", () => { const repo = "/home/owner/project"; expect(within(repo, join(repo, ".pi/tmp"))).toBe(true); expect(within(repo, "/tmp/pi-ext-e2e-example")).toBe(false); });