summaryrefslogtreecommitdiff
path: root/tst/log_trace.test.ts
blob: 29234f6306c89bc66075346d7acd928e095c18f2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import { LogLevel, LogTrace, type ILogger } from '../lib/index';

describe('trace/log/trace (LogTrace)', () => {
    beforeEach(() => {
        jest.useFakeTimers();
        jest.setSystemTime(new Date('2020-01-01T00:00:00.000Z'));
    });

    afterEach(() => {
        jest.useRealTimers();
    });

    test('uses defaultLevel when no explicit level', () => {
        const logger: ILogger = { log: jest.fn() };
        const allowed = () => new Set([LogLevel.UNKNOWN, LogLevel.WARN]);
        const trace = new LogTrace(logger, [], LogLevel.WARN, allowed);

        trace.trace('hello');
        expect(logger.log).toHaveBeenCalledTimes(1);

        const [level, ...rest] = (logger.log as jest.Mock).mock.calls[0];
        expect(level).toBe(LogLevel.WARN);
        expect(rest.join(' ')).toContain('hello');
    });

    test('picks highest log level across traces', () => {
        const logger: ILogger = { log: jest.fn() };
        const allowed = () => new Set([LogLevel.UNKNOWN, LogLevel.INFO, LogLevel.WARN, LogLevel.ERROR]);
        const trace = new LogTrace(logger, [], LogLevel.INFO, allowed);

        trace.traceScope(LogLevel.INFO).traceScope(LogLevel.ERROR).trace('boom');
        const [level] = (logger.log as jest.Mock).mock.calls[0];
        expect(level).toBe(LogLevel.ERROR);
    });

    test('filters disallowed levels', () => {
        const logger: ILogger = { log: jest.fn() };
        const allowed = () => new Set([LogLevel.UNKNOWN, LogLevel.INFO]);
        const trace = new LogTrace(logger, [], LogLevel.INFO, allowed);

        trace.traceScope(LogLevel.DEBUG).trace('nope');
        expect(logger.log).not.toHaveBeenCalled();
    });

    test('formats Error objects in trace', () => {
        const logger: ILogger = { log: jest.fn() };
        const allowed = () => new Set([LogLevel.UNKNOWN, LogLevel.ERROR]);
        const trace = new LogTrace(logger, [], LogLevel.INFO, allowed);

        trace.traceScope(LogLevel.ERROR).trace(new Error('boom'));
        const [_level, msg] = (logger.log as jest.Mock).mock.calls[0];
        expect(msg).toContain('TracedException.Name = Error');
        expect(msg).toContain('TracedException.Message = boom');
    });
});