This commit is contained in:
IanKulin
2025-09-25 21:26:31 +08:00
parent b95d3ea50a
commit 01cc58aa7a
14 changed files with 924 additions and 824 deletions

View File

@@ -1,151 +1,159 @@
import { assertEquals, assertThrows } from "@std/assert";
import Logger from '../lib/logger.ts';
import Logger from "../lib/logger.ts";
import {
setupMocks,
getCapturedLogs,
clearCapturedLogs,
} from './helpers/logger-test-helpers.js';
getCapturedLogs,
setupMocks,
} from "./helpers/logger-test-helpers.js";
// Setup and teardown for all tests
setupMocks();
Deno.test("Logger Level Management - Level Setting and Getting - should change log level with level() method", () => {
const logger = new Logger();
logger.level('debug');
assertEquals(logger.options.level, 'debug');
logger.level("debug");
assertEquals(logger.options.level, "debug");
});
Deno.test("Logger Level Management - Level Setting and Getting - should return current level when called without arguments", () => {
const logger = new Logger({ level: 'debug' });
assertEquals(logger.level(), 'debug');
const logger = new Logger({ level: "debug" });
assertEquals(logger.level(), "debug");
});
Deno.test("Logger Level Management - Level Setting and Getting - should return new level when setting level", () => {
const logger = new Logger();
const result = logger.level('error');
assertEquals(result, 'error');
assertEquals(logger.options.level, 'error');
const result = logger.level("error");
assertEquals(result, "error");
assertEquals(logger.options.level, "error");
});
Deno.test("Logger Level Management - Level Setting and Getting - should throw error for invalid log level", () => {
const logger = new Logger();
assertThrows(() => {
logger.level('invalid');
}, Error, "Invalid log level: invalid");
assertThrows(
() => {
logger.level("invalid");
},
Error,
"Invalid log level: invalid",
);
});
Deno.test("Logger Level Management - Level Setting and Getting - should allow method chaining after setting level", () => {
const logger = new Logger();
// This should not throw and should return a level
const result = logger.level('warn');
assertEquals(result, 'warn');
assertEquals(typeof result, 'string');
const result = logger.level("warn");
assertEquals(result, "warn");
assertEquals(typeof result, "string");
});
Deno.test("Logger Level Management - setLevel Method - should have setLevel method as alias", () => {
const logger = new Logger();
assertEquals(typeof logger.setLevel, 'function');
assertEquals(typeof logger.setLevel, "function");
});
Deno.test("Logger Level Management - setLevel Method - should set level correctly with setLevel method", () => {
const logger = new Logger();
const result = logger.setLevel('debug');
assertEquals(result, 'debug');
assertEquals(logger.options.level, 'debug');
const result = logger.setLevel("debug");
assertEquals(result, "debug");
assertEquals(logger.options.level, "debug");
});
Deno.test("Logger Level Management - setLevel Method - should return current level with setLevel when no args", () => {
const logger = new Logger({ level: 'warn' });
const logger = new Logger({ level: "warn" });
const result = logger.setLevel();
assertEquals(result, 'warn');
assertEquals(result, "warn");
});
Deno.test("Logger Level Management - setLevel Method - should throw error for invalid level in setLevel", () => {
const logger = new Logger();
assertThrows(() => {
logger.setLevel('invalid');
}, Error, "Invalid log level: invalid");
assertThrows(
() => {
logger.setLevel("invalid");
},
Error,
"Invalid log level: invalid",
);
});
Deno.test("Logger Level Management - setLevel Method - should maintain consistency between level() and setLevel()", () => {
const logger = new Logger();
logger.level('error');
assertEquals(logger.setLevel(), 'error');
logger.level("error");
assertEquals(logger.setLevel(), "error");
logger.setLevel('debug');
assertEquals(logger.level(), 'debug');
logger.setLevel("debug");
assertEquals(logger.level(), "debug");
});
Deno.test("Logger Level Management - setLevel Method - should support fluent interface pattern", () => {
const logger = new Logger();
// This demonstrates the fluent interface working
const currentLevel = logger.level('warn');
assertEquals(currentLevel, 'warn');
const currentLevel = logger.level("warn");
assertEquals(currentLevel, "warn");
// Both methods should return the current level for chaining
assertEquals(logger.level('info'), 'info');
assertEquals(logger.setLevel('debug'), 'debug');
assertEquals(logger.level("info"), "info");
assertEquals(logger.setLevel("debug"), "debug");
});
Deno.test("Logger Level Management - Log Level Filtering - should filter debug messages when level is info", () => {
clearCapturedLogs();
const logger = new Logger({ level: 'info' });
logger.debug('debug message');
const logger = new Logger({ level: "info" });
logger.debug("debug message");
assertEquals(getCapturedLogs().length, 0);
});
Deno.test("Logger Level Management - Log Level Filtering - should show info messages when level is info", () => {
clearCapturedLogs();
const logger = new Logger({ level: 'info' });
logger.info('info message');
const logger = new Logger({ level: "info" });
logger.info("info message");
assertEquals(getCapturedLogs().length, 1);
});
Deno.test("Logger Level Management - Log Level Filtering - should show error messages at any level", () => {
clearCapturedLogs();
const logger = new Logger({ level: 'error' });
logger.error('error message');
const logger = new Logger({ level: "error" });
logger.error("error message");
assertEquals(getCapturedLogs().length, 1);
});
Deno.test("Logger Level Management - Log Level Filtering - should filter warn and info when level is error", () => {
clearCapturedLogs();
const logger = new Logger({ level: 'error' });
logger.warn('warn message');
logger.info('info message');
const logger = new Logger({ level: "error" });
logger.warn("warn message");
logger.info("info message");
assertEquals(getCapturedLogs().length, 0);
});
Deno.test("Logger Level Management - Log Level Filtering - should show all messages when level is debug", () => {
clearCapturedLogs();
const logger = new Logger({ level: 'debug' });
logger.error('error message');
logger.warn('warn message');
logger.info('info message');
logger.debug('debug message');
const logger = new Logger({ level: "debug" });
logger.error("error message");
logger.warn("warn message");
logger.info("info message");
logger.debug("debug message");
assertEquals(getCapturedLogs().length, 4);
});
Deno.test("Logger Level Management - Log Level Filtering - should show warn and above when level is warn", () => {
clearCapturedLogs();
const logger = new Logger({ level: 'warn' });
logger.error('error message');
logger.warn('warn message');
logger.info('info message');
logger.debug('debug message');
const logger = new Logger({ level: "warn" });
logger.error("error message");
logger.warn("warn message");
logger.info("info message");
logger.debug("debug message");
assertEquals(getCapturedLogs().length, 2);
});
Deno.test("Logger Level Management - Silent Level - should suppress all output when level is silent", () => {
clearCapturedLogs();
const logger = new Logger({ level: 'silent' });
const logger = new Logger({ level: "silent" });
logger.error('error message');
logger.warn('warn message');
logger.info('info message');
logger.debug('debug message');
logger.error("error message");
logger.warn("warn message");
logger.info("info message");
logger.debug("debug message");
// No messages should be logged
assertEquals(getCapturedLogs().length, 0);
@@ -153,21 +161,21 @@ Deno.test("Logger Level Management - Silent Level - should suppress all output w
Deno.test("Logger Level Management - Silent Level - should allow setting level to silent", () => {
const logger = new Logger();
const result = logger.level('silent');
assertEquals(result, 'silent');
assertEquals(logger.options.level, 'silent');
const result = logger.level("silent");
assertEquals(result, "silent");
assertEquals(logger.options.level, "silent");
});
Deno.test("Logger Level Management - Silent Level - should work with setLevel for silent level", () => {
const logger = new Logger();
const result = logger.setLevel('silent');
assertEquals(result, 'silent');
assertEquals(logger.options.level, 'silent');
const result = logger.setLevel("silent");
assertEquals(result, "silent");
assertEquals(logger.options.level, "silent");
});
Deno.test("Logger Level Management - Silent Level - should remain silent after multiple log attempts", () => {
clearCapturedLogs();
const logger = new Logger({ level: 'silent' });
const logger = new Logger({ level: "silent" });
// Try logging multiple times
for (let i = 0; i < 5; i++) {
@@ -183,23 +191,23 @@ Deno.test("Logger Level Management - Silent Level - should remain silent after m
Deno.test("Logger Level Management - Dynamic Level Changes - should respect level changes during runtime", () => {
clearCapturedLogs();
const logger = new Logger({ level: 'error' });
const logger = new Logger({ level: "error" });
// Should not log at info level
logger.info('info message 1');
logger.info("info message 1");
assertEquals(getCapturedLogs().length, 0);
// Change to info level
logger.level('info');
logger.level("info");
// Should now log info messages
logger.info('info message 2');
logger.info("info message 2");
assertEquals(getCapturedLogs().length, 1);
// Change to silent
logger.level('silent');
logger.level("silent");
// Should not log anything
logger.error('error message');
logger.error("error message");
assertEquals(getCapturedLogs().length, 1); // Still just the previous info message
});