























@@ -143,8 +143,22 @@ async function runValidateJsonAndGetPayload() {
143143};
144144}
145145146+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+146160function requireWriteOptions(): { unsetPaths?: string[][]; explicitSetPaths?: string[][] } {
147-const options = mockWriteConfigFile.mock.calls[0]?.[1];
161+const options = firstWriteConfigOptions();
148162if (!options) {
149163throw new Error("expected write options");
150164}
@@ -251,7 +265,7 @@ describe("config cli", () => {
251265await runConfigCommand(["config", "set", "gateway.auth.mode", "token"]);
252266253267expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
254-const written = mockWriteConfigFile.mock.calls[0]?.[0];
268+const written = firstWrittenConfig();
255269expect(written.gateway?.auth).toEqual({ mode: "token" });
256270expect(written.gateway?.port).toBe(18789);
257271expect(written.agents).toEqual(resolved.agents);
@@ -339,7 +353,7 @@ describe("config cli", () => {
339353await runConfigCommand(["config", "set", "gateway.auth.mode", "token"]);
340354341355expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
342-const written = mockWriteConfigFile.mock.calls[0]?.[0];
356+const written = firstWrittenConfig();
343357expect(written).not.toHaveProperty("agents.defaults.model");
344358expect(written).not.toHaveProperty("agents.defaults.contextWindow");
345359expect(written).not.toHaveProperty("agents.defaults.maxTokens");
@@ -370,7 +384,7 @@ describe("config cli", () => {
370384]);
371385372386expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
373-const written = mockWriteConfigFile.mock.calls[0]?.[0];
387+const written = firstWrittenConfig();
374388expect(written.agents?.defaults?.model).toBe("openai/gpt-5.4");
375389expect(written.agents?.defaults?.imageGenerationModel).toEqual({
376390primary: "openai/gpt-image-1",
@@ -403,7 +417,7 @@ describe("config cli", () => {
403417]);
404418405419expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
406-const written = mockWriteConfigFile.mock.calls[0]?.[0];
420+const written = firstWrittenConfig();
407421expect(written.agents?.defaults?.model).toEqual({
408422primary: "google/gemini-3.1-pro-preview",
409423fallbacks: ["google/gemini-3.1-pro-preview"],
@@ -433,7 +447,7 @@ describe("config cli", () => {
433447]);
434448435449expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
436-const written = mockWriteConfigFile.mock.calls[0]?.[0];
450+const written = firstWrittenConfig();
437451expect(written.agents?.defaults?.models).toEqual({
438452"google/gemini-3.1-pro-preview": { alias: "gemini" },
439453});
@@ -508,7 +522,7 @@ describe("config cli", () => {
508522]);
509523510524expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
511-const written = mockWriteConfigFile.mock.calls[0]?.[0];
525+const written = firstWrittenConfig();
512526expect(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]);
542556543557expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
544-const written = mockWriteConfigFile.mock.calls[0]?.[0];
558+const written = firstWrittenConfig();
545559expect(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", () => {
565579await runConfigCommand(["config", "set", "gateway.auth.mode", "token"]);
566580567581expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
568-const written = mockWriteConfigFile.mock.calls[0]?.[0];
582+const written = firstWrittenConfig();
569583expect(written.gateway?.auth).toEqual({
570584mode: "token",
571585token: "token-keep",
@@ -589,7 +603,7 @@ describe("config cli", () => {
589603await runConfigCommand(["config", "set", "gateway.auth.mode", "password"]);
590604591605expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
592-const written = mockWriteConfigFile.mock.calls[0]?.[0];
606+const written = firstWrittenConfig();
593607expect(written.gateway?.auth).toEqual({
594608mode: "password",
595609password: "password-keep", // pragma: allowlist secret
@@ -617,7 +631,7 @@ describe("config cli", () => {
617631]);
618632619633expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
620-const written = mockWriteConfigFile.mock.calls[0]?.[0];
634+const written = firstWrittenConfig();
621635expect(written.gateway?.auth).toEqual({
622636mode: "token",
623637token: "token-keep",
@@ -824,7 +838,7 @@ describe("config cli", () => {
824838await runConfigCommand(["config", "set", "gateway.auth.mode", "{bad"]);
825839826840expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
827-const written = mockWriteConfigFile.mock.calls[0]?.[0];
841+const written = firstWrittenConfig();
828842expect(written.gateway?.auth).toEqual({ mode: "{bad" });
829843});
830844@@ -870,7 +884,7 @@ describe("config cli", () => {
870884]);
871885872886expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
873-const written = mockWriteConfigFile.mock.calls[0]?.[0];
887+const written = firstWrittenConfig();
874888expect(written.gateway?.auth).toEqual({ mode: "token" });
875889});
876890@@ -926,7 +940,7 @@ describe("config cli", () => {
926940]);
927941928942expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
929-const written = mockWriteConfigFile.mock.calls[0]?.[0];
943+const written = firstWrittenConfig();
930944expect(written.channels?.discord?.token).toEqual({
931945source: "env",
932946provider: "default",
@@ -1000,7 +1014,7 @@ describe("config cli", () => {
10001014]);
1001101510021016expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
1003-const written = mockWriteConfigFile.mock.calls[0]?.[0];
1017+const written = firstWrittenConfig();
10041018expect(written.secrets?.providers?.vaultfile).toEqual({
10051019source: "file",
10061020path: "/tmp/vault.json",
@@ -1358,7 +1372,7 @@ describe("config cli", () => {
13581372]);
1359137313601374expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
1361-const written = mockWriteConfigFile.mock.calls[0]?.[0];
1375+const written = firstWrittenConfig();
13621376expect(written.channels?.googlechat?.serviceAccountRef).toEqual({
13631377source: "file",
13641378provider: "vaultfile",
@@ -1424,7 +1438,7 @@ describe("config cli", () => {
14241438}
1425143914261440expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
1427-const written = mockWriteConfigFile.mock.calls[0]?.[0];
1441+const written = firstWrittenConfig();
14281442expect(written.gateway?.auth).toEqual({ mode: "token" });
14291443});
14301444@@ -1467,7 +1481,7 @@ describe("config cli", () => {
14671481}
1468148214691483expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
1470-const written = mockWriteConfigFile.mock.calls[0]?.[0];
1484+const written = firstWrittenConfig();
14711485expect(written.agents?.defaults?.models).toEqual(resolved.agents?.defaults?.models);
14721486expect(written.agents?.defaults?.model).toEqual(resolved.agents?.defaults?.model);
14731487expect(written.agents?.defaults?.memorySearch).toEqual({
@@ -1553,7 +1567,7 @@ describe("config cli", () => {
15531567}
1554156815551569expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
1556-const written = mockWriteConfigFile.mock.calls[0]?.[0] as Record<string, unknown>;
1570+const written = firstWrittenConfig() as Record<string, unknown>;
15571571expect(
15581572((written.agents as Record<string, unknown>).defaults as Record<string, unknown>).models,
15591573).toEqual({
@@ -1601,7 +1615,7 @@ describe("config cli", () => {
16011615fs.rmSync(pathname, { force: true });
16021616}
160316171604-const written = mockWriteConfigFile.mock.calls[0]?.[0] as Record<string, unknown>;
1618+const written = firstWrittenConfig() as Record<string, unknown>;
16051619expect(
16061620((written.agents as Record<string, unknown>).defaults as Record<string, unknown>).models,
16071621).toEqual({
@@ -1632,7 +1646,7 @@ describe("config cli", () => {
16321646fs.rmSync(pathname, { force: true });
16331647}
163416481635-const written = mockWriteConfigFile.mock.calls[0]?.[0] as Record<string, unknown>;
1649+const written = firstWrittenConfig() as Record<string, unknown>;
16361650expect((written.channels as Record<string, unknown>).slack).toEqual({
16371651enabled: true,
16381652mode: "socket",
@@ -1838,7 +1852,7 @@ describe("config cli", () => {
18381852fs.rmSync(pathname, { force: true });
18391853}
184018541841-const written = mockWriteConfigFile.mock.calls[0]?.[0] as Record<string, unknown>;
1855+const written = firstWrittenConfig() as Record<string, unknown>;
18421856const channels = (written.channels as Record<string, unknown>).discord as Record<
18431857string,
18441858unknown
@@ -2276,14 +2290,14 @@ describe("config cli", () => {
22762290await runConfigCommand(["config", "unset", "tools.alsoAllow"]);
2277229122782292expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
2279-const written = mockWriteConfigFile.mock.calls[0]?.[0];
2293+const written = firstWrittenConfig();
22802294expect(written.tools).not.toHaveProperty("alsoAllow");
22812295expect(written.agents).not.toHaveProperty("defaults");
22822296expect(written.agents?.list).toEqual(resolved.agents?.list);
22832297expect(written.gateway).toEqual(resolved.gateway);
22842298expect(written.tools?.profile).toBe("coding");
22852299expect(written.logging).toEqual(resolved.logging);
2286-expect(mockWriteConfigFile.mock.calls[0]?.[1]).toEqual({
2300+expect(firstWriteConfigOptions()).toEqual({
22872301unsetPaths: [["tools", "alsoAllow"]],
22882302});
22892303});
@@ -2302,9 +2316,9 @@ describe("config cli", () => {
23022316await runConfigCommand(["config", "unset", "agents.list[1]"]);
2303231723042318expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
2305-const written = mockWriteConfigFile.mock.calls[0]?.[0];
2319+const written = firstWrittenConfig();
23062320expect(written.agents?.list).toEqual([{ id: "agent-a" }, { id: "agent-c" }]);
2307-expect(mockWriteConfigFile.mock.calls[0]?.[1]).toBeUndefined();
2321+expect(firstWriteConfigOptions()).toBeUndefined();
23082322});
2309232323102324it("preserves write-level unset handling for numeric object keys", async () => {
@@ -2323,13 +2337,13 @@ describe("config cli", () => {
23232337await runConfigCommand(["config", "unset", "channels.discord.guilds.123"]);
2324233823252339expect(mockWriteConfigFile).toHaveBeenCalledTimes(1);
2326-const written = mockWriteConfigFile.mock.calls[0]?.[0] as {
2340+const written = firstWrittenConfig() as {
23272341channels?: { discord?: { guilds?: Record<string, unknown> } };
23282342};
23292343expect(written.channels?.discord?.guilds).toEqual({
23302344"456": { channels: ["alerts"] },
23312345});
2332-expect(mockWriteConfigFile.mock.calls[0]?.[1]).toEqual({
2346+expect(firstWriteConfigOptions()).toEqual({
23332347unsetPaths: [["channels", "discord", "guilds", "123"]],
23342348});
23352349});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。