import { afterEach, describe, expect, it } from "vitest"; import { spawnSync } from "node:child_process"; import { resolve } from "node:path"; import { fakeGitlabToken, makeTempRepo, type TempRepo } from "../helpers/tempRepo"; const root = resolve(__dirname, "../.."); const tsx = resolve(root, "node_modules/.bin/tsx"); let repo: TempRepo; afterEach(() => repo?.cleanup()); const run = (cli: string, cwd: string, args: string[] = []) => spawnSync(tsx, [resolve(root, "tools", cli), ...args], { cwd, encoding: "utf8" }); describe("command line tools", () => { it("secretScanCli exits 0 on a clean repo", () => { repo = makeTempRepo(); repo.write("a.txt", "fine"); repo.track("a.txt"); const r = run("secretScanCli.ts", repo.dir); expect(r.status, `exit ${r.status}; stderr: ${r.stderr}; stdout: ${String(r.stdout).slice(0, 300)}`).toBe(0); expect(r.stdout).toContain("no secrets found"); }); it("secretScanCli exits 1 and hides the secret", () => { repo = makeTempRepo(); const token = fakeGitlabToken(); repo.write("a.env", `T=${token}`); repo.track("a.env"); const r = run("secretScanCli.ts", repo.dir); expect(r.status, `exit ${r.status}; stderr: ${r.stderr}; stdout: ${String(r.stdout).slice(0, 300)}`).toBe(1); expect(r.stdout).toContain("a.env:1"); expect(r.stdout + r.stderr).not.toContain(token); }); it("repoCheckCli passes in this repository", () => { const r = run("repoCheckCli.ts", root); expect(r.status, `exit ${r.status}; stderr: ${r.stderr}; stdout: ${String(r.stdout).slice(0, 300)}`).toBe(0); expect(r.stdout).toContain("repo files: ok"); }); it("repoCheckCli fails in an empty folder and lists why", () => { repo = makeTempRepo({ git: false }); const r = run("repoCheckCli.ts", repo.dir); expect(r.status, `exit ${r.status}; stderr: ${r.stderr}; stdout: ${String(r.stdout).slice(0, 300)}`).toBe(1); expect(r.stdout).toContain("LICENSE: missing"); }); });