Skip to content

Commit cdf5453

Browse files
committed
testws
1 parent 02d7c77 commit cdf5453

File tree

4 files changed

+351
-29
lines changed

4 files changed

+351
-29
lines changed

lib/logging/logger.spec.ts

Lines changed: 323 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,326 @@
1-
import { describe, beforeEach, afterEach, it, expect, vi } from 'vitest';
2-
3-
it.skip('pass', () => {});
4-
// import {
5-
// LogLevel,
6-
// LogHandler,
7-
// LoggerFacade,
8-
// } from './models'
9-
10-
// import {
11-
// setLogHandler,
12-
// setLogLevel,
13-
// getLogger,
14-
// ConsoleLogHandler,
15-
// resetLogger,
16-
// getLogLevel,
17-
// } from './logger'
18-
19-
// import { resetErrorHandler } from './errorHandler'
20-
// import { ErrorHandler, setErrorHandler } from './errorHandler'
1+
import { describe, beforeEach, afterEach, it, expect, vi, afterAll } from 'vitest';
2+
3+
import { ConsoleLogHandler, LogLevel, OptimizelyLogger } from './logger';
4+
5+
describe('ConsoleLogHandler', () => {
6+
const logSpy = vi.spyOn(console, 'log');
7+
const debugSpy = vi.spyOn(console, 'debug');
8+
const infoSpy = vi.spyOn(console, 'info');
9+
const warnSpy = vi.spyOn(console, 'warn');
10+
const errorSpy = vi.spyOn(console, 'error');
11+
12+
beforeEach(() => {
13+
logSpy.mockClear();
14+
debugSpy.mockClear();
15+
infoSpy.mockClear();
16+
warnSpy.mockClear();
17+
vi.useFakeTimers().setSystemTime((0));
18+
});
19+
20+
afterEach(() => {
21+
vi.useRealTimers();
22+
});
23+
24+
afterAll(() => {
25+
logSpy.mockRestore();
26+
debugSpy.mockRestore();
27+
infoSpy.mockRestore();
28+
warnSpy.mockRestore();
29+
errorSpy.mockRestore();
30+
31+
vi.useRealTimers();
32+
});
33+
34+
it('should call console.info for LogLevel.Info', () => {
35+
const logger = new ConsoleLogHandler();
36+
logger.log(LogLevel.Info, 'test');
37+
38+
expect(infoSpy).toHaveBeenCalledTimes(1);
39+
});
40+
41+
it('should call console.debug for LogLevel.Debug', () => {
42+
const logger = new ConsoleLogHandler();
43+
logger.log(LogLevel.Debug, 'test');
44+
45+
expect(debugSpy).toHaveBeenCalledTimes(1);
46+
});
47+
48+
49+
it('should call console.warn for LogLevel.Warn', () => {
50+
const logger = new ConsoleLogHandler();
51+
logger.log(LogLevel.Warn, 'test');
52+
53+
expect(warnSpy).toHaveBeenCalledTimes(1);
54+
});
55+
56+
it('should call console.error for LogLevel.Error', () => {
57+
const logger = new ConsoleLogHandler();
58+
logger.log(LogLevel.Error, 'test');
59+
60+
expect(errorSpy).toHaveBeenCalledTimes(1);
61+
});
62+
63+
it('should format the log message', () => {
64+
const logger = new ConsoleLogHandler();
65+
logger.log(LogLevel.Info, 'info message');
66+
logger.log(LogLevel.Debug, 'debug message');
67+
logger.log(LogLevel.Warn, 'warn message');
68+
logger.log(LogLevel.Error, 'error message');
69+
70+
expect(infoSpy).toHaveBeenCalledWith('[OPTIMIZELY] - INFO 1970-01-01T00:00:00.000Z info message');
71+
expect(debugSpy).toHaveBeenCalledWith('[OPTIMIZELY] - DEGUB 1970-01-01T00:00:00.000Z debug message');
72+
expect(warnSpy).toHaveBeenCalledWith('[OPTIMIZELY] - WARN 1970-01-01T00:00:00.000Z warn message');
73+
expect(errorSpy).toHaveBeenCalledWith('[OPTIMIZELY] - ERROR 1970-01-01T00:00:00.000Z error message');
74+
});
75+
76+
it('should use the prefix if provided', () => {
77+
const logger = new ConsoleLogHandler('PREFIX');
78+
logger.log(LogLevel.Info, 'info message');
79+
logger.log(LogLevel.Debug, 'debug message');
80+
logger.log(LogLevel.Warn, 'warn message');
81+
logger.log(LogLevel.Error, 'error message');
82+
83+
expect(infoSpy).toHaveBeenCalledWith('PREFIX - INFO 1970-01-01T00:00:00.000Z info message');
84+
expect(debugSpy).toHaveBeenCalledWith('PREFIX - DEGUB 1970-01-01T00:00:00.000Z debug message');
85+
expect(warnSpy).toHaveBeenCalledWith('PREFIX - WARN 1970-01-01T00:00:00.000Z warn message');
86+
expect(errorSpy).toHaveBeenCalledWith('PREFIX - ERROR 1970-01-01T00:00:00.000Z error message');
87+
});
88+
});
89+
90+
91+
const mockMessageResolver = (prefix: string = '') => {
92+
return {
93+
resolve: vi.fn().mockImplementation((message) => `${prefix} ${message}`),
94+
};
95+
}
96+
97+
const mockLogHandler = () => {
98+
return {
99+
log: vi.fn(),
100+
};
101+
}
102+
103+
describe('OptimizelyLogger', () => {
104+
it('should only log error when level is set to error', () => {
105+
const logHandler = mockLogHandler();
106+
const messageResolver = mockMessageResolver();
107+
108+
const logger = new OptimizelyLogger({
109+
logHandler,
110+
errorMsgResolver: messageResolver,
111+
level: LogLevel.Error,
112+
});
113+
114+
logger.error('test');
115+
expect(logHandler.log).toHaveBeenCalledTimes(1);
116+
expect(logHandler.log.mock.calls[0][0]).toBe(LogLevel.Error);
117+
118+
logger.warn('test');
119+
expect(logHandler.log).toHaveBeenCalledTimes(1);
120+
121+
logger.info('test');
122+
expect(logHandler.log).toHaveBeenCalledTimes(1);
123+
124+
logger.debug('test');
125+
expect(logHandler.log).toHaveBeenCalledTimes(1);
126+
});
127+
128+
it('should only log warn and error when level is set to warn', () => {
129+
const logHandler = mockLogHandler();
130+
const messageResolver = mockMessageResolver();
131+
132+
const logger = new OptimizelyLogger({
133+
logHandler,
134+
errorMsgResolver: messageResolver,
135+
level: LogLevel.Warn,
136+
});
137+
138+
logger.error('test');
139+
expect(logHandler.log).toHaveBeenCalledTimes(1);
140+
expect(logHandler.log.mock.calls[0][0]).toBe(LogLevel.Error);
141+
142+
logger.warn('test');
143+
expect(logHandler.log).toHaveBeenCalledTimes(2);
144+
expect(logHandler.log.mock.calls[1][0]).toBe(LogLevel.Warn);
145+
146+
logger.info('test');
147+
expect(logHandler.log).toHaveBeenCalledTimes(2);
148+
149+
logger.debug('test');
150+
expect(logHandler.log).toHaveBeenCalledTimes(2);
151+
});
152+
153+
it('should only log info, warn and error when level is set to info', () => {
154+
const logHandler = mockLogHandler();
155+
const messageResolver = mockMessageResolver();
156+
157+
const logger = new OptimizelyLogger({
158+
logHandler,
159+
infoMsgResolver: messageResolver,
160+
errorMsgResolver: messageResolver,
161+
level: LogLevel.Info,
162+
});
163+
164+
logger.error('test');
165+
expect(logHandler.log).toHaveBeenCalledTimes(1);
166+
expect(logHandler.log.mock.calls[0][0]).toBe(LogLevel.Error);
167+
168+
logger.warn('test');
169+
expect(logHandler.log).toHaveBeenCalledTimes(2);
170+
expect(logHandler.log.mock.calls[1][0]).toBe(LogLevel.Warn);
171+
172+
logger.info('test');
173+
expect(logHandler.log).toHaveBeenCalledTimes(3);
174+
expect(logHandler.log.mock.calls[2][0]).toBe(LogLevel.Info);
175+
176+
logger.debug('test');
177+
expect(logHandler.log).toHaveBeenCalledTimes(3);
178+
});
179+
180+
it('should log all levels when level is set to debug', () => {
181+
const logHandler = mockLogHandler();
182+
const messageResolver = mockMessageResolver();
183+
184+
const logger = new OptimizelyLogger({
185+
logHandler,
186+
infoMsgResolver: messageResolver,
187+
errorMsgResolver: messageResolver,
188+
level: LogLevel.Debug,
189+
});
190+
191+
logger.error('test');
192+
expect(logHandler.log).toHaveBeenCalledTimes(1);
193+
expect(logHandler.log.mock.calls[0][0]).toBe(LogLevel.Error);
194+
195+
logger.warn('test');
196+
expect(logHandler.log).toHaveBeenCalledTimes(2);
197+
expect(logHandler.log.mock.calls[1][0]).toBe(LogLevel.Warn);
198+
199+
logger.info('test');
200+
expect(logHandler.log).toHaveBeenCalledTimes(3);
201+
expect(logHandler.log.mock.calls[2][0]).toBe(LogLevel.Info);
202+
203+
logger.debug('test');
204+
expect(logHandler.log).toHaveBeenCalledTimes(4);
205+
expect(logHandler.log.mock.calls[3][0]).toBe(LogLevel.Debug);
206+
});
207+
208+
it('should skip logging debug/info levels if not infoMessageResolver is available', () => {
209+
const logHandler = mockLogHandler();
210+
const messageResolver = mockMessageResolver();
211+
212+
const logger = new OptimizelyLogger({
213+
logHandler,
214+
errorMsgResolver: messageResolver,
215+
level: LogLevel.Debug,
216+
});
217+
218+
logger.info('test');
219+
logger.debug('test');
220+
expect(logHandler.log).not.toHaveBeenCalled();
221+
});
222+
223+
it('should resolve debug/info messages using the infoMessageResolver', () => {
224+
const logHandler = mockLogHandler();
225+
226+
const logger = new OptimizelyLogger({
227+
logHandler,
228+
infoMsgResolver: mockMessageResolver('info'),
229+
errorMsgResolver: mockMessageResolver('err'),
230+
level: LogLevel.Debug,
231+
});
232+
233+
logger.debug('msg one');
234+
logger.info('msg two');
235+
expect(logHandler.log).toHaveBeenCalledTimes(2);
236+
expect(logHandler.log).toHaveBeenNthCalledWith(1, LogLevel.Debug, 'info msg one');
237+
expect(logHandler.log).toHaveBeenNthCalledWith(2, LogLevel.Info, 'info msg two');
238+
});
239+
240+
it('should resolve warn/error messages using the infoMessageResolver', () => {
241+
const logHandler = mockLogHandler();
242+
243+
const logger = new OptimizelyLogger({
244+
logHandler,
245+
infoMsgResolver: mockMessageResolver('info'),
246+
errorMsgResolver: mockMessageResolver('err'),
247+
level: LogLevel.Debug,
248+
});
249+
250+
logger.warn('msg one');
251+
logger.error('msg two');
252+
expect(logHandler.log).toHaveBeenCalledTimes(2);
253+
expect(logHandler.log).toHaveBeenNthCalledWith(1, LogLevel.Warn, 'err msg one');
254+
expect(logHandler.log).toHaveBeenNthCalledWith(2, LogLevel.Error, 'err msg two');
255+
});
256+
257+
it('should use the provided name as message prefix', () => {
258+
const logHandler = mockLogHandler();
259+
260+
const logger = new OptimizelyLogger({
261+
name: 'EventManager',
262+
logHandler,
263+
infoMsgResolver: mockMessageResolver('info'),
264+
errorMsgResolver: mockMessageResolver('err'),
265+
level: LogLevel.Debug,
266+
});
267+
268+
logger.warn('msg one');
269+
logger.error('msg two');
270+
logger.debug('msg three');
271+
logger.info('msg four');
272+
expect(logHandler.log).toHaveBeenCalledTimes(4);
273+
expect(logHandler.log).toHaveBeenNthCalledWith(1, LogLevel.Warn, 'EventManager: err msg one');
274+
expect(logHandler.log).toHaveBeenNthCalledWith(2, LogLevel.Error, 'EventManager: err msg two');
275+
expect(logHandler.log).toHaveBeenNthCalledWith(3, LogLevel.Debug, 'EventManager: info msg three');
276+
expect(logHandler.log).toHaveBeenNthCalledWith(4, LogLevel.Info, 'EventManager: info msg four');
277+
});
278+
279+
it('should format the message with the give parameters', () => {
280+
const logHandler = mockLogHandler();
281+
282+
const logger = new OptimizelyLogger({
283+
name: 'EventManager',
284+
logHandler,
285+
infoMsgResolver: mockMessageResolver('info'),
286+
errorMsgResolver: mockMessageResolver('err'),
287+
level: LogLevel.Debug,
288+
});
289+
290+
logger.warn('msg %s, %s', 'one', 1);
291+
logger.error('msg %s', 'two');
292+
logger.debug('msg three', 9999);
293+
logger.info('msg four%s%s', '!', '!');
294+
expect(logHandler.log).toHaveBeenCalledTimes(4);
295+
expect(logHandler.log).toHaveBeenNthCalledWith(1, LogLevel.Warn, 'EventManager: err msg one, 1');
296+
expect(logHandler.log).toHaveBeenNthCalledWith(2, LogLevel.Error, 'EventManager: err msg two');
297+
expect(logHandler.log).toHaveBeenNthCalledWith(3, LogLevel.Debug, 'EventManager: info msg three');
298+
expect(logHandler.log).toHaveBeenNthCalledWith(4, LogLevel.Info, 'EventManager: info msg four!!');
299+
});
300+
301+
it('should log the message of the error object and ignore other arguments if first argument is an error object \
302+
other that OptimizelyError', () => {
303+
const logHandler = mockLogHandler();
304+
305+
const logger = new OptimizelyLogger({
306+
name: 'EventManager',
307+
logHandler,
308+
infoMsgResolver: mockMessageResolver('info'),
309+
errorMsgResolver: mockMessageResolver('err'),
310+
level: LogLevel.Debug,
311+
});
312+
logger.debug(new Error('msg debug %s'), 'a');
313+
logger.info(new Error('msg info %s'), 'b');
314+
logger.warn(new Error('msg warn %s'), 'c');
315+
logger.error(new Error('msg error %s'), 'd');
316+
317+
expect(logHandler.log).toHaveBeenCalledTimes(4);
318+
expect(logHandler.log).toHaveBeenNthCalledWith(1, LogLevel.Debug, 'EventManager: msg debug %s');
319+
expect(logHandler.log).toHaveBeenNthCalledWith(2, LogLevel.Info, 'EventManager: msg info %s');
320+
expect(logHandler.log).toHaveBeenNthCalledWith(3, LogLevel.Warn, 'EventManager: msg warn %s');
321+
expect(logHandler.log).toHaveBeenNthCalledWith(4, LogLevel.Error, 'EventManager: msg error %s');
322+
});
323+
});
21324

22325
// describe('logger', () => {
23326
// afterEach(() => {

0 commit comments

Comments
 (0)