import { afterEach, describe, expect, it, vi } from "vitest" ;
import { setConsoleSubsystemFilter, shouldLogSubsystemToConsole } 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("uses threshold ordering for non-equal console levels" , () => {
setLoggerOverride({ level: "silent" , consoleLevel: "fatal" });
const fatalOnly = createSubsystemLogger("agent/embedded" );
expect(fatalOnly.isEnabled("error" , "console" )).toBe(false );
expect(fatalOnly.isEnabled("fatal" , "console" )).toBe(true );
setLoggerOverride({ level: "silent" , consoleLevel: "trace" });
const traceLogger = createSubsystemLogger("agent/embedded" );
expect(traceLogger.isEnabled("debug" , "console" )).toBe(true );
});
it("never treats silent as an emittable console level" , () => {
setLoggerOverride({ level: "silent" , consoleLevel: "info" });
const log = createSubsystemLogger("agent/embedded" );
expect(log.isEnabled("silent" , "console" )).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("treats missing subsystem labels as non-matches when filters are active" , () => {
setConsoleSubsystemFilter(["gateway" ]);
expect(() => shouldLogSubsystemToConsole(undefined as unknown as string)).not.toThrow();
expect(shouldLogSubsystemToConsole(undefined as unknown as string)).toBe(false );
});
it("does not throw when a malformed subsystem logger checks console enablement" , () => {
setLoggerOverride({ level: "silent" , consoleLevel: "info" });
setConsoleSubsystemFilter(["gateway" ]);
const log = createSubsystemLogger(undefined as unknown as string);
expect(() => log.isEnabled("info" , "console" )).not.toThrow();
expect(log.isEnabled("info" , "console" )).toBe(false );
});
it("falls back to an unknown subsystem label when a malformed logger emits" , () => {
setLoggerOverride({ level: "silent" , consoleLevel: "warn" });
const warn = installConsoleMethodSpy("warn" );
const log = createSubsystemLogger(undefined as unknown as string);
expect(() => log.warn("missing subsystem label" )).not.toThrow();
expect(warn).toHaveBeenCalledTimes(1 );
expect(String(warn.mock.calls[0 ]?.[0 ] ?? "" )).toContain("[unknown]" );
});
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 );
});
});
Messung V0.5 in Prozent C=100 H=97 G=98
¤ Dauer der Verarbeitung: 0.9 Sekunden
(vorverarbeitet am 2026-06-10)
¤
*© Formatika GbR, Deutschland