import { afterEach, describe, expect, it } from "bun:test"; import * as fs from "node:fs"; import * as os from "node:os"; import * as path from "node:path"; import { filterProcessEnv, parseEnvFile } from "@oh-my-pi/pi-utils/env"; const tempDirs: string[] = []; afterEach(() => { for (const dir of tempDirs.splice(0)) { fs.rmSync(dir, { force: true, recursive: true }); } }); function writeTempEnv(content: string): string { const dir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-utils-env-")); tempDirs.push(dir); const filePath = path.join(dir, ".env"); fs.writeFileSync(filePath, content); return filePath; } describe("parseEnvFile", () => { it("ignores malformed names and nul-containing values", () => { const filePath = writeTempEnv( [ "GOOD=value", "_ALSO_GOOD='quoted value'", "1BAD=value", "BAD-NAME=value", "BAD NAME=value", "BAD_VALUE=before\0after", "# comment", "NO_EQUALS", ].join("\n"), ); expect(parseEnvFile(filePath)).toEqual({ GOOD: "value", _ALSO_GOOD: "quoted value", }); }); it("mirrors valid OMP_ variables to PI_ variables", () => { const filePath = writeTempEnv("OMP_FEATURE=enabled\nOMP_BAD=before\0after\n"); expect(parseEnvFile(filePath)).toEqual({ OMP_FEATURE: "enabled", PI_FEATURE: "enabled", }); }); }); describe("filterProcessEnv", () => { it("drops entries that cannot be passed to process spawn env", () => { expect( filterProcessEnv({ GOOD: "value", EMPTY: "", "BAD=NAME": "value", BAD_VALUE: "before\0after", MISSING: undefined, }), ).toEqual({ GOOD: "value", EMPTY: "", }); }); it("drops macOS malloc stack logging toggles instead of forwarding disabled values", () => { expect( filterProcessEnv({ GOOD: "value", MallocStackLogging: "0", MallocStackLoggingNoCompact: "0", }), ).toEqual({ GOOD: "value", }); }); it("preserves Windows-style variable names containing parentheses", () => { // `ProgramFiles(x86)` and friends are standard on Windows and must // survive the scrub so Git Bash discovery in procmgr.ts can resolve // 32-bit Program Files installations. expect( filterProcessEnv({ "ProgramFiles(x86)": "C:\\Program Files (x86)", "CommonProgramFiles(x86)": "C:\\Program Files (x86)\\Common Files", }), ).toEqual({ "ProgramFiles(x86)": "C:\\Program Files (x86)", "CommonProgramFiles(x86)": "C:\\Program Files (x86)\\Common Files", }); }); });