mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-30 00:42:20 +00:00
96 lines
2.9 KiB
TypeScript
96 lines
2.9 KiB
TypeScript
import { beforeAll, describe, expect, it, vi } from "vitest";
|
|
import {
|
|
arrangeLegacyStateMigrationTest,
|
|
confirm,
|
|
createDoctorRuntime,
|
|
ensureAuthProfileStore,
|
|
mockDoctorConfigSnapshot,
|
|
serviceIsLoaded,
|
|
serviceRestart,
|
|
writeConfigFile,
|
|
} from "./doctor.e2e-harness.js";
|
|
|
|
let doctorCommand: typeof import("./doctor.js").doctorCommand;
|
|
let healthCommand: typeof import("./health.js").healthCommand;
|
|
|
|
describe("doctor command", () => {
|
|
beforeAll(async () => {
|
|
({ doctorCommand } = await import("./doctor.js"));
|
|
({ healthCommand } = await import("./health.js"));
|
|
});
|
|
|
|
it("runs legacy state migrations in yes mode without prompting", async () => {
|
|
const { doctorCommand, runtime, runLegacyStateMigrations } =
|
|
await arrangeLegacyStateMigrationTest();
|
|
|
|
await (doctorCommand as (runtime: unknown, opts: Record<string, unknown>) => Promise<void>)(
|
|
runtime,
|
|
{ yes: true },
|
|
);
|
|
|
|
expect(runLegacyStateMigrations).toHaveBeenCalledTimes(1);
|
|
expect(confirm).not.toHaveBeenCalled();
|
|
}, 30_000);
|
|
|
|
it("runs legacy state migrations in non-interactive mode without prompting", async () => {
|
|
const { doctorCommand, runtime, runLegacyStateMigrations } =
|
|
await arrangeLegacyStateMigrationTest();
|
|
|
|
await (doctorCommand as (runtime: unknown, opts: Record<string, unknown>) => Promise<void>)(
|
|
runtime,
|
|
{ nonInteractive: true },
|
|
);
|
|
|
|
expect(runLegacyStateMigrations).toHaveBeenCalledTimes(1);
|
|
expect(confirm).not.toHaveBeenCalled();
|
|
}, 30_000);
|
|
|
|
it("skips gateway restarts in non-interactive mode", async () => {
|
|
mockDoctorConfigSnapshot();
|
|
|
|
vi.mocked(healthCommand).mockRejectedValueOnce(new Error("gateway closed"));
|
|
|
|
serviceIsLoaded.mockResolvedValueOnce(true);
|
|
serviceRestart.mockClear();
|
|
confirm.mockClear();
|
|
|
|
await doctorCommand(createDoctorRuntime(), { nonInteractive: true });
|
|
|
|
expect(serviceRestart).not.toHaveBeenCalled();
|
|
expect(confirm).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it("migrates anthropic oauth config profile id when only email profile exists", async () => {
|
|
mockDoctorConfigSnapshot({
|
|
config: {
|
|
auth: {
|
|
profiles: {
|
|
"anthropic:default": { provider: "anthropic", mode: "oauth" },
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
ensureAuthProfileStore.mockReturnValueOnce({
|
|
version: 1,
|
|
profiles: {
|
|
"anthropic:me@example.com": {
|
|
type: "oauth",
|
|
provider: "anthropic",
|
|
access: "access",
|
|
refresh: "refresh",
|
|
expires: Date.now() + 60_000,
|
|
email: "me@example.com",
|
|
},
|
|
},
|
|
});
|
|
|
|
await doctorCommand(createDoctorRuntime(), { yes: true });
|
|
|
|
const written = writeConfigFile.mock.calls.at(-1)?.[0] as Record<string, unknown>;
|
|
const profiles = (written.auth as { profiles: Record<string, unknown> }).profiles;
|
|
expect(profiles["anthropic:me@example.com"]).toBeTruthy();
|
|
expect(profiles["anthropic:default"]).toBeUndefined();
|
|
}, 30_000);
|
|
});
|