Skip to content

Commit 5ed2a9a

Browse files
committed
test: guard config cli mock calls
1 parent 3d37afd commit 5ed2a9a

1 file changed

Lines changed: 42 additions & 28 deletions

File tree

src/cli/config-cli.test.ts

Lines changed: 42 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,22 @@ async function runValidateJsonAndGetPayload() {
143143
};
144144
}
145145

146+
function firstWrittenConfig(): OpenClawConfig {
147+
const written = mockWriteConfigFile.mock.calls.at(0)?.[0];
148+
if (!written) {
149+
throw new Error("expected written config");
150+
}
151+
return written;
152+
}
153+
154+
function firstWriteConfigOptions():
155+
| { unsetPaths?: string[][]; explicitSetPaths?: string[][] }
156+
| undefined {
157+
return mockWriteConfigFile.mock.calls.at(0)?.[1];
158+
}
159+
146160
function requireWriteOptions(): { unsetPaths?: string[][]; explicitSetPaths?: string[][] } {
147-
const options = mockWriteConfigFile.mock.calls[0]?.[1];
161+
const options = firstWriteConfigOptions();
148162
if (!options) {
149163
throw new Error("expected write options");
150164
}
@@ -251,7 +265,7 @@ describe("config cli", () => {
251265
await runConfigCommand(["config", "set", "gateway.auth.mode", "token"]);
252266

253267
expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
254-
const written = mockWriteConfigFile.mock.calls[0]?.[0];
268+
const written = firstWrittenConfig();
255269
expect(written.gateway?.auth).toEqual({ mode: "token" });
256270
expect(written.gateway?.port).toBe(18789);
257271
expect(written.agents).toEqual(resolved.agents);
@@ -339,7 +353,7 @@ describe("config cli", () => {
339353
await runConfigCommand(["config", "set", "gateway.auth.mode", "token"]);
340354

341355
expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
342-
const written = mockWriteConfigFile.mock.calls[0]?.[0];
356+
const written = firstWrittenConfig();
343357
expect(written).not.toHaveProperty("agents.defaults.model");
344358
expect(written).not.toHaveProperty("agents.defaults.contextWindow");
345359
expect(written).not.toHaveProperty("agents.defaults.maxTokens");
@@ -370,7 +384,7 @@ describe("config cli", () => {
370384
]);
371385

372386
expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
373-
const written = mockWriteConfigFile.mock.calls[0]?.[0];
387+
const written = firstWrittenConfig();
374388
expect(written.agents?.defaults?.model).toBe("openai/gpt-5.4");
375389
expect(written.agents?.defaults?.imageGenerationModel).toEqual({
376390
primary: "openai/gpt-image-1",
@@ -403,7 +417,7 @@ describe("config cli", () => {
403417
]);
404418

405419
expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
406-
const written = mockWriteConfigFile.mock.calls[0]?.[0];
420+
const written = firstWrittenConfig();
407421
expect(written.agents?.defaults?.model).toEqual({
408422
primary: "google/gemini-3.1-pro-preview",
409423
fallbacks: ["google/gemini-3.1-pro-preview"],
@@ -433,7 +447,7 @@ describe("config cli", () => {
433447
]);
434448

435449
expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
436-
const written = mockWriteConfigFile.mock.calls[0]?.[0];
450+
const written = firstWrittenConfig();
437451
expect(written.agents?.defaults?.models).toEqual({
438452
"google/gemini-3.1-pro-preview": { alias: "gemini" },
439453
});
@@ -508,7 +522,7 @@ describe("config cli", () => {
508522
]);
509523

510524
expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
511-
const written = mockWriteConfigFile.mock.calls[0]?.[0];
525+
const written = firstWrittenConfig();
512526
expect(written.agents?.defaults?.models).toEqual({
513527
"openai/gpt-5.4": { alias: "GPT" },
514528
"anthropic/claude-sonnet-4-6": { alias: "Sonnet" },
@@ -541,7 +555,7 @@ describe("config cli", () => {
541555
]);
542556

543557
expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
544-
const written = mockWriteConfigFile.mock.calls[0]?.[0];
558+
const written = firstWrittenConfig();
545559
expect(written.models?.providers?.ollama?.models).toEqual([
546560
{ id: "llama3.2", name: "Llama 3.2 latest", contextWindow: 131072 },
547561
{ id: "qwen3", name: "Qwen 3" },
@@ -565,7 +579,7 @@ describe("config cli", () => {
565579
await runConfigCommand(["config", "set", "gateway.auth.mode", "token"]);
566580

567581
expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
568-
const written = mockWriteConfigFile.mock.calls[0]?.[0];
582+
const written = firstWrittenConfig();
569583
expect(written.gateway?.auth).toEqual({
570584
mode: "token",
571585
token: "token-keep",
@@ -589,7 +603,7 @@ describe("config cli", () => {
589603
await runConfigCommand(["config", "set", "gateway.auth.mode", "password"]);
590604

591605
expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
592-
const written = mockWriteConfigFile.mock.calls[0]?.[0];
606+
const written = firstWrittenConfig();
593607
expect(written.gateway?.auth).toEqual({
594608
mode: "password",
595609
password: "password-keep", // pragma: allowlist secret
@@ -617,7 +631,7 @@ describe("config cli", () => {
617631
]);
618632

619633
expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
620-
const written = mockWriteConfigFile.mock.calls[0]?.[0];
634+
const written = firstWrittenConfig();
621635
expect(written.gateway?.auth).toEqual({
622636
mode: "token",
623637
token: "token-keep",
@@ -824,7 +838,7 @@ describe("config cli", () => {
824838
await runConfigCommand(["config", "set", "gateway.auth.mode", "{bad"]);
825839

826840
expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
827-
const written = mockWriteConfigFile.mock.calls[0]?.[0];
841+
const written = firstWrittenConfig();
828842
expect(written.gateway?.auth).toEqual({ mode: "{bad" });
829843
});
830844

@@ -870,7 +884,7 @@ describe("config cli", () => {
870884
]);
871885

872886
expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
873-
const written = mockWriteConfigFile.mock.calls[0]?.[0];
887+
const written = firstWrittenConfig();
874888
expect(written.gateway?.auth).toEqual({ mode: "token" });
875889
});
876890

@@ -926,7 +940,7 @@ describe("config cli", () => {
926940
]);
927941

928942
expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
929-
const written = mockWriteConfigFile.mock.calls[0]?.[0];
943+
const written = firstWrittenConfig();
930944
expect(written.channels?.discord?.token).toEqual({
931945
source: "env",
932946
provider: "default",
@@ -1000,7 +1014,7 @@ describe("config cli", () => {
10001014
]);
10011015

10021016
expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
1003-
const written = mockWriteConfigFile.mock.calls[0]?.[0];
1017+
const written = firstWrittenConfig();
10041018
expect(written.secrets?.providers?.vaultfile).toEqual({
10051019
source: "file",
10061020
path: "/tmp/vault.json",
@@ -1358,7 +1372,7 @@ describe("config cli", () => {
13581372
]);
13591373

13601374
expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
1361-
const written = mockWriteConfigFile.mock.calls[0]?.[0];
1375+
const written = firstWrittenConfig();
13621376
expect(written.channels?.googlechat?.serviceAccountRef).toEqual({
13631377
source: "file",
13641378
provider: "vaultfile",
@@ -1424,7 +1438,7 @@ describe("config cli", () => {
14241438
}
14251439

14261440
expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
1427-
const written = mockWriteConfigFile.mock.calls[0]?.[0];
1441+
const written = firstWrittenConfig();
14281442
expect(written.gateway?.auth).toEqual({ mode: "token" });
14291443
});
14301444

@@ -1467,7 +1481,7 @@ describe("config cli", () => {
14671481
}
14681482

14691483
expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
1470-
const written = mockWriteConfigFile.mock.calls[0]?.[0];
1484+
const written = firstWrittenConfig();
14711485
expect(written.agents?.defaults?.models).toEqual(resolved.agents?.defaults?.models);
14721486
expect(written.agents?.defaults?.model).toEqual(resolved.agents?.defaults?.model);
14731487
expect(written.agents?.defaults?.memorySearch).toEqual({
@@ -1553,7 +1567,7 @@ describe("config cli", () => {
15531567
}
15541568

15551569
expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
1556-
const written = mockWriteConfigFile.mock.calls[0]?.[0] as Record<string, unknown>;
1570+
const written = firstWrittenConfig() as Record<string, unknown>;
15571571
expect(
15581572
((written.agents as Record<string, unknown>).defaults as Record<string, unknown>).models,
15591573
).toEqual({
@@ -1601,7 +1615,7 @@ describe("config cli", () => {
16011615
fs.rmSync(pathname, { force: true });
16021616
}
16031617

1604-
const written = mockWriteConfigFile.mock.calls[0]?.[0] as Record<string, unknown>;
1618+
const written = firstWrittenConfig() as Record<string, unknown>;
16051619
expect(
16061620
((written.agents as Record<string, unknown>).defaults as Record<string, unknown>).models,
16071621
).toEqual({
@@ -1632,7 +1646,7 @@ describe("config cli", () => {
16321646
fs.rmSync(pathname, { force: true });
16331647
}
16341648

1635-
const written = mockWriteConfigFile.mock.calls[0]?.[0] as Record<string, unknown>;
1649+
const written = firstWrittenConfig() as Record<string, unknown>;
16361650
expect((written.channels as Record<string, unknown>).slack).toEqual({
16371651
enabled: true,
16381652
mode: "socket",
@@ -1838,7 +1852,7 @@ describe("config cli", () => {
18381852
fs.rmSync(pathname, { force: true });
18391853
}
18401854

1841-
const written = mockWriteConfigFile.mock.calls[0]?.[0] as Record<string, unknown>;
1855+
const written = firstWrittenConfig() as Record<string, unknown>;
18421856
const channels = (written.channels as Record<string, unknown>).discord as Record<
18431857
string,
18441858
unknown
@@ -2276,14 +2290,14 @@ describe("config cli", () => {
22762290
await runConfigCommand(["config", "unset", "tools.alsoAllow"]);
22772291

22782292
expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
2279-
const written = mockWriteConfigFile.mock.calls[0]?.[0];
2293+
const written = firstWrittenConfig();
22802294
expect(written.tools).not.toHaveProperty("alsoAllow");
22812295
expect(written.agents).not.toHaveProperty("defaults");
22822296
expect(written.agents?.list).toEqual(resolved.agents?.list);
22832297
expect(written.gateway).toEqual(resolved.gateway);
22842298
expect(written.tools?.profile).toBe("coding");
22852299
expect(written.logging).toEqual(resolved.logging);
2286-
expect(mockWriteConfigFile.mock.calls[0]?.[1]).toEqual({
2300+
expect(firstWriteConfigOptions()).toEqual({
22872301
unsetPaths: [["tools", "alsoAllow"]],
22882302
});
22892303
});
@@ -2302,9 +2316,9 @@ describe("config cli", () => {
23022316
await runConfigCommand(["config", "unset", "agents.list[1]"]);
23032317

23042318
expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
2305-
const written = mockWriteConfigFile.mock.calls[0]?.[0];
2319+
const written = firstWrittenConfig();
23062320
expect(written.agents?.list).toEqual([{ id: "agent-a" }, { id: "agent-c" }]);
2307-
expect(mockWriteConfigFile.mock.calls[0]?.[1]).toBeUndefined();
2321+
expect(firstWriteConfigOptions()).toBeUndefined();
23082322
});
23092323

23102324
it("preserves write-level unset handling for numeric object keys", async () => {
@@ -2323,13 +2337,13 @@ describe("config cli", () => {
23232337
await runConfigCommand(["config", "unset", "channels.discord.guilds.123"]);
23242338

23252339
expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
2326-
const written = mockWriteConfigFile.mock.calls[0]?.[0] as {
2340+
const written = firstWrittenConfig() as {
23272341
channels?: { discord?: { guilds?: Record<string, unknown> } };
23282342
};
23292343
expect(written.channels?.discord?.guilds).toEqual({
23302344
"456": { channels: ["alerts"] },
23312345
});
2332-
expect(mockWriteConfigFile.mock.calls[0]?.[1]).toEqual({
2346+
expect(firstWriteConfigOptions()).toEqual({
23332347
unsetPaths: [["channels", "discord", "guilds", "123"]],
23342348
});
23352349
});

0 commit comments

Comments
 (0)