

























11import fs from "node:fs";
22import os from "node:os";
33import path from "node:path";
4-import { beforeEach, describe, expect, it, vi } from "vitest";
4+import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
55import {
66callGateway,
77createDoctorRuntime,
@@ -12,6 +12,8 @@ import { loadDoctorCommandForTest, terminalNoteMock } from "./doctor.note-test-h
1212import "./doctor.fast-path-mocks.js";
13131414let doctorCommand: typeof import("./doctor.js").doctorCommand;
15+let defaultDoctorCommand: typeof import("./doctor.js").doctorCommand;
16+let reloadDefaultDoctorCommand = false;
15171618const OPENAI_PROVIDER_ID = "openai";
1719const LEGACY_CODEX_PROVIDER_ID = "openai-codex";
@@ -99,13 +101,37 @@ function requireTerminalNote(params: { title?: string; messageIncludes?: string
99101return note;
100102}
101103104+function mockDoctorBrowserFastPath(): void {
105+vi.doMock("./doctor-browser.js", () => ({
106+detectLegacyClawdBrowserProfileResidue: vi.fn().mockResolvedValue(null),
107+maybeArchiveLegacyClawdBrowserProfileResidue: vi.fn().mockResolvedValue({
108+changes: [],
109+warnings: [],
110+}),
111+noteChromeMcpBrowserReadiness: vi.fn().mockResolvedValue(undefined),
112+}));
113+}
114+102115describe("doctor command", () => {
103-beforeEach(async () => {
104-doctorCommand = await loadDoctorCommandForTest({
116+beforeAll(async () => {
117+defaultDoctorCommand = await loadDoctorCommandForTest({
105118unmockModules: ["../flows/doctor-health-contributions.js", "./doctor-state-integrity.js"],
106119});
107120});
108121122+beforeEach(async () => {
123+if (reloadDefaultDoctorCommand) {
124+vi.doUnmock("../plugin-sdk/facade-loader.js");
125+mockDoctorBrowserFastPath();
126+defaultDoctorCommand = await loadDoctorCommandForTest({
127+unmockModules: ["../flows/doctor-health-contributions.js", "./doctor-state-integrity.js"],
128+});
129+reloadDefaultDoctorCommand = false;
130+}
131+doctorCommand = defaultDoctorCommand;
132+terminalNoteMock.mockClear();
133+});
134+109135it("warns when the state directory is missing", async () => {
110136mockDoctorConfigSnapshot();
111137@@ -134,33 +160,37 @@ describe("doctor command", () => {
134160 loadBundledPluginPublicSurfaceModuleSync,
135161};
136162});
137-doctorCommand = await loadDoctorCommandForTest({
138-unmockModules: [
139-"../flows/doctor-health-contributions.js",
140-"./doctor-browser.js",
141-"./doctor-state-integrity.js",
142-],
143-});
163+try {
164+doctorCommand = await loadDoctorCommandForTest({
165+unmockModules: [
166+"../flows/doctor-health-contributions.js",
167+"./doctor-browser.js",
168+"./doctor-state-integrity.js",
169+],
170+});
144171145-mockDoctorConfigSnapshot({
146-config: {
147-browser: {
148-defaultProfile: "user",
172+mockDoctorConfigSnapshot({
173+config: {
174+browser: {
175+defaultProfile: "user",
176+},
149177},
150-},
151-});
178+});
152179153-await runDoctorNonInteractive();
180+ await runDoctorNonInteractive();
154181155-expect(loadBundledPluginPublicSurfaceModuleSync).toHaveBeenCalledWith({
156-dirName: "browser",
157-artifactBasename: "browser-doctor.js",
158-});
159-const browserFallbackNote = requireTerminalNote({
160-title: "Browser",
161-messageIncludes: "Browser health check is unavailable",
162-});
163-expect(String(browserFallbackNote[0])).toContain("missing browser doctor facade");
182+expect(loadBundledPluginPublicSurfaceModuleSync).toHaveBeenCalledWith({
183+dirName: "browser",
184+artifactBasename: "browser-doctor.js",
185+});
186+const browserFallbackNote = requireTerminalNote({
187+title: "Browser",
188+messageIncludes: "Browser health check is unavailable",
189+});
190+expect(String(browserFallbackNote[0])).toContain("missing browser doctor facade");
191+} finally {
192+reloadDefaultDoctorCommand = true;
193+}
164194});
165195166196it("warns about opencode provider overrides", async () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。