



























@@ -10,6 +10,12 @@ const mocks = vi.hoisted(() => ({
1010maybeRunConfiguredPluginInstallReleaseStep: vi.fn(),
1111note: vi.fn(),
1212replaceConfigFile: vi.fn().mockResolvedValue(undefined),
13+readConfigFileSnapshot: vi.fn().mockResolvedValue({
14+exists: true,
15+valid: true,
16+config: {},
17+issues: [],
18+}),
1319applyWizardMetadata: vi.fn((cfg: unknown) => cfg),
1420logConfigUpdated: vi.fn(),
1521shortenHomePath: vi.fn((p: string) => p),
@@ -31,6 +37,7 @@ vi.mock("../version.js", () => ({
3137vi.mock("../config/config.js", () => ({
3238CONFIG_PATH: "/tmp/fake-openclaw.json",
3339replaceConfigFile: mocks.replaceConfigFile,
40+readConfigFileSnapshot: mocks.readConfigFileSnapshot,
3441}));
35423643vi.mock("../commands/onboard-helpers.js", () => ({
@@ -80,6 +87,13 @@ describe("doctor health contributions", () => {
8087beforeEach(() => {
8188mocks.maybeRunConfiguredPluginInstallReleaseStep.mockReset();
8289mocks.note.mockReset();
90+mocks.readConfigFileSnapshot.mockReset();
91+mocks.readConfigFileSnapshot.mockResolvedValue({
92+exists: true,
93+valid: true,
94+config: {},
95+issues: [],
96+});
8397});
84988599afterEach(() => {
@@ -280,6 +294,44 @@ describe("doctor health contributions", () => {
280294);
281295});
282296297+it("skips plugin schema validation for final validation during update doctor runs", async () => {
298+const contribution = requireDoctorContribution("doctor:final-config-validation");
299+300+await contribution.run({
301+cfg: {},
302+configResult: { cfg: {} },
303+sourceConfigValid: true,
304+prompter: buildDoctorPrompter(true),
305+runtime: { log: vi.fn(), error: vi.fn(), exit: vi.fn() },
306+options: {},
307+env: {
308+OPENCLAW_UPDATE_IN_PROGRESS: "1",
309+},
310+} as Parameters<(typeof contribution)["run"]>[0]);
311+312+expect(mocks.readConfigFileSnapshot).toHaveBeenCalledWith({
313+skipPluginValidation: true,
314+});
315+});
316+317+it("keeps plugin schema validation for ordinary doctor final validation", async () => {
318+const contribution = requireDoctorContribution("doctor:final-config-validation");
319+320+await contribution.run({
321+cfg: {},
322+configResult: { cfg: {} },
323+sourceConfigValid: true,
324+prompter: buildDoctorPrompter(true),
325+runtime: { log: vi.fn(), error: vi.fn(), exit: vi.fn() },
326+options: {},
327+env: {},
328+} as Parameters<(typeof contribution)["run"]>[0]);
329+330+expect(mocks.readConfigFileSnapshot).toHaveBeenCalledWith({
331+skipPluginValidation: false,
332+});
333+});
334+283335it("allows allowConfigSizeDrop when not in update", async () => {
284336const ctx = buildWriteConfigCtx({});
285337await writeConfigContribution.run(ctx);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。