






















@@ -10,6 +10,9 @@ const applyPluginAutoEnable = vi.hoisted(() =>
1010autoEnabledReasons: {} as Record<string, string[]>,
1111})),
1212);
13+const configMocks = vi.hoisted(() => ({
14+isNixMode: { value: false },
15+}));
1316const pluginManifestRegistry = vi.hoisted(() => ({ plugins: [], diagnostics: [] }));
1417const pluginMetadataSnapshot = vi.hoisted(
1518(): PluginMetadataSnapshot => ({
@@ -52,20 +55,30 @@ const pluginMetadataSnapshot = vi.hoisted(
5255}),
5356);
545755-vi.mock("../config/config.js", () => ({
56-applyConfigOverrides: vi.fn((config: OpenClawConfig) => config),
57-isNixMode: false,
58+vi.mock("../config/io.js", () => ({
5859readConfigFileSnapshot: vi.fn(),
5960readConfigFileSnapshotWithPluginMetadata: vi.fn(),
6061recoverConfigFromLastKnownGood: vi.fn(),
6162recoverConfigFromJsonRootSuffix: vi.fn(),
63+}));
64+65+vi.mock("../config/paths.js", () => ({
66+get isNixMode() {
67+return configMocks.isNixMode.value;
68+},
69+}));
70+71+vi.mock("../config/runtime-overrides.js", () => ({
72+applyConfigOverrides: vi.fn((config: OpenClawConfig) => config),
73+}));
74+75+vi.mock("../config/recovery-policy.js", () => ({
6276isPluginLocalInvalidConfigSnapshot: vi.fn((snapshot: ConfigFileSnapshot) => {
6377if (snapshot.valid || snapshot.legacyIssues.length > 0 || snapshot.issues.length === 0) {
6478return false;
6579}
6680return snapshot.issues.every((issue) => issue.path.startsWith("plugins.entries."));
6781}),
68-replaceConfigFile: vi.fn(),
6982shouldAttemptLastKnownGoodRecovery: vi.fn((snapshot: ConfigFileSnapshot) => {
7083if (snapshot.valid) {
7184return false;
@@ -76,12 +89,18 @@ vi.mock("../config/config.js", () => ({
7689snapshot.issues.every((issue) => issue.path.startsWith("plugins.entries."))
7790);
7891}),
92+}));
93+94+vi.mock("../config/mutate.js", () => ({
95+replaceConfigFile: vi.fn(),
96+}));
97+98+vi.mock("../config/validation.js", () => ({
7999validateConfigObjectWithPlugins: vi.fn((config: OpenClawConfig) => ({
80100ok: true,
81101 config,
82102warnings: [],
83103})),
84-writeConfigFile: vi.fn(),
85104}));
8610587106vi.mock("../config/plugin-auto-enable.js", () => ({
@@ -93,7 +112,8 @@ vi.mock("./config-recovery-notice.js", () => ({
93112}));
9411395114let loadGatewayStartupConfigSnapshot: typeof import("./server-startup-config.js").loadGatewayStartupConfigSnapshot;
96-let configIo: typeof import("../config/config.js");
115+let configIo: typeof import("../config/io.js");
116+let configMutate: typeof import("../config/mutate.js");
97117let recoveryNotice: typeof import("./config-recovery-notice.js");
9811899119const configPath = "/tmp/openclaw-startup-recovery.json";
@@ -123,12 +143,14 @@ function buildSnapshot(params: {
123143describe("gateway startup config recovery", () => {
124144beforeAll(async () => {
125145({ loadGatewayStartupConfigSnapshot } = await import("./server-startup-config.js"));
126-configIo = await import("../config/config.js");
146+configIo = await import("../config/io.js");
147+configMutate = await import("../config/mutate.js");
127148recoveryNotice = await import("./config-recovery-notice.js");
128149});
129150130151beforeEach(() => {
131152vi.clearAllMocks();
153+configMocks.isNixMode.value = false;
132154vi.mocked(configIo.readConfigFileSnapshotWithPluginMetadata).mockImplementation(async () => ({
133155snapshot: await vi.mocked(configIo.readConfigFileSnapshot)(),
134156}));
@@ -200,7 +222,7 @@ describe("gateway startup config recovery", () => {
200222env: process.env,
201223manifestRegistry: pluginManifestRegistry,
202224});
203-expect(configIo.replaceConfigFile).not.toHaveBeenCalled();
225+expect(configMutate.replaceConfigFile).not.toHaveBeenCalled();
204226expect(log.info).not.toHaveBeenCalled();
205227});
206228@@ -291,7 +313,7 @@ describe("gateway startup config recovery", () => {
291313snapshot: legacySnapshot,
292314 pluginMetadataSnapshot,
293315});
294-vi.mocked(configIo, true).isNixMode = true;
316+configMocks.isNixMode.value = true;
295317296318await expect(
297319loadGatewayStartupConfigSnapshot({
@@ -495,7 +517,7 @@ describe("gateway startup config recovery", () => {
495517config.models?.providers?.anthropic,
496518);
497519expect(configIo.recoverConfigFromLastKnownGood).not.toHaveBeenCalled();
498-expect(configIo.writeConfigFile).not.toHaveBeenCalled();
520+expect(configMutate.replaceConfigFile).not.toHaveBeenCalled();
499521expect(log.warn).toHaveBeenCalledWith(
500522'gateway: skipped model provider openrouter; configured provider api is invalid. Run "openclaw doctor --fix" to repair the config.',
501523);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。