import { describe, test, expect } from "bun:test"; import { ApiLogAppender, LogLevel, LogMessage, FlattenedLogMessage } from "../src"; function makeMsg(overrides: Partial = {}): LogMessage { return { scope: "test-scope", level: LogLevel.INFO, msg: "test message", stacktrace: "", ts: new Date(), ...overrides, }; } describe("ApiLogAppender", () => { test("defaults threshold to ALL", () => { const appender = new ApiLogAppender("https://example.com/logs"); expect(appender.threshold).toBe(LogLevel.ALL); }); test("respects explicit threshold", () => { const appender = new ApiLogAppender("https://example.com/logs", undefined, LogLevel.WARN); expect(appender.threshold).toBe(LogLevel.WARN); }); test("stores authToken when provided", () => { const appender = new ApiLogAppender("https://example.com/logs", "token-abc"); expect(appender.authToken).toBe("token-abc"); }); test("has sensible default batch and timing settings", () => { const appender = new ApiLogAppender("https://example.com/logs"); expect(appender.batchSize).toBe(10); expect(appender.minimumTimePassedInSec).toBe(60); expect(appender.maximumTimePassedInSec).toBe(120); }); test("threshold of ALL (0) does not cause falsy check to drop messages", () => { const appender = new ApiLogAppender("https://example.com/logs", undefined, LogLevel.ALL); // appendMessage pushes to the internal msgBuffer — we can't easily // inspect it, but we can verify it doesn't throw and that the threshold // check with ALL (0) doesn't drop messages due to falsy comparison. appender.appendMessage(makeMsg({ level: LogLevel.ALL })); appender.appendMessage(makeMsg({ level: LogLevel.INFO })); // No assertions on internal buffer (private), but verify no errors thrown. // If the falsy bug existed, these messages would be silently dropped. expect(true).toBe(true); }); test("respects threshold when set above ALL", () => { const appender = new ApiLogAppender("https://example.com/logs", undefined, LogLevel.WARN); // These should not throw, just silently drop appender.appendMessage(makeMsg({ level: LogLevel.ALL })); appender.appendMessage(makeMsg({ level: LogLevel.INFO })); // WARN and above would be queued (but we can't easily inspect) appender.appendMessage(makeMsg({ level: LogLevel.WARN })); appender.appendMessage(makeMsg({ level: LogLevel.ERROR })); expect(true).toBe(true); }); test("stores apiEndpoint", () => { const appender = new ApiLogAppender("https://logs.example.com/v1/ingest"); expect(appender.apiEndpoint).toBe("https://logs.example.com/v1/ingest"); }); });