typhon/tests/LoggerAndTemplate.test.ts

54 lines
1.9 KiB
TypeScript
Raw Normal View History

import { Logger } from "../src/observability/Logger";
import { renderControlUi } from "../src/ui/template";
describe("Logger", () => {
afterEach(() => {
jest.restoreAllMocks();
});
it("suppresses lower-priority log lines", () => {
const logSpy = jest.spyOn(console, "log").mockImplementation(() => undefined);
const logger = new Logger("info", "gate-test");
logger.debug("not emitted", { key: "value" });
expect(logSpy).not.toHaveBeenCalled();
});
it("routes warn and error levels to the correct console methods", () => {
const warnSpy = jest.spyOn(console, "warn").mockImplementation(() => undefined);
const errorSpy = jest.spyOn(console, "error").mockImplementation(() => undefined);
const logSpy = jest.spyOn(console, "log").mockImplementation(() => undefined);
const logger = new Logger("debug", "gate-test");
logger.info("info-message", { context: 1 });
logger.warn("warn-message", { context: 2 });
logger.error("error-message", { context: 3 });
expect(logSpy).toHaveBeenCalledTimes(1);
expect(warnSpy).toHaveBeenCalledTimes(1);
expect(errorSpy).toHaveBeenCalledTimes(1);
const warnPayload = JSON.parse(String(warnSpy.mock.calls[0]?.[0] ?? "{}")) as {
level?: string;
component?: string;
context?: number;
};
expect(warnPayload.level).toBe("warn");
expect(warnPayload.component).toBe("gate-test");
expect(warnPayload.context).toBe(2);
});
});
describe("renderControlUi", () => {
it("escapes unsafe MAC input and renders fallback when default MAC is missing", () => {
const escaped = renderControlUi(`AA:BB:<script>alert("x")</script>'`);
expect(escaped).toContain("&lt;script&gt;alert(&quot;x&quot;)&lt;/script&gt;&#39;");
expect(escaped).toContain("AA:BB:");
const fallback = renderControlUi(null);
expect(fallback).toContain("not set");
});
});