import { mkdtempSync } from "node:fs"; import { join } from "node:path"; import { tmpdir } from "node:os"; import { test, expect, describe } from "bun:test"; async function run(command: string[], cwd: string, env: Record = {}) { const proc = Bun.spawn(command, { cwd, stdout: "pipe", stderr: "pipe", env: { PATH: process.env.PATH ?? "", HOME: env.HOME ?? process.env.HOME ?? "", ...env, }, }); const [exitCode, stdout, stderr] = await Promise.all([ proc.exited, new Response(proc.stdout).text(), new Response(proc.stderr).text(), ]); return { exitCode, stdout, stderr }; } describe("commit command", () => { test("clean repository exits without requiring API key", async () => { const repo = mkdtempSync(join(tmpdir(), "gai-clean-repo-")); const home = mkdtempSync(join(tmpdir(), "gai-empty-home-")); const init = await run(["git", "init"], repo, { HOME: home }); expect(init.exitCode).toBe(0); const result = await run( ["bun", "run", join(import.meta.dir, "..", "index.ts"), "commit"], repo, { HOME: home, GAI_API_KEY: "", }, ); expect(result.exitCode).toBe(0); expect(result.stdout).toContain("Nothing to commit"); expect(result.stdout).toContain("No staged or unstaged changes"); expect(result.stderr).not.toContain("API key not set"); expect(result.stderr).not.toContain("requires a TTY"); }); });