import { afterEach, describe, expect, it, vi } from "vitest"; import { setConsoleSubsystemFilter } from "./console.js"; import { resetLogger, setLoggerOverride } from "./logger.js"; import { loggingState } from "./state.js"; import { createSubsystemLogger } from "./subsystem.js"; function installConsoleMethodSpy(method: "warn" | "error") { const spy = vi.fn(); loggingState.rawConsole = { log: vi.fn(), info: vi.fn(), warn: method === "warn" ? spy : vi.fn(), error: method === "error" ? spy : vi.fn(), }; return spy; } afterEach(() => { setConsoleSubsystemFilter(null); setLoggerOverride(null); loggingState.rawConsole = null; resetLogger(); }); describe("createSubsystemLogger().isEnabled", () => { it("returns true for any/file when only file logging would emit", () => { setLoggerOverride({ level: "debug", consoleLevel: "silent" }); const log = createSubsystemLogger("agent/embedded"); expect(log.isEnabled("debug")).toBe(true); expect(log.isEnabled("debug", "file")).toBe(true); expect(log.isEnabled("debug", "console")).toBe(false); }); it("returns true for any/console when only console logging would emit", () => { setLoggerOverride({ level: "silent", consoleLevel: "debug" }); const log = createSubsystemLogger("agent/embedded"); expect(log.isEnabled("debug")).toBe(true); expect(log.isEnabled("debug", "console")).toBe(true); expect(log.isEnabled("debug", "file")).toBe(false); }); it("returns false when neither console nor file logging would emit", () => { setLoggerOverride({ level: "silent", consoleLevel: "silent" }); const log = createSubsystemLogger("agent/embedded"); expect(log.isEnabled("debug")).toBe(false); expect(log.isEnabled("debug", "console")).toBe(false); expect(log.isEnabled("debug", "file")).toBe(false); }); it("honors console subsystem filters for console target", () => { setLoggerOverride({ level: "silent", consoleLevel: "info" }); setConsoleSubsystemFilter(["gateway"]); const log = createSubsystemLogger("agent/embedded"); expect(log.isEnabled("info", "console")).toBe(false); }); it("does not apply console subsystem filters to file target", () => { setLoggerOverride({ level: "info", consoleLevel: "silent" }); setConsoleSubsystemFilter(["gateway"]); const log = createSubsystemLogger("agent/embedded"); expect(log.isEnabled("info", "file")).toBe(true); expect(log.isEnabled("info")).toBe(true); }); it("suppresses probe warnings for embedded subsystems based on structured run metadata", () => { setLoggerOverride({ level: "silent", consoleLevel: "warn" }); const warn = installConsoleMethodSpy("warn"); const log = createSubsystemLogger("agent/embedded").child("failover"); log.warn("embedded run failover decision", { runId: "probe-test-run", consoleMessage: "embedded run failover decision", }); expect(warn).not.toHaveBeenCalled(); }); it("does not suppress probe errors for embedded subsystems", () => { setLoggerOverride({ level: "silent", consoleLevel: "error" }); const error = installConsoleMethodSpy("error"); const log = createSubsystemLogger("agent/embedded").child("failover"); log.error("embedded run failover decision", { runId: "probe-test-run", consoleMessage: "embedded run failover decision", }); expect(error).toHaveBeenCalledTimes(1); }); it("suppresses probe warnings for model-fallback child subsystems based on structured run metadata", () => { setLoggerOverride({ level: "silent", consoleLevel: "warn" }); const warn = installConsoleMethodSpy("warn"); const log = createSubsystemLogger("model-fallback").child("decision"); log.warn("model fallback decision", { runId: "probe-test-run", consoleMessage: "model fallback decision", }); expect(warn).not.toHaveBeenCalled(); }); it("does not suppress probe errors for model-fallback child subsystems", () => { setLoggerOverride({ level: "silent", consoleLevel: "error" }); const error = installConsoleMethodSpy("error"); const log = createSubsystemLogger("model-fallback").child("decision"); log.error("model fallback decision", { runId: "probe-test-run", consoleMessage: "model fallback decision", }); expect(error).toHaveBeenCalledTimes(1); }); it("still emits non-probe warnings for embedded subsystems", () => { setLoggerOverride({ level: "silent", consoleLevel: "warn" }); const warn = installConsoleMethodSpy("warn"); const log = createSubsystemLogger("agent/embedded").child("auth-profiles"); log.warn("auth profile failure state updated", { runId: "run-123", consoleMessage: "auth profile failure state updated", }); expect(warn).toHaveBeenCalledTimes(1); }); it("still emits non-probe model-fallback child warnings", () => { setLoggerOverride({ level: "silent", consoleLevel: "warn" }); const warn = installConsoleMethodSpy("warn"); const log = createSubsystemLogger("model-fallback").child("decision"); log.warn("model fallback decision", { runId: "run-123", consoleMessage: "model fallback decision", }); expect(warn).toHaveBeenCalledTimes(1); }); });