From 8cc3a5e4608298944cb2884df9c433b91a4f9f5d Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 21 Feb 2026 23:48:24 +0000 Subject: [PATCH] test(doctor): tighten legacy migration e2e timeout budgets --- ...om-channels-whatsapp-allowfrom.e2e.test.ts | 84 +++++++++++-------- ...lack-discord-dm-policy-aliases.e2e.test.ts | 76 +++++++++-------- 2 files changed, 88 insertions(+), 72 deletions(-) diff --git a/src/commands/doctor.migrates-routing-allowfrom-channels-whatsapp-allowfrom.e2e.test.ts b/src/commands/doctor.migrates-routing-allowfrom-channels-whatsapp-allowfrom.e2e.test.ts index e51796430..467929f28 100644 --- a/src/commands/doctor.migrates-routing-allowfrom-channels-whatsapp-allowfrom.e2e.test.ts +++ b/src/commands/doctor.migrates-routing-allowfrom-channels-whatsapp-allowfrom.e2e.test.ts @@ -15,32 +15,38 @@ import { writeConfigFile, } from "./doctor.e2e-harness.js"; +const DOCTOR_MIGRATION_TIMEOUT_MS = 20_000; + describe("doctor command", () => { - it("migrates routing.allowFrom to channels.whatsapp.allowFrom", { timeout: 60_000 }, async () => { - mockDoctorConfigSnapshot({ - parsed: { routing: { allowFrom: ["+15555550123"] } }, - valid: false, - issues: [{ path: "routing.allowFrom", message: "legacy" }], - legacyIssues: [{ path: "routing.allowFrom", message: "legacy" }], - }); + it( + "migrates routing.allowFrom to channels.whatsapp.allowFrom", + { timeout: DOCTOR_MIGRATION_TIMEOUT_MS }, + async () => { + mockDoctorConfigSnapshot({ + parsed: { routing: { allowFrom: ["+15555550123"] } }, + valid: false, + issues: [{ path: "routing.allowFrom", message: "legacy" }], + legacyIssues: [{ path: "routing.allowFrom", message: "legacy" }], + }); - const { doctorCommand } = await import("./doctor.js"); - const runtime = createDoctorRuntime(); + const { doctorCommand } = await import("./doctor.js"); + const runtime = createDoctorRuntime(); - migrateLegacyConfig.mockReturnValue({ - config: { channels: { whatsapp: { allowFrom: ["+15555550123"] } } }, - changes: ["Moved routing.allowFrom → channels.whatsapp.allowFrom."], - }); + migrateLegacyConfig.mockReturnValue({ + config: { channels: { whatsapp: { allowFrom: ["+15555550123"] } } }, + changes: ["Moved routing.allowFrom → channels.whatsapp.allowFrom."], + }); - await doctorCommand(runtime, { nonInteractive: true, repair: true }); + await doctorCommand(runtime, { nonInteractive: true, repair: true }); - expect(writeConfigFile).toHaveBeenCalledTimes(1); - const written = writeConfigFile.mock.calls[0]?.[0] as Record; - expect((written.channels as Record)?.whatsapp).toEqual({ - allowFrom: ["+15555550123"], - }); - expect(written.routing).toBeUndefined(); - }); + expect(writeConfigFile).toHaveBeenCalledTimes(1); + const written = writeConfigFile.mock.calls[0]?.[0] as Record; + expect((written.channels as Record)?.whatsapp).toEqual({ + allowFrom: ["+15555550123"], + }); + expect(written.routing).toBeUndefined(); + }, + ); it("does not add a new gateway auth token while fixing legacy issues on invalid config", async () => { mockDoctorConfigSnapshot({ @@ -80,25 +86,29 @@ describe("doctor command", () => { expect(auth).toBeUndefined(); }); - it("skips legacy gateway services migration", { timeout: 60_000 }, async () => { - mockDoctorConfigSnapshot(); + it( + "skips legacy gateway services migration", + { timeout: DOCTOR_MIGRATION_TIMEOUT_MS }, + async () => { + mockDoctorConfigSnapshot(); - findLegacyGatewayServices.mockResolvedValueOnce([ - { - platform: "darwin", - label: "com.steipete.openclaw.gateway", - detail: "loaded", - }, - ]); - serviceIsLoaded.mockResolvedValueOnce(false); - serviceInstall.mockClear(); + findLegacyGatewayServices.mockResolvedValueOnce([ + { + platform: "darwin", + label: "com.steipete.openclaw.gateway", + detail: "loaded", + }, + ]); + serviceIsLoaded.mockResolvedValueOnce(false); + serviceInstall.mockClear(); - const { doctorCommand } = await import("./doctor.js"); - await doctorCommand(createDoctorRuntime()); + const { doctorCommand } = await import("./doctor.js"); + await doctorCommand(createDoctorRuntime()); - expect(uninstallLegacyGatewayServices).not.toHaveBeenCalled(); - expect(serviceInstall).not.toHaveBeenCalled(); - }); + expect(uninstallLegacyGatewayServices).not.toHaveBeenCalled(); + expect(serviceInstall).not.toHaveBeenCalled(); + }, + ); it("offers to update first for git checkouts", async () => { delete process.env.OPENCLAW_UPDATE_IN_PROGRESS; diff --git a/src/commands/doctor.migrates-slack-discord-dm-policy-aliases.e2e.test.ts b/src/commands/doctor.migrates-slack-discord-dm-policy-aliases.e2e.test.ts index e72da14d0..89321a1db 100644 --- a/src/commands/doctor.migrates-slack-discord-dm-policy-aliases.e2e.test.ts +++ b/src/commands/doctor.migrates-slack-discord-dm-policy-aliases.e2e.test.ts @@ -1,48 +1,54 @@ import { describe, expect, it, vi } from "vitest"; import { readConfigFileSnapshot, writeConfigFile } from "./doctor.e2e-harness.js"; +const DOCTOR_MIGRATION_TIMEOUT_MS = 20_000; + describe("doctor command", () => { - it("migrates Slack/Discord dm.policy keys to dmPolicy aliases", { timeout: 60_000 }, async () => { - readConfigFileSnapshot.mockResolvedValue({ - path: "/tmp/openclaw.json", - exists: true, - raw: "{}", - parsed: { - channels: { - slack: { dm: { enabled: true, policy: "open", allowFrom: ["*"] } }, - discord: { - dm: { enabled: true, policy: "allowlist", allowFrom: ["123"] }, + it( + "migrates Slack/Discord dm.policy keys to dmPolicy aliases", + { timeout: DOCTOR_MIGRATION_TIMEOUT_MS }, + async () => { + readConfigFileSnapshot.mockResolvedValue({ + path: "/tmp/openclaw.json", + exists: true, + raw: "{}", + parsed: { + channels: { + slack: { dm: { enabled: true, policy: "open", allowFrom: ["*"] } }, + discord: { + dm: { enabled: true, policy: "allowlist", allowFrom: ["123"] }, + }, }, }, - }, - valid: true, - config: { - channels: { - slack: { dm: { enabled: true, policy: "open", allowFrom: ["*"] } }, - discord: { dm: { enabled: true, policy: "allowlist", allowFrom: ["123"] } }, + valid: true, + config: { + channels: { + slack: { dm: { enabled: true, policy: "open", allowFrom: ["*"] } }, + discord: { dm: { enabled: true, policy: "allowlist", allowFrom: ["123"] } }, + }, }, - }, - issues: [], - legacyIssues: [], - }); + issues: [], + legacyIssues: [], + }); - const { doctorCommand } = await import("./doctor.js"); - const runtime = { log: vi.fn(), error: vi.fn(), exit: vi.fn() }; + const { doctorCommand } = await import("./doctor.js"); + const runtime = { log: vi.fn(), error: vi.fn(), exit: vi.fn() }; - await doctorCommand(runtime, { nonInteractive: true, repair: true }); + await doctorCommand(runtime, { nonInteractive: true, repair: true }); - expect(writeConfigFile).toHaveBeenCalledTimes(1); - const written = writeConfigFile.mock.calls[0]?.[0] as Record; - const channels = (written.channels ?? {}) as Record; - const slack = (channels.slack ?? {}) as Record; - const discord = (channels.discord ?? {}) as Record; + expect(writeConfigFile).toHaveBeenCalledTimes(1); + const written = writeConfigFile.mock.calls[0]?.[0] as Record; + const channels = (written.channels ?? {}) as Record; + const slack = (channels.slack ?? {}) as Record; + const discord = (channels.discord ?? {}) as Record; - expect(slack.dmPolicy).toBe("open"); - expect(slack.allowFrom).toEqual(["*"]); - expect(slack.dm).toEqual({ enabled: true }); + expect(slack.dmPolicy).toBe("open"); + expect(slack.allowFrom).toEqual(["*"]); + expect(slack.dm).toEqual({ enabled: true }); - expect(discord.dmPolicy).toBe("allowlist"); - expect(discord.allowFrom).toEqual(["123"]); - expect(discord.dm).toEqual({ enabled: true }); - }); + expect(discord.dmPolicy).toBe("allowlist"); + expect(discord.allowFrom).toEqual(["123"]); + expect(discord.dm).toEqual({ enabled: true }); + }, + ); });