import test from "node:test"; import assert from "node:assert/strict"; function withEnv(vars: Record, fn: () => void) { const saved: Record = {}; for (const [k, v] of Object.entries(vars)) { saved[k] = process.env[k]; if (v === undefined) delete process.env[k]; else process.env[k] = v; } try { fn(); } finally { for (const [k, v] of Object.entries(saved)) { if (v === undefined) delete process.env[k]; else process.env[k] = v; } } } test("detectRestrictedEnvironment retorna github-codespaces quando CODESPACES=true", async () => { const { detectRestrictedEnvironment } = await import("../../bin/cli/utils/environment.mjs"); withEnv({ CODESPACES: "true" }, () => { const env = detectRestrictedEnvironment(); assert.equal(env.type, "github-codespaces"); assert.equal(env.canOpenBrowser, false); assert.equal(env.canUseTray, false); }); }); test("detectRestrictedEnvironment retorna wsl com hint", async () => { const { detectRestrictedEnvironment } = await import("../../bin/cli/utils/environment.mjs"); withEnv({ WSL_DISTRO_NAME: "Ubuntu-22.04" }, () => { const env = detectRestrictedEnvironment(); assert.equal(env.type, "wsl"); assert.equal(env.canOpenBrowser, true); assert.equal(env.canUseTray, false); assert.ok(env.hint?.includes("Windows")); }); }); test("detectRestrictedEnvironment retorna gitpod quando GITPOD_WORKSPACE_ID set", async () => { const { detectRestrictedEnvironment } = await import("../../bin/cli/utils/environment.mjs"); withEnv({ GITPOD_WORKSPACE_ID: "ws-abc123" }, () => { const env = detectRestrictedEnvironment(); assert.equal(env.type, "gitpod"); assert.equal(env.canOpenBrowser, false); }); }); test("detectRestrictedEnvironment retorna ci quando CI=1", async () => { const { detectRestrictedEnvironment } = await import("../../bin/cli/utils/environment.mjs"); withEnv( { CI: "1", CODESPACES: undefined, WSL_DISTRO_NAME: undefined, GITPOD_WORKSPACE_ID: undefined }, () => { const env = detectRestrictedEnvironment(); assert.equal(env.type, "ci"); assert.equal(env.canOpenBrowser, false); } ); }); test("detectRestrictedEnvironment retorna replit quando REPL_ID set", async () => { const { detectRestrictedEnvironment } = await import("../../bin/cli/utils/environment.mjs"); withEnv({ REPL_ID: "repl-123", CI: undefined, CODESPACES: undefined }, () => { const env = detectRestrictedEnvironment(); assert.equal(env.type, "replit"); assert.equal(env.canOpenBrowser, false); }); }); test("getEnvBanner retorna null para desktop", async () => { const { getEnvBanner } = await import("../../bin/cli/utils/environment.mjs"); withEnv( { CODESPACES: undefined, WSL_DISTRO_NAME: undefined, WSL_INTEROP: undefined, GITPOD_WORKSPACE_ID: undefined, REPL_ID: undefined, REPL_SLUG: undefined, CI: undefined, }, () => { // Non-TTY stdin will return non-interactive, not null // So we just test the function exists and returns a string or null const banner = getEnvBanner(); assert.ok(banner === null || typeof banner === "string"); } ); }); test("getEnvBanner retorna string com tipo para Codespaces", async () => { const { getEnvBanner } = await import("../../bin/cli/utils/environment.mjs"); withEnv({ CODESPACES: "true" }, () => { const banner = getEnvBanner(); assert.ok(typeof banner === "string"); assert.ok(banner!.includes("github-codespaces")); }); }); test("environment.mjs pode ser importado sem erro", async () => { const mod = await import("../../bin/cli/utils/environment.mjs"); assert.equal(typeof mod.detectRestrictedEnvironment, "function"); assert.equal(typeof mod.getEnvBanner, "function"); });