
























@@ -22,6 +22,18 @@ function createChildProcess(): ChildProcess {
2222return new EventEmitter() as ChildProcess;
2323}
242425+function expectSpawned(expectedArgs: string[]): SpawnOptions {
26+expect(spawnMock).toHaveBeenCalledOnce();
27+const call = spawnMock.mock.calls[0] as [string, string[], SpawnOptions] | undefined;
28+if (!call) {
29+throw new Error("missing spawn call");
30+}
31+const [command, args, options] = call;
32+expect(command).toBe(process.execPath);
33+expect(args).toEqual(expectedArgs);
34+return options;
35+}
36+2537describe("launchTuiCli", () => {
2638beforeEach(() => {
2739process.argv = [...originalArgv];
@@ -67,23 +79,20 @@ describe("launchTuiCli", () => {
6779deliver: false,
6880});
698170-expect(spawnMock).toHaveBeenCalledWith(
71-process.execPath,
72-[
73-"--import",
74-"tsx",
75-"--no-warnings",
76-"/repo/openclaw.mjs",
77-"tui",
78-"--url",
79-"ws://127.0.0.1:18789",
80-"--token",
81-"test-token",
82-"--password",
83-"test-password",
84-],
85-expect.objectContaining({ stdio: "inherit" }),
86-);
82+const options = expectSpawned([
83+"--import",
84+"tsx",
85+"--no-warnings",
86+"/repo/openclaw.mjs",
87+"tui",
88+"--url",
89+"ws://127.0.0.1:18789",
90+"--token",
91+"test-token",
92+"--password",
93+"test-password",
94+]);
95+expect(options.stdio).toBe("inherit");
8796});
88978998it("passes local mode through to the relaunched TUI", async () => {
@@ -95,11 +104,8 @@ describe("launchTuiCli", () => {
9510496105await launchTuiCli({ local: true, deliver: false });
9710698-expect(spawnMock).toHaveBeenCalledWith(
99-process.execPath,
100-["/repo/openclaw.mjs", "tui", "--local"],
101-expect.objectContaining({ stdio: "inherit" }),
102-);
107+const options = expectSpawned(["/repo/openclaw.mjs", "tui", "--local"]);
108+expect(options.stdio).toBe("inherit");
103109});
104110105111it("passes initial message and timeout through to the relaunched TUI", async () => {
@@ -116,19 +122,16 @@ describe("launchTuiCli", () => {
116122timeoutMs: 300_000,
117123});
118124119-expect(spawnMock).toHaveBeenCalledWith(
120-process.execPath,
121-[
122-"/repo/openclaw.mjs",
123-"tui",
124-"--local",
125-"--message",
126-"Wake up, my friend!",
127-"--timeout-ms",
128-"300000",
129-],
130-expect.objectContaining({ stdio: "inherit" }),
131-);
125+const options = expectSpawned([
126+"/repo/openclaw.mjs",
127+"tui",
128+"--local",
129+"--message",
130+"Wake up, my friend!",
131+"--timeout-ms",
132+"300000",
133+]);
134+expect(options.stdio).toBe("inherit");
132135});
133136134137it("launches compiled CLI shapes without repeating the current command", async () => {
@@ -141,11 +144,8 @@ describe("launchTuiCli", () => {
141144142145await launchTuiCli({ deliver: false });
143146144-expect(spawnMock).toHaveBeenCalledWith(
145-process.execPath,
146-["tui"],
147-expect.objectContaining({ stdio: "inherit" }),
148-);
147+const options = expectSpawned(["tui"]);
148+expect(options.stdio).toBe("inherit");
149149});
150150151151it("pins the child gateway URL and config auth source through env without adding url argv", async () => {
@@ -160,15 +160,8 @@ describe("launchTuiCli", () => {
160160{ authSource: "config", gatewayUrl: "ws://127.0.0.1:18789" },
161161);
162162163-expect(spawnMock).toHaveBeenCalledWith(
164-process.execPath,
165-["/repo/openclaw.mjs", "tui"],
166-expect.objectContaining({
167-env: expect.objectContaining({
168-OPENCLAW_GATEWAY_URL: "ws://127.0.0.1:18789",
169-OPENCLAW_TUI_SETUP_AUTH_SOURCE: "config",
170-}),
171-}),
172-);
163+const options = expectSpawned(["/repo/openclaw.mjs", "tui"]);
164+expect(options.env?.OPENCLAW_GATEWAY_URL).toBe("ws://127.0.0.1:18789");
165+expect(options.env?.OPENCLAW_TUI_SETUP_AUTH_SOURCE).toBe("config");
173166});
174167});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。