import { Command } from "commander"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { applyParentDefaultHelpAction, isParentDefaultHelpAction } from "./parent-default-help.js"; describe("applyParentDefaultHelpAction (#73077)", () => { let originalExitCode: NodeJS.Process["exitCode"]; let originalSuppressHelpBanner: string | undefined; beforeEach(() => { originalExitCode = process.exitCode; originalSuppressHelpBanner = process.env.OPENCLAW_SUPPRESS_HELP_BANNER; process.exitCode = undefined; }); afterEach(() => { process.exitCode = originalExitCode; if (originalSuppressHelpBanner === undefined) { delete process.env.OPENCLAW_SUPPRESS_HELP_BANNER; } else { process.env.OPENCLAW_SUPPRESS_HELP_BANNER = originalSuppressHelpBanner; } }); function buildParent(): Command { const program = new Command(); program.exitOverride(); const parent = program.command("parent").description("test parent"); parent.exitOverride(); parent.command("list").action(() => {}); parent.command("status").action(() => {}); return parent; } it("invokes parent help and exits 0 when invoked without subcommand", async () => { const parent = buildParent(); const suppressHelpBannerValues: Array = []; const helpSpy = vi.spyOn(parent, "outputHelp").mockImplementation(() => { suppressHelpBannerValues.push(process.env.OPENCLAW_SUPPRESS_HELP_BANNER); }); expect(isParentDefaultHelpAction(parent)).toBe(false); applyParentDefaultHelpAction(parent); expect(isParentDefaultHelpAction(parent)).toBe(true); await parent.parent!.parseAsync(["node", "test", "parent"]); expect(helpSpy).toHaveBeenCalledTimes(1); expect(suppressHelpBannerValues).toEqual(["1"]); expect(process.env.OPENCLAW_SUPPRESS_HELP_BANNER).toBeUndefined(); expect(process.exitCode).toBe(0); }); it("still routes through subcommand actions when one is invoked", async () => { const parent = buildParent(); const listAction = vi.fn(); parent.commands.find((c) => c.name() === "list")!.action(listAction); const helpSpy = vi.spyOn(parent, "outputHelp").mockImplementation(() => {}); applyParentDefaultHelpAction(parent); await parent.parent!.parseAsync(["node", "test", "parent", "list"]); expect(listAction).toHaveBeenCalledTimes(1); expect(helpSpy).not.toHaveBeenCalled(); }); });