test: add unit tests for handler, logger, manager, and config

Cover Handler property accessors, format delegation, emit contract,
and close lifecycle. Cover Logger level methods, isEnabledFor caching,
manager property assignment, handler management, debug invocation,
and makeRecord extra key collision. Cover Manager getLogger hierarchy
setup, placeholder fixup, disable level, and loggerClass validation.
Cover basicConfig option handling, force flag, mutual exclusion of
stream/filename/handlers, and formatter assignment.
This commit is contained in:
Tiara Rodney 2026-03-13 22:49:12 +01:00
parent 0b87f5516a
commit 3b6b116b00
No known key found for this signature in database
GPG key ID: 5CD8EC1D46106723
4 changed files with 494 additions and 0 deletions

View file

@ -0,0 +1,92 @@
import {expect, jest, test} from '@jest/globals';
import { Handler, StreamHandler, StderrHandler } from '../../src/handler';
import { Formatter, DEFAULT_FORMATTER } from '../../src/formatter';
import { LogRecord } from '../../src/log-record';
import { DEBUG, WARNING, ERROR, NOTSET } from '../../src/log-level';
function makeRecord(level: number, msg: string): LogRecord {
return new LogRecord('test', { level, msg });
}
describe('Handler', () => {
describe('constructor', () => {
test('defaults to NOTSET level', () => {
const h = new Handler();
expect(h.level).toBe(NOTSET);
});
test('accepts a level argument', () => {
const h = new Handler(WARNING);
expect(h.level).toBe(WARNING);
});
});
describe('level setter', () => {
test('sets the level without infinite recursion', () => {
const h = new Handler();
h.level = ERROR;
expect(h.level).toBe(ERROR);
});
});
describe('formatter', () => {
test('getter returns null when no formatter set', () => {
const h = new Handler();
expect(h.formatter).toBeNull();
});
test('getter returns assigned formatter', () => {
const h = new Handler();
const fmt = new Formatter();
h.formatter = fmt;
expect(h.formatter).toBe(fmt);
});
});
describe('format', () => {
test('uses DEFAULT_FORMATTER when no formatter assigned', () => {
const h = new Handler();
const record = makeRecord(DEBUG, 'hello');
const result = h.format(record);
expect(typeof result).toBe('string');
});
test('uses assigned formatter', () => {
const h = new Handler();
const fmt = new Formatter({ fmt: '%(message)s' });
h.formatter = fmt;
const record = makeRecord(DEBUG, 'hello');
const result = h.format(record);
expect(typeof result).toBe('string');
});
test('returns a string', () => {
const h = new Handler();
const record = makeRecord(WARNING, 'test message');
expect(typeof h.format(record)).toBe('string');
});
});
describe('emit', () => {
test('throws NotImplementedError on base class', () => {
const h = new Handler();
const record = makeRecord(DEBUG, 'hello');
expect(() => h.emit(record)).toThrow('emit must be implemented');
});
});
describe('close', () => {
test('sets closed to true', () => {
const h = new Handler();
expect(h.closed).toBe(false);
h.close();
expect(h.closed).toBe(true);
});
});
});
describe('StderrHandler', () => {
test('accepts a level', () => {
const h = new StderrHandler(ERROR);
expect(h.level).toBe(ERROR);
});
});