import { beforeEach, describe, expect, it, vi } from "vitest"; import * as clientModule from "./client.js"; import { classifySignalCliLogLine } from "./daemon.js"; import { probeSignal } from "./probe.js"; describe("probeSignal", () => { beforeEach(() => { vi.restoreAllMocks(); }); it("extracts version from {version} result", async () => { vi.spyOn(clientModule, "signalCheck").mockResolvedValueOnce({ ok: true, status: 200, error: null, }); vi.spyOn(clientModule, "signalRpcRequest").mockResolvedValueOnce({ version: "0.13.22" }); const res = await probeSignal("http://127.0.0.1:8080", 1000); expect(res.ok).toBe(true); expect(res.version).toBe("0.13.22"); expect(res.status).toBe(200); }); it("returns ok=false when /check fails", async () => { vi.spyOn(clientModule, "signalCheck").mockResolvedValueOnce({ ok: false, status: 503, error: "HTTP 503", }); const res = await probeSignal("http://127.0.0.1:8080", 1000); expect(res.ok).toBe(false); expect(res.status).toBe(503); expect(res.version).toBe(null); }); }); describe("classifySignalCliLogLine", () => { it("treats INFO/DEBUG as log (even if emitted on stderr)", () => { expect(classifySignalCliLogLine("INFO DaemonCommand - Started")).toBe("log"); expect(classifySignalCliLogLine("DEBUG Something")).toBe("log"); }); it("treats WARN/ERROR as error", () => { expect(classifySignalCliLogLine("WARN Something")).toBe("error"); expect(classifySignalCliLogLine("WARNING Something")).toBe("error"); expect(classifySignalCliLogLine("ERROR Something")).toBe("error"); }); it("treats failures without explicit severity as error", () => { expect(classifySignalCliLogLine("Failed to initialize HTTP Server - oops")).toBe("error"); expect(classifySignalCliLogLine('Exception in thread "main"')).toBe("error"); }); it("returns null for empty lines", () => { expect(classifySignalCliLogLine("")).toBe(null); expect(classifySignalCliLogLine(" ")).toBe(null); }); });