





















@@ -1,8 +1,16 @@
11import { Command } from "commander";
2-import { describe, expect, it, vi } from "vitest";
2+import { beforeEach, describe, expect, it, vi } from "vitest";
33import { registerNodeCli } from "./register.js";
445+type LoadNodeHostConfig = typeof import("../../node-host/config.js").loadNodeHostConfig;
6+57const daemonMocks = vi.hoisted(() => ({
8+defaultRuntime: {
9+error: vi.fn(),
10+exit: vi.fn(),
11+},
12+loadNodeHostConfig: vi.fn<LoadNodeHostConfig>(async () => null),
13+runNodeHost: vi.fn(),
614runNodeDaemonInstall: vi.fn(),
715runNodeDaemonRestart: vi.fn(),
816runNodeDaemonStart: vi.fn(),
@@ -14,11 +22,15 @@ const daemonMocks = vi.hoisted(() => ({
1422vi.mock("./daemon.js", () => daemonMocks);
15231624vi.mock("../../node-host/config.js", () => ({
17-loadNodeHostConfig: vi.fn(async () => null),
25+loadNodeHostConfig: daemonMocks.loadNodeHostConfig,
1826}));
19272028vi.mock("../../node-host/runner.js", () => ({
21-runNodeHost: vi.fn(),
29+runNodeHost: daemonMocks.runNodeHost,
30+}));
31+32+vi.mock("../../runtime.js", () => ({
33+defaultRuntime: daemonMocks.defaultRuntime,
2234}));
23352436function createProgram(): Command {
@@ -33,11 +45,62 @@ function createProgram(): Command {
3345}
34463547describe("registerNodeCli", () => {
48+beforeEach(() => {
49+daemonMocks.defaultRuntime.error.mockClear();
50+daemonMocks.defaultRuntime.exit.mockClear();
51+daemonMocks.loadNodeHostConfig.mockClear();
52+daemonMocks.loadNodeHostConfig.mockResolvedValue(null);
53+daemonMocks.runNodeHost.mockClear();
54+daemonMocks.runNodeDaemonInstall.mockClear();
55+daemonMocks.runNodeDaemonRestart.mockClear();
56+daemonMocks.runNodeDaemonStart.mockClear();
57+daemonMocks.runNodeDaemonStatus.mockClear();
58+daemonMocks.runNodeDaemonStop.mockClear();
59+daemonMocks.runNodeDaemonUninstall.mockClear();
60+});
61+3662it("registers node start for the macOS app node service manager", async () => {
3763const program = createProgram();
38643965await program.parseAsync(["node", "start", "--json"], { from: "user" });
40664167expect(daemonMocks.runNodeDaemonStart.mock.calls[0]?.[0]?.json).toBe(true);
4268});
69+70+it("rejects an explicit invalid node run port", async () => {
71+const program = createProgram();
72+73+await program.parseAsync(["node", "run", "--port", "abc"], { from: "user" });
74+75+expect(daemonMocks.runNodeHost).not.toHaveBeenCalled();
76+expect(daemonMocks.defaultRuntime.error).toHaveBeenCalledWith(
77+expect.stringContaining("Invalid --port"),
78+);
79+expect(daemonMocks.defaultRuntime.exit).toHaveBeenCalledWith(1);
80+});
81+82+it("uses an explicit valid node run port", async () => {
83+const program = createProgram();
84+85+await program.parseAsync(["node", "run", "--port", "19000"], { from: "user" });
86+87+expect(daemonMocks.runNodeHost).toHaveBeenCalledWith(
88+expect.objectContaining({ gatewayPort: 19000 }),
89+);
90+});
91+92+it("falls back to configured node run port when --port is omitted", async () => {
93+daemonMocks.loadNodeHostConfig.mockResolvedValue({
94+version: 1,
95+nodeId: "node-existing",
96+gateway: { host: "10.0.0.2", port: 19001 },
97+});
98+const program = createProgram();
99+100+await program.parseAsync(["node", "run"], { from: "user" });
101+102+expect(daemonMocks.runNodeHost).toHaveBeenCalledWith(
103+expect.objectContaining({ gatewayHost: "10.0.0.2", gatewayPort: 19001 }),
104+);
105+});
43106});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。