
























@@ -0,0 +1,83 @@
1+import { Command } from "commander";
2+import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3+import { loggingState } from "../logging/state.js";
4+5+const registerPluginCliCommandsFromValidatedConfig = vi.fn(async () => ({}));
6+const registerNodesCameraCommands = vi.fn();
7+const registerNodesInvokeCommands = vi.fn();
8+const registerNodesLocationCommands = vi.fn();
9+const registerNodesNotifyCommand = vi.fn();
10+const registerNodesPairingCommands = vi.fn();
11+const registerNodesPushCommand = vi.fn();
12+const registerNodesScreenCommands = vi.fn();
13+const registerNodesStatusCommands = vi.fn();
14+15+vi.mock("../plugins/cli.js", () => ({
16+ registerPluginCliCommandsFromValidatedConfig,
17+}));
18+19+vi.mock("./nodes-cli/register.camera.js", () => ({ registerNodesCameraCommands }));
20+vi.mock("./nodes-cli/register.invoke.js", () => ({ registerNodesInvokeCommands }));
21+vi.mock("./nodes-cli/register.location.js", () => ({ registerNodesLocationCommands }));
22+vi.mock("./nodes-cli/register.notify.js", () => ({ registerNodesNotifyCommand }));
23+vi.mock("./nodes-cli/register.pairing.js", () => ({ registerNodesPairingCommands }));
24+vi.mock("./nodes-cli/register.push.js", () => ({ registerNodesPushCommand }));
25+vi.mock("./nodes-cli/register.screen.js", () => ({ registerNodesScreenCommands }));
26+vi.mock("./nodes-cli/register.status.js", () => ({ registerNodesStatusCommands }));
27+28+const { registerNodesCli } = await import("./nodes-cli/register.js");
29+30+describe("registerNodesCli plugin registration", () => {
31+const originalArgv = process.argv;
32+let originalForceConsoleToStderr = false;
33+34+beforeEach(() => {
35+originalForceConsoleToStderr = loggingState.forceConsoleToStderr;
36+loggingState.forceConsoleToStderr = false;
37+registerPluginCliCommandsFromValidatedConfig.mockClear();
38+});
39+40+afterEach(() => {
41+process.argv = originalArgv;
42+loggingState.forceConsoleToStderr = originalForceConsoleToStderr;
43+});
44+45+async function registerWithArgv(argv: string[]) {
46+process.argv = argv;
47+const program = new Command();
48+await registerNodesCli(program);
49+return program;
50+}
51+52+it("routes plugin registration logs to stderr for nodes --json commands", async () => {
53+let forceStderrDuringRegistration = false;
54+registerPluginCliCommandsFromValidatedConfig.mockImplementationOnce(async () => {
55+forceStderrDuringRegistration = loggingState.forceConsoleToStderr;
56+return {};
57+});
58+59+const program = await registerWithArgv(["node", "openclaw", "nodes", "list", "--json"]);
60+61+expect(registerPluginCliCommandsFromValidatedConfig).toHaveBeenCalledWith(
62+program,
63+undefined,
64+undefined,
65+{ mode: "lazy", primary: "nodes" },
66+);
67+expect(forceStderrDuringRegistration).toBe(true);
68+expect(loggingState.forceConsoleToStderr).toBe(false);
69+});
70+71+it("does not route pass-through --json after the terminator", async () => {
72+let forceStderrDuringRegistration = true;
73+registerPluginCliCommandsFromValidatedConfig.mockImplementationOnce(async () => {
74+forceStderrDuringRegistration = loggingState.forceConsoleToStderr;
75+return {};
76+});
77+78+await registerWithArgv(["node", "openclaw", "nodes", "invoke", "--", "--json"]);
79+80+expect(forceStderrDuringRegistration).toBe(false);
81+expect(loggingState.forceConsoleToStderr).toBe(false);
82+});
83+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。