Files
plainleaf/client/lib/logger.test.ts
T

164 lines
4.4 KiB
TypeScript

import { expect, test } from "vitest";
import { initLogger, Logger } from "./logger.ts";
test("Logger prefix functionality", () => {
// Store original console methods
const originalLog = console.log;
const originalInfo = console.info;
const originalWarn = console.warn;
const originalError = console.error;
const capturedOutput: string[] = [];
// Mock console methods to capture output
console.log = (...args: any[]) => {
capturedOutput.push(args.join(" "));
};
console.info = (...args: any[]) => {
capturedOutput.push(args.join(" "));
};
console.warn = (...args: any[]) => {
capturedOutput.push(args.join(" "));
};
console.error = (...args: any[]) => {
capturedOutput.push(args.join(" "));
};
try {
new Logger("[TEST]");
console.log("Hello", "world");
console.info("Info message");
console.warn("Warning message");
console.error("Error message");
expect(capturedOutput[0]).toEqual("[TEST] Hello world");
expect(capturedOutput[1]).toEqual("[TEST] Info message");
expect(capturedOutput[2]).toEqual("[TEST] Warning message");
expect(capturedOutput[3]).toEqual("[TEST] Error message");
} finally {
// Restore original console methods
console.log = originalLog;
console.info = originalInfo;
console.warn = originalWarn;
console.error = originalError;
}
});
test("Logger without prefix", () => {
const originalLog = console.log;
const capturedOutput: string[] = [];
console.log = (...args: any[]) => {
capturedOutput.push(args.join(" "));
};
try {
new Logger("");
console.log("Hello", "world");
expect(capturedOutput[0]).toEqual("Hello world");
} finally {
console.log = originalLog;
}
});
test("Logger log capture", () => {
const logger = new Logger("[CAPTURE]");
console.log("First message");
console.info("Second message", { key: "value" });
console.warn("Third message", 123);
console.error("Fourth message");
const capturedLogs = logger.logBuffer;
expect(capturedLogs.length).toEqual(4);
expect(capturedLogs[0].level).toEqual("log");
expect(capturedLogs[0].message).toEqual("First message");
expect(capturedLogs[1].level).toEqual("info");
expect(capturedLogs[1].message).toEqual('Second message {"key":"value"}');
expect(capturedLogs[2].level).toEqual("warn");
expect(capturedLogs[2].message).toEqual("Third message 123");
expect(capturedLogs[3].level).toEqual("error");
expect(capturedLogs[3].message).toEqual("Fourth message");
// Check that all entries have timestamps
capturedLogs.forEach((entry) => {
expect(typeof entry.timestamp === "number").toBeTruthy();
expect(entry.timestamp > 0).toBeTruthy();
});
});
test("Logger max capture size", () => {
const logger = new Logger("[SIZE]", 3);
// Add more logs than the max size
console.log("Message 1");
console.log("Message 2");
console.log("Message 3");
console.log("Message 4");
console.log("Message 5");
const capturedLogs = logger.logBuffer;
// Should only keep the last 3 messages
expect(capturedLogs.length).toEqual(3);
expect(capturedLogs[0].message).toEqual("Message 3");
expect(capturedLogs[1].message).toEqual("Message 4");
expect(capturedLogs[2].message).toEqual("Message 5");
});
test("Global logger initialization", () => {
const originalLog = console.log;
const capturedOutput: string[] = [];
console.log = (...args: any[]) => {
capturedOutput.push(args.join(" "));
};
try {
const logger = initLogger("[GLOBAL]");
console.log("Global test");
expect(capturedOutput[0]).toEqual("[GLOBAL] Global test");
expect(logger instanceof Logger).toBeTruthy();
} finally {
console.log = originalLog;
}
});
test("Logger handles complex objects", () => {
const logger = new Logger("[COMPLEX]");
const complexObject = {
name: "test",
nested: { value: 42 },
array: [1, 2, 3],
};
const circularObject: any = { name: "circular" };
circularObject.self = circularObject;
console.log("Complex object:", complexObject);
console.log("Circular object:", circularObject);
const capturedLogs = logger.logBuffer;
expect(capturedLogs.length).toEqual(2);
// First log should handle complex object properly
expect(capturedLogs[0].message).toEqual(
`Complex object: {"name":"test","nested":{"value":42},"array":[1,2,3]}`,
);
// Second log should handle circular reference gracefully
expect(capturedLogs[1].message).toEqual(`Circular object: [object Object]`);
});