test: add comprehensive unit tests for all appenders and logger
Tests added: - log-service.test.ts: hierarchical logger creation and threshold propagation - logger.test.ts: threshold inheritance, message propagation, falsy threshold bug coverage (LogLevel.ALL = 0), deferred messages, Error handling - log-message.test.ts: parseLogLevel parsing, flattenMessage object/string modes - console-log-appender.test.ts: threshold, formatter, all-level routing - buffer-log-appender.test.ts: buffer append, threshold filtering, clearBuffer - api-log-appender.test.ts: configuration defaults, threshold, auth token Also fixes src/index.ts to export BufferLogAppender which was previously missing from the barrel export.
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
import { describe, test, expect } from "bun:test";
|
||||
import { parseLogLevel, LogLevel, flattenMessage, LogMessage } from "../src";
|
||||
|
||||
describe("parseLogLevel", () => {
|
||||
test("parses known level strings case-sensitively", () => {
|
||||
expect(parseLogLevel("ALL")).toBe(LogLevel.ALL);
|
||||
expect(parseLogLevel("TRACE")).toBe(LogLevel.TRACE);
|
||||
expect(parseLogLevel("DEBUG")).toBe(LogLevel.DEBUG);
|
||||
expect(parseLogLevel("INFO")).toBe(LogLevel.INFO);
|
||||
expect(parseLogLevel("WARN")).toBe(LogLevel.WARN);
|
||||
expect(parseLogLevel("ERROR")).toBe(LogLevel.ERROR);
|
||||
expect(parseLogLevel("FATAL")).toBe(LogLevel.FATAL);
|
||||
});
|
||||
|
||||
test("returns default level for unknown strings", () => {
|
||||
expect(parseLogLevel("BOGUS")).toBe(LogLevel.INFO);
|
||||
expect(parseLogLevel("")).toBe(LogLevel.INFO);
|
||||
});
|
||||
|
||||
test("accepts custom default level", () => {
|
||||
expect(parseLogLevel("BOGUS", LogLevel.WARN)).toBe(LogLevel.WARN);
|
||||
});
|
||||
});
|
||||
|
||||
describe("flattenMessage", () => {
|
||||
test("string message includes all fields", () => {
|
||||
const msg: LogMessage = {
|
||||
scope: "my-scope",
|
||||
level: LogLevel.WARN,
|
||||
msg: "a warning",
|
||||
ts: new Date("2024-01-01T00:00:00Z"),
|
||||
stacktrace: "",
|
||||
};
|
||||
|
||||
const flat = flattenMessage(msg);
|
||||
|
||||
expect(flat.scope).toBe("my-scope");
|
||||
expect(flat.level).toBe("WARN");
|
||||
expect(flat.msg).toBe("a warning");
|
||||
});
|
||||
|
||||
test("object message promotes fields, drops reserved keys", () => {
|
||||
const msg: LogMessage = {
|
||||
scope: "my-scope",
|
||||
level: LogLevel.INFO,
|
||||
msg: { foo: "bar", baz: 42, scope: "should-be-dropped" },
|
||||
ts: new Date("2024-01-01T00:00:00Z"),
|
||||
stacktrace: "",
|
||||
};
|
||||
|
||||
const flat = flattenMessage(msg);
|
||||
|
||||
expect(flat.foo).toBe("bar");
|
||||
expect(flat.baz).toBe(42);
|
||||
// Reserved key from the object message should be dropped
|
||||
expect(flat.scope).toBe("my-scope");
|
||||
expect(flat.level).toBe("INFO");
|
||||
});
|
||||
|
||||
test("level is serialized as string name", () => {
|
||||
const msg: LogMessage = {
|
||||
scope: "test",
|
||||
level: LogLevel.ERROR,
|
||||
msg: "error msg",
|
||||
ts: new Date(),
|
||||
stacktrace: "",
|
||||
};
|
||||
|
||||
const flat = flattenMessage(msg);
|
||||
expect(flat.level).toBe("ERROR");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user