test: speed up backup and doctor suites

This commit is contained in:
Peter Steinberger
2026-03-24 17:15:31 +00:00
parent cc9d1103d9
commit f47549c5f6
5 changed files with 77 additions and 20 deletions

View File

@@ -2,7 +2,7 @@ import fs from "node:fs/promises";
import os from "node:os";
import path from "node:path";
import * as tar from "tar";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
import { createTempHomeEnv, type TempHomeEnv } from "../test-utils/temp-home.js";
import { buildBackupArchiveRoot } from "./backup-shared.js";
import { backupVerifyCommand } from "./backup-verify.js";
@@ -97,11 +97,25 @@ async function withBrokenArchiveFixture(
describe("backupVerifyCommand", () => {
let tempHome: TempHomeEnv;
beforeEach(async () => {
async function resetTempHome() {
await fs.rm(tempHome.home, { recursive: true, force: true });
await fs.mkdir(path.join(tempHome.home, ".openclaw"), { recursive: true });
delete process.env.OPENCLAW_CONFIG_PATH;
}
beforeAll(async () => {
tempHome = await createTempHomeEnv("openclaw-backup-verify-test-");
});
beforeEach(async () => {
await resetTempHome();
});
afterEach(async () => {
vi.restoreAllMocks();
});
afterAll(async () => {
await tempHome.restore();
});

View File

@@ -1,7 +1,7 @@
import fs from "node:fs/promises";
import os from "node:os";
import path from "node:path";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
import { createTempHomeEnv, type TempHomeEnv } from "../test-utils/temp-home.js";
const tarCreateMock = vi.hoisted(() => vi.fn());
@@ -20,13 +20,27 @@ const { backupCreateCommand } = await import("./backup.js");
describe("backupCreateCommand atomic archive write", () => {
let tempHome: TempHomeEnv;
beforeEach(async () => {
async function resetTempHome() {
await fs.rm(tempHome.home, { recursive: true, force: true });
await fs.mkdir(path.join(tempHome.home, ".openclaw"), { recursive: true });
delete process.env.OPENCLAW_CONFIG_PATH;
}
beforeAll(async () => {
tempHome = await createTempHomeEnv("openclaw-backup-atomic-test-");
});
beforeEach(async () => {
await resetTempHome();
tarCreateMock.mockReset();
backupVerifyCommandMock.mockReset();
});
afterEach(async () => {
vi.restoreAllMocks();
});
afterAll(async () => {
await tempHome.restore();
});

View File

@@ -2,7 +2,7 @@ import fs from "node:fs/promises";
import os from "node:os";
import path from "node:path";
import * as tar from "tar";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
import type { RuntimeEnv } from "../runtime.js";
import { createTempHomeEnv, type TempHomeEnv } from "../test-utils/temp-home.js";
import {
@@ -21,8 +21,18 @@ vi.mock("./backup-verify.js", () => ({
describe("backup commands", () => {
let tempHome: TempHomeEnv;
beforeEach(async () => {
async function resetTempHome() {
await fs.rm(tempHome.home, { recursive: true, force: true });
await fs.mkdir(path.join(tempHome.home, ".openclaw"), { recursive: true });
delete process.env.OPENCLAW_CONFIG_PATH;
}
beforeAll(async () => {
tempHome = await createTempHomeEnv("openclaw-backup-test-");
});
beforeEach(async () => {
await resetTempHome();
backupVerifyCommandMock.mockReset();
backupVerifyCommandMock.mockResolvedValue({
ok: true,
@@ -37,6 +47,9 @@ describe("backup commands", () => {
afterEach(async () => {
vi.restoreAllMocks();
});
afterAll(async () => {
await tempHome.restore();
});

View File

@@ -35,20 +35,35 @@ async function collectDoctorWarnings(config: Record<string, unknown>): Promise<s
}
}
async function loadFreshDoctorFlowDeps() {
vi.resetModules();
const telegramFetchModule = await import("../../extensions/telegram/src/fetch.js");
const telegramProxyModule = await import("../../extensions/telegram/src/proxy.js");
const freshCommandSecretGatewayModule = await import("../cli/command-secret-gateway.js");
const freshNoteModule = await import("../terminal/note.js");
const doctorFlowModule = await import("./doctor-config-flow.js");
return {
telegramFetchModule,
telegramProxyModule,
commandSecretGatewayModule: freshCommandSecretGatewayModule,
noteModule: freshNoteModule,
loadAndMaybeMigrateDoctorConfig: doctorFlowModule.loadAndMaybeMigrateDoctorConfig,
};
type DoctorFlowDeps = {
telegramFetchModule: typeof import("../../extensions/telegram/src/fetch.js");
telegramProxyModule: typeof import("../../extensions/telegram/src/proxy.js");
commandSecretGatewayModule: typeof import("../cli/command-secret-gateway.js");
noteModule: typeof import("../terminal/note.js");
loadAndMaybeMigrateDoctorConfig: typeof import("./doctor-config-flow.js").loadAndMaybeMigrateDoctorConfig;
};
let cachedDoctorFlowDeps: Promise<DoctorFlowDeps> | undefined;
async function loadFreshDoctorFlowDeps(): Promise<DoctorFlowDeps> {
if (!cachedDoctorFlowDeps) {
vi.resetModules();
cachedDoctorFlowDeps = (async () => {
const telegramFetchModule = await import("../../extensions/telegram/src/fetch.js");
const telegramProxyModule = await import("../../extensions/telegram/src/proxy.js");
const freshCommandSecretGatewayModule = await import("../cli/command-secret-gateway.js");
const freshNoteModule = await import("../terminal/note.js");
const doctorFlowModule = await import("./doctor-config-flow.js");
return {
telegramFetchModule,
telegramProxyModule,
commandSecretGatewayModule: freshCommandSecretGatewayModule,
noteModule: freshNoteModule,
loadAndMaybeMigrateDoctorConfig: doctorFlowModule.loadAndMaybeMigrateDoctorConfig,
};
})();
}
return await cachedDoctorFlowDeps;
}
type DiscordGuildRule = {

View File

@@ -18,6 +18,7 @@ describe("doctor command", () => {
vi.resetModules();
({ doctorCommand } = await import("./doctor.js"));
({ healthCommand } = await import("./health.js"));
vi.clearAllMocks();
});
it("runs legacy state migrations in yes mode without prompting", async () => {