Files
plainleaf/lib/logger.test.ts
T
Zef HemelandGitHub dc2987a3f9 Sync engine rearchitecture (#1516)
* Don't require auth for .ping
* Finally introducing loggers
* Remove file list caching from disk_space_primitives
I don't think this is required anymore with the sync model
* Simplification of space primitives and more tests
* More reliable online status
* Add .zed settings
* Remove selfUpdate argument from `writeFile` no longer used
- Add `sync` config schema and document sync options
- Move sync config handling to client boot logic
- Move BootConfig type to ui_types.ts
- Remove sync env vars from server
- Update documentation for sync and architecture
* Improve sync logic and proxy routing for full sync state
* Add BoxProxy for late-bound client and improve Lua boot
- Add isMobile syscall for editor
* Add concurrency to sync process and log indexing duration
* Better service worker lifecycle management
2025-09-12 14:43:57 +02:00

168 lines
4.7 KiB
TypeScript

import { assert, assertEquals } from "@std/assert";
import { initLogger, Logger } from "./logger.ts";
Deno.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");
assertEquals(capturedOutput[0], "[TEST] Hello world");
assertEquals(capturedOutput[1], "[TEST] Info message");
assertEquals(capturedOutput[2], "[TEST] Warning message");
assertEquals(capturedOutput[3], "[TEST] Error message");
} finally {
// Restore original console methods
console.log = originalLog;
console.info = originalInfo;
console.warn = originalWarn;
console.error = originalError;
}
});
Deno.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");
assertEquals(capturedOutput[0], "Hello world");
} finally {
console.log = originalLog;
}
});
Deno.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.getCapturedLogs();
assertEquals(capturedLogs.length, 4);
assertEquals(capturedLogs[0].level, "log");
assertEquals(capturedLogs[0].message, "First message");
assertEquals(capturedLogs[0].args, ["First message"]);
assertEquals(capturedLogs[1].level, "info");
assertEquals(capturedLogs[1].message, 'Second message {"key":"value"}');
assertEquals(capturedLogs[1].args, ["Second message", { key: "value" }]);
assertEquals(capturedLogs[2].level, "warn");
assertEquals(capturedLogs[2].message, "Third message 123");
assertEquals(capturedLogs[2].args, ["Third message", 123]);
assertEquals(capturedLogs[3].level, "error");
assertEquals(capturedLogs[3].message, "Fourth message");
assertEquals(capturedLogs[3].args, ["Fourth message"]);
// Check that all entries have timestamps
capturedLogs.forEach((entry) => {
assert(typeof entry.timestamp === "number");
assert(entry.timestamp > 0);
});
});
Deno.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.getCapturedLogs();
// Should only keep the last 3 messages
assertEquals(capturedLogs.length, 3);
assertEquals(capturedLogs[0].message, "Message 3");
assertEquals(capturedLogs[1].message, "Message 4");
assertEquals(capturedLogs[2].message, "Message 5");
});
Deno.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");
assertEquals(capturedOutput[0], "[GLOBAL] Global test");
assert(logger instanceof Logger);
} finally {
console.log = originalLog;
}
});
Deno.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.getCapturedLogs();
assertEquals(capturedLogs.length, 2);
// First log should handle complex object properly
assertEquals(capturedLogs[0].args[0], "Complex object:");
assertEquals(capturedLogs[0].args[1], complexObject);
// Second log should handle circular reference gracefully
assertEquals(capturedLogs[1].args[0], "Circular object:");
assertEquals(typeof capturedLogs[1].args[1], "string"); // Should be converted to string
});