import { Command } from "commander"; import { beforeEach, describe, expect, it, vi } from "vitest"; import { addGatewayServiceCommands } from "./register-service-commands.js"; const runDaemonInstall = vi.fn(async (_opts: unknown) => {}); const runDaemonRestart = vi.fn(async (_opts: unknown) => {}); const runDaemonStart = vi.fn(async (_opts: unknown) => {}); const runDaemonStatus = vi.fn(async (_opts: unknown) => {}); const runDaemonStop = vi.fn(async (_opts: unknown) => {}); const runDaemonUninstall = vi.fn(async (_opts: unknown) => {}); vi.mock("./runners.js", () => ({ runDaemonInstall: (opts: unknown) => runDaemonInstall(opts), runDaemonRestart: (opts: unknown) => runDaemonRestart(opts), runDaemonStart: (opts: unknown) => runDaemonStart(opts), runDaemonStatus: (opts: unknown) => runDaemonStatus(opts), runDaemonStop: (opts: unknown) => runDaemonStop(opts), runDaemonUninstall: (opts: unknown) => runDaemonUninstall(opts), })); function createGatewayParentLikeCommand() { const gateway = new Command().name("gateway"); // Mirror overlapping root gateway options that conflict with service subcommand options. gateway.option("--port ", "Port for the gateway WebSocket"); gateway.option("--token ", "Gateway token"); gateway.option("--password ", "Gateway password"); gateway.option("--force", "Gateway run --force", false); addGatewayServiceCommands(gateway); return gateway; } describe("addGatewayServiceCommands", () => { beforeEach(() => { runDaemonInstall.mockClear(); runDaemonRestart.mockClear(); runDaemonStart.mockClear(); runDaemonStatus.mockClear(); runDaemonStop.mockClear(); runDaemonUninstall.mockClear(); }); it.each([ { name: "forwards install option collisions from parent gateway command", argv: ["install", "--force", "--port", "19000", "--token", "tok_test"], assert: () => { expect(runDaemonInstall).toHaveBeenCalledWith( expect.objectContaining({ force: true, port: "19000", token: "tok_test", }), ); }, }, { name: "forwards status auth collisions from parent gateway command", argv: ["status", "--token", "tok_status", "--password", "pw_status"], assert: () => { expect(runDaemonStatus).toHaveBeenCalledWith( expect.objectContaining({ rpc: expect.objectContaining({ token: "tok_status", password: "pw_status", // pragma: allowlist secret }), }), ); }, }, { name: "forwards require-rpc for status", argv: ["status", "--require-rpc"], assert: () => { expect(runDaemonStatus).toHaveBeenCalledWith( expect.objectContaining({ requireRpc: true, }), ); }, }, ])("$name", async ({ argv, assert }) => { const gateway = createGatewayParentLikeCommand(); await gateway.parseAsync(argv, { from: "user" }); assert(); }); });