Skip to content

Commit db07dfb

Browse files
committed
(#371) ConsoleLogProvider test
1 parent 76e9efd commit db07dfb

File tree

2 files changed

+191
-77
lines changed

2 files changed

+191
-77
lines changed

Diff for: lib/provider/log/console-log-provider.class.spec.ts

+106
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
import {
2+
ConsoleLogLevel,
3+
ConsoleLogProvider,
4+
} from "./console-log-provider.class";
5+
6+
const traceMock = jest.fn();
7+
const debugMock = jest.fn();
8+
const infoMock = jest.fn();
9+
const warnMock = jest.fn();
10+
const errorMock = jest.fn();
11+
12+
beforeAll(() => {
13+
global.console.trace = traceMock;
14+
global.console.debug = debugMock;
15+
global.console.info = infoMock;
16+
global.console.warn = warnMock;
17+
global.console.error = errorMock;
18+
});
19+
20+
beforeEach(() => {
21+
jest.resetAllMocks();
22+
});
23+
24+
describe("ConsoleLogProvider", () => {
25+
it.each([
26+
[
27+
ConsoleLogLevel.TRACE,
28+
[traceMock, debugMock, infoMock, warnMock, errorMock],
29+
[],
30+
],
31+
[
32+
ConsoleLogLevel.DEBUG,
33+
[debugMock, infoMock, warnMock, errorMock],
34+
[traceMock],
35+
],
36+
[
37+
ConsoleLogLevel.INFO,
38+
[infoMock, warnMock, errorMock],
39+
[traceMock, debugMock],
40+
],
41+
[
42+
ConsoleLogLevel.WARN,
43+
[warnMock, errorMock],
44+
[traceMock, debugMock, infoMock],
45+
],
46+
[
47+
ConsoleLogLevel.ERROR,
48+
[errorMock],
49+
[traceMock, debugMock, infoMock, warnMock],
50+
],
51+
])(
52+
`should respect configured log level`,
53+
(
54+
level: ConsoleLogLevel,
55+
validMocks: jest.Mock[],
56+
invalidMocks: jest.Mock[]
57+
) => {
58+
// GIVEN
59+
const SUT = new ConsoleLogProvider({ logLevel: level });
60+
61+
// WHEN
62+
SUT.trace("test");
63+
SUT.debug("test");
64+
SUT.info("test");
65+
SUT.warn("test");
66+
SUT.error(new Error("test"));
67+
68+
// THEN
69+
for (const mock of validMocks) {
70+
expect(mock).toBeCalledTimes(1);
71+
}
72+
for (const mock of invalidMocks) {
73+
expect(mock).not.toBeCalled();
74+
}
75+
}
76+
);
77+
78+
it.each([
79+
[ConsoleLogLevel.TRACE, traceMock],
80+
[ConsoleLogLevel.DEBUG, debugMock],
81+
[ConsoleLogLevel.INFO, infoMock],
82+
[ConsoleLogLevel.WARN, warnMock],
83+
[ConsoleLogLevel.ERROR, errorMock],
84+
])(
85+
`should respect configured log level`,
86+
(level: ConsoleLogLevel, mock: jest.Mock) => {
87+
// GIVEN
88+
const SUT = new ConsoleLogProvider({ logLevel: level });
89+
90+
// WHEN
91+
SUT.trace("test", { data: "test" });
92+
SUT.debug("test", { data: "test" });
93+
SUT.info("test", { data: "test" });
94+
SUT.warn("test", { data: "test" });
95+
SUT.error(new Error("test"), { data: "test" });
96+
97+
// THEN
98+
expect(mock).toBeCalledTimes(1);
99+
if (level != ConsoleLogLevel.ERROR) {
100+
expect(mock).toBeCalledWith(expect.any(String), expect.any(Object));
101+
} else {
102+
expect(mock).toBeCalledWith(expect.any(Error), expect.any(Object));
103+
}
104+
}
105+
);
106+
});

Diff for: lib/provider/log/console-log-provider.class.ts

+85-77
Original file line numberDiff line numberDiff line change
@@ -1,95 +1,103 @@
1-
import {LogProviderInterface} from "../log-provider.interface";
1+
import { LogProviderInterface } from "../log-provider.interface";
22

33
export enum ConsoleLogLevel {
4-
TRACE,
5-
DEBUG,
6-
INFO,
7-
WARN,
8-
ERROR,
4+
TRACE,
5+
DEBUG,
6+
INFO,
7+
WARN,
8+
ERROR,
99
}
1010

1111
export interface ConsoleLogProviderConfig {
12-
logLevel: ConsoleLogLevel,
13-
withTimeStamp: boolean,
12+
logLevel?: ConsoleLogLevel;
13+
withTimeStamp?: boolean;
1414
}
1515

1616
const defaultConfig: ConsoleLogProviderConfig = {
17-
logLevel: ConsoleLogLevel.INFO,
18-
withTimeStamp: true
19-
}
17+
logLevel: ConsoleLogLevel.INFO,
18+
withTimeStamp: true,
19+
};
2020

