Files
clawdbot/src/commands/health.test.ts
2026-01-17 01:19:43 +00:00

177 lines
5.1 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from "vitest";
import type { HealthSummary } from "./health.js";
import { formatHealthChannelLines, healthCommand } from "./health.js";
const runtime = {
log: vi.fn(),
error: vi.fn(),
exit: vi.fn(),
};
const callGatewayMock = vi.fn();
vi.mock("../gateway/call.js", () => ({
callGateway: (...args: unknown[]) => callGatewayMock(...args),
}));
describe("healthCommand", () => {
beforeEach(() => {
vi.clearAllMocks();
});
it("outputs JSON from gateway", async () => {
const agentSessions = {
path: "/tmp/sessions.json",
count: 1,
recent: [{ key: "+1555", updatedAt: Date.now(), age: 0 }],
};
const snapshot: HealthSummary = {
ok: true,
ts: Date.now(),
durationMs: 5,
channels: {
whatsapp: { accountId: "default", linked: true, authAgeMs: 5000 },
telegram: {
accountId: "default",
configured: true,
probe: { ok: true, elapsedMs: 1 },
},
discord: { accountId: "default", configured: false },
},
channelOrder: ["whatsapp", "telegram", "discord"],
channelLabels: {
whatsapp: "WhatsApp",
telegram: "Telegram",
discord: "Discord",
},
heartbeatSeconds: 60,
defaultAgentId: "main",
agents: [
{
agentId: "main",
isDefault: true,
heartbeat: {
enabled: true,
every: "1m",
everyMs: 60_000,
prompt: "hi",
target: "last",
ackMaxChars: 160,
},
sessions: agentSessions,
},
],
sessions: agentSessions,
};
callGatewayMock.mockResolvedValueOnce(snapshot);
await healthCommand({ json: true, timeoutMs: 5000 }, runtime as never);
expect(runtime.exit).not.toHaveBeenCalled();
const logged = runtime.log.mock.calls[0]?.[0] as string;
const parsed = JSON.parse(logged) as HealthSummary;
expect(parsed.channels.whatsapp?.linked).toBe(true);
expect(parsed.channels.telegram?.configured).toBe(true);
expect(parsed.sessions.count).toBe(1);
});
it("prints text summary when not json", async () => {
callGatewayMock.mockResolvedValueOnce({
ok: true,
ts: Date.now(),
durationMs: 5,
channels: {
whatsapp: { accountId: "default", linked: false, authAgeMs: null },
telegram: { accountId: "default", configured: false },
discord: { accountId: "default", configured: false },
},
channelOrder: ["whatsapp", "telegram", "discord"],
channelLabels: {
whatsapp: "WhatsApp",
telegram: "Telegram",
discord: "Discord",
},
heartbeatSeconds: 60,
defaultAgentId: "main",
agents: [
{
agentId: "main",
isDefault: true,
heartbeat: {
enabled: true,
every: "1m",
everyMs: 60_000,
prompt: "hi",
target: "last",
ackMaxChars: 160,
},
sessions: { path: "/tmp/sessions.json", count: 0, recent: [] },
},
],
sessions: { path: "/tmp/sessions.json", count: 0, recent: [] },
} satisfies HealthSummary);
await healthCommand({ json: false }, runtime as never);
expect(runtime.exit).not.toHaveBeenCalled();
expect(runtime.log).toHaveBeenCalled();
});
it("formats per-account probe timings", () => {
const summary: HealthSummary = {
ok: true,
ts: Date.now(),
durationMs: 5,
channels: {
telegram: {
accountId: "main",
configured: true,
probe: { ok: true, elapsedMs: 196, bot: { username: "pinguini_ugi_bot" } },
accounts: {
main: {
accountId: "main",
configured: true,
probe: { ok: true, elapsedMs: 196, bot: { username: "pinguini_ugi_bot" } },
},
flurry: {
accountId: "flurry",
configured: true,
probe: { ok: true, elapsedMs: 190, bot: { username: "flurry_ugi_bot" } },
},
poe: {
accountId: "poe",
configured: true,
probe: { ok: true, elapsedMs: 188, bot: { username: "poe_ugi_bot" } },
},
},
},
},
channelOrder: ["telegram"],
channelLabels: { telegram: "Telegram" },
heartbeatSeconds: 60,
defaultAgentId: "main",
agents: [
{
agentId: "main",
isDefault: true,
heartbeat: {
enabled: true,
every: "1m",
everyMs: 60_000,
prompt: "hi",
target: "last",
ackMaxChars: 160,
},
sessions: { path: "/tmp/sessions.json", count: 0, recent: [] },
},
],
sessions: { path: "/tmp/sessions.json", count: 0, recent: [] },
};
const lines = formatHealthChannelLines(summary, { accountMode: "all" });
expect(lines).toContain(
"Telegram: ok (@pinguini_ugi_bot:main:196ms, @flurry_ugi_bot:flurry:190ms, @poe_ugi_bot:poe:188ms)",
);
});
});