import fs from "node:fs"; import os from "node:os"; import path from "node:path"; import { afterEach, beforeEach, vi } from "vitest"; import { createEmptyPluginRegistry } from "../plugins/registry-empty.js"; import { normalizeLowercaseStringOrEmpty } from "../shared/string-coerce.js"; import type { MockFn } from "../test-utils/vitest-mock-fn.js"; import {
readEmbeddedGatewayTokenForTest,
testServiceAuditCodes,
} from "./doctor-service-audit.test-helpers.js"; import type { LegacyStateDetection } from "./doctor-state-migrations.js";
let originalIsTTY: boolean | undefined;
let originalStateDir: string | undefined;
let originalUpdateInProgress: string | undefined;
let tempStateDir: string | undefined;
export const readConfigFileSnapshot = vi.fn() as unknown as MockFn;
export const confirm = vi.fn().mockResolvedValue(true) as unknown as MockFn;
export const select = vi.fn().mockResolvedValue("node") as unknown as MockFn;
export const note = vi.fn() as unknown as MockFn;
export const writeConfigFile = vi.fn().mockResolvedValue(undefined) as unknown as MockFn;
export const resolveOpenClawPackageRoot = vi.fn().mockResolvedValue(null) as unknown as MockFn;
export const runGatewayUpdate = vi
.fn()
.mockResolvedValue(createGatewayUpdateResult()) as unknown as MockFn;
export const collectRelevantDoctorPluginIds = vi.fn(() => []) as unknown as MockFn;
export const listPluginDoctorLegacyConfigRules = vi.fn(() => []) as unknown as MockFn;
export const runDoctorHealthContributions = vi.fn(
defaultRunDoctorHealthContributions,
) as unknown as MockFn;
export const maybeRepairMemoryRecallHealth = vi
.fn()
.mockResolvedValue(undefined) as unknown as MockFn;
export const noteMemorySearchHealth = vi.fn().mockResolvedValue(undefined) as unknown as MockFn;
export const noteMemoryRecallHealth = vi.fn().mockResolvedValue(undefined) as unknown as MockFn;
export const migrateLegacyConfig = vi.fn((raw: unknown) => ({
config: raw as Record<string, unknown>,
changes: ["Moved routing.allowFrom → channels.whatsapp.allowFrom."],
})) as unknown as MockFn;
export const runExec = vi.fn().mockResolvedValue({
stdout: "",
stderr: "",
}) as unknown as MockFn;
export const runCommandWithTimeout = vi
.fn()
.mockResolvedValue(createCommandWithTimeoutResult()) as unknown as MockFn;
export const ensureAuthProfileStore = vi
.fn()
.mockReturnValue({ version: 1, profiles: {} }) as unknown as MockFn;
export const legacyReadConfigFileSnapshot = vi
.fn()
.mockResolvedValue(createLegacyConfigSnapshot()) as unknown as MockFn;
export const createConfigIO = vi.fn(() => ({
readConfigFileSnapshot: legacyReadConfigFileSnapshot,
})) as unknown as MockFn;
export const findLegacyGatewayServices = vi.fn().mockResolvedValue([]) as unknown as MockFn;
export const uninstallLegacyGatewayServices = vi.fn().mockResolvedValue([]) as unknown as MockFn;
export const findExtraGatewayServices = vi.fn().mockResolvedValue([]) as unknown as MockFn;
export const renderGatewayServiceCleanupHints = vi
.fn()
.mockReturnValue(["cleanup"]) as unknown as MockFn;
export const auditGatewayServiceConfig = vi
.fn()
.mockResolvedValue({ ok: true, issues: [] }) as unknown as MockFn;
export const buildGatewayInstallPlan = vi.mocked(
vi.fn().mockResolvedValue({
programArguments: ["node", "cli", "gateway", "--port", "18789"],
workingDirectory: "/tmp",
environment: {},
}),
) as unknown as MockFn;
export const resolveGatewayAuthTokenForService = vi
.fn()
.mockResolvedValue({ token: undefined }) as unknown as MockFn;
export const resolveGatewayProgramArguments = vi.fn().mockResolvedValue({
programArguments: ["node", "cli", "gateway", "--port", "18789"],
}) as unknown as MockFn;
export const serviceInstall = vi.fn().mockResolvedValue(undefined) as unknown as MockFn;
export const serviceIsLoaded = vi.fn().mockResolvedValue(false) as unknown as MockFn;
export const serviceStop = vi.fn().mockResolvedValue(undefined) as unknown as MockFn;
export const serviceRestart = vi.fn().mockResolvedValue(undefined) as unknown as MockFn;
export const serviceUninstall = vi.fn().mockResolvedValue(undefined) as unknown as MockFn;
export const serviceReadCommand = vi.fn().mockResolvedValue(null) as unknown as MockFn;
export const callGateway = vi
.fn()
.mockRejectedValue(new Error("gateway closed")) as unknown as MockFn;
export const autoMigrateLegacyStateDir = vi.fn().mockResolvedValue({
migrated: false,
skipped: false,
changes: [],
warnings: [],
}) as unknown as MockFn;
export const runChannelPluginStartupMaintenance = vi
.fn()
.mockResolvedValue(undefined) as unknown as MockFn;
export function createDoctorRuntime() { return {
log: vi.fn() as unknown as MockFn,
error: vi.fn() as unknown as MockFn,
exit: vi.fn() as unknown as MockFn,
};
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.