2121
export class ConsoleLogProvider implements LogProviderInterface {
22-
constructor(private config: ConsoleLogProviderConfig = defaultConfig) {
23-
this.trace = this.trace.bind(this);
24-
this.debug = this.debug.bind(this);
25-
this.info = this.info.bind(this);
26-
this.warn = this.warn.bind(this);
27-
this.error = this.error.bind(this);
28-
}
22+
private readonly logLevel: ConsoleLogLevel;
23+
private readonly withTimeStamp: boolean;
2924

30-
private log(logLevel: ConsoleLogLevel, message: string | Error, data?: {}) {
31-
if (logLevel >= this.config.logLevel) {
32-
const timeStampPrefix = `${new Date().toISOString()} - `;
33-
const extendedMessage = `${(this.config.withTimeStamp == null || this.config.withTimeStamp) ? timeStampPrefix : ''}${ConsoleLogLevel[logLevel]} - ${(message instanceof Error) ? message.message : message}`;
34-
switch (logLevel) {
35-
case ConsoleLogLevel.TRACE:
36-
if (data) {
37-
console.trace(extendedMessage, data);
38-
} else {
39-
console.trace(extendedMessage);
40-
}
41-
break;
42-
case ConsoleLogLevel.DEBUG:
43-
if (data) {
44-
console.debug(extendedMessage, data);
45-
} else {
46-
console.debug(extendedMessage);
47-
}
48-
break;
49-
case ConsoleLogLevel.INFO:
50-
if (data) {
51-
console.info(extendedMessage, data);
52-
} else {
53-
console.info(extendedMessage);
54-
}
55-
break;
56-
case ConsoleLogLevel.WARN:
57-
if (data) {
58-
console.warn(extendedMessage, data);
59-
} else {
60-
console.warn(extendedMessage);
61-
}
62-
break;
63-
case ConsoleLogLevel.ERROR:
64-
(message as Error).message = extendedMessage;
65-
if (data) {
66-
console.error(message, data);
67-
} else {
68-
console.error(message);
69-
}
70-
break;
71-
}
72-
}
73-
}
25+
constructor(config: ConsoleLogProviderConfig = defaultConfig) {
26+
this.trace = this.trace.bind(this);
27+
this.debug = this.debug.bind(this);
28+
this.info = this.info.bind(this);
29+
this.warn = this.warn.bind(this);
30+
this.error = this.error.bind(this);
31+
this.logLevel = config.logLevel ?? ConsoleLogLevel.INFO;
32+
this.withTimeStamp = config.withTimeStamp ?? true;
33+
}
7434

75-
public trace(message: string, data?: {}) {
76-
this.log(ConsoleLogLevel.TRACE, message, data);
35+
private log(logLevel: ConsoleLogLevel, message: string | Error, data?: {}) {
36+
if (logLevel >= this.logLevel) {
37+
const timeStampPrefix = `${new Date().toISOString()} - `;
38+
const extendedMessage = `${
39+
this.withTimeStamp == null || this.withTimeStamp ? timeStampPrefix : ""
40+
}${ConsoleLogLevel[logLevel]} - ${
41+
message instanceof Error ? message.message : message
42+
}`;
43+
switch (logLevel) {
44+
case ConsoleLogLevel.TRACE:
45+
if (data) {
46+
console.trace(extendedMessage, data);
47+
} else {
48+
console.trace(extendedMessage);
49+
}
50+
break;
51+
case ConsoleLogLevel.DEBUG:
52+
if (data) {
53+
console.debug(extendedMessage, data);
54+
} else {
55+
console.debug(extendedMessage);
56+
}
57+
break;
58+
case ConsoleLogLevel.INFO:
59+
if (data) {
60+
console.info(extendedMessage, data);
61+
} else {
62+
console.info(extendedMessage);
63+
}
64+
break;
65+
case ConsoleLogLevel.WARN:
66+
if (data) {
67+
console.warn(extendedMessage, data);
68+
} else {
69+
console.warn(extendedMessage);
70+
}
71+
break;
72+
case ConsoleLogLevel.ERROR:
73+
(message as Error).message = extendedMessage;
74+
if (data) {
75+
console.error(message, data);
76+
} else {
77+
console.error(message);
78+
}
79+
break;
80+
}
7781
}
82+
}
7883

79-
public debug(message: string, data?: {}) {
80-
this.log(ConsoleLogLevel.DEBUG, message, data);
81-
}
84+
public trace(message: string, data?: {}) {
85+
this.log(ConsoleLogLevel.TRACE, message, data);
86+
}
8287

83-
public info(message: string, data?: {}) {
84-
this.log(ConsoleLogLevel.INFO, message, data);
85-
}
88+
public debug(message: string, data?: {}) {
89+
this.log(ConsoleLogLevel.DEBUG, message, data);
90+
}
8691

87-
public warn(message: string, data?: {}) {
88-
this.log(ConsoleLogLevel.WARN, message, data);
89-
}
92+
public info(message: string, data?: {}) {
93+
this.log(ConsoleLogLevel.INFO, message, data);
94+
}
9095

91-
public error(message: Error, data?: {}) {
92-
this.log(ConsoleLogLevel.ERROR, message, data);
93-
}
94-
}
96+
public warn(message: string, data?: {}) {
97+
this.log(ConsoleLogLevel.WARN, message, data);
98+
}
9599

100+
public error(message: Error, data?: {}) {
101+
this.log(ConsoleLogLevel.ERROR, message, data);
102+
}
103+
}

0 commit comments

Comments
 (0)