Skip to content

Commit 32bcf6a

Browse files
committed
logger factory tests
1 parent 6ea7c4b commit 32bcf6a

File tree

3 files changed

+134
-16
lines changed

3 files changed

+134
-16
lines changed

lib/logging/logger_factory.spec.ts

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { describe, it, expect, beforeEach, vi } from 'vitest';
2+
3+
vi.mock('./logger', async (importOriginal) => {
4+
const actual = await importOriginal()
5+
6+
const MockLogger = vi.fn();
7+
const MockConsoleLogHandler = vi.fn();
8+
9+
return { ...actual as any, OptimizelyLogger: MockLogger, ConsoleLogHandler: MockConsoleLogHandler };
10+
});
11+
12+
import { OptimizelyLogger, ConsoleLogHandler, LogLevel } from './logger';
13+
import { createLogger, extractLogger, InfoLog } from './logger_factory';
14+
import { errorResolver, infoResolver } from '../message/message_resolver';
15+
16+
describe('create', () => {
17+
const MockedOptimizelyLogger = vi.mocked(OptimizelyLogger);
18+
const MockedConsoleLogHandler = vi.mocked(ConsoleLogHandler);
19+
20+
beforeEach(() => {
21+
MockedConsoleLogHandler.mockClear();
22+
MockedOptimizelyLogger.mockClear();
23+
});
24+
25+
it('should use the passed in options and a default name Optimizely', () => {
26+
const mockLogHandler = { log: vi.fn() };
27+
28+
const logger = extractLogger(createLogger({
29+
level: InfoLog,
30+
logHandler: mockLogHandler,
31+
}));
32+
33+
expect(logger).toBe(MockedOptimizelyLogger.mock.instances[0]);
34+
const { name, level, infoMsgResolver, errorMsgResolver, logHandler } = MockedOptimizelyLogger.mock.calls[0][0];
35+
expect(name).toBe('Optimizely');
36+
expect(level).toBe(LogLevel.Info);
37+
expect(infoMsgResolver).toBe(infoResolver);
38+
expect(errorMsgResolver).toBe(errorResolver);
39+
expect(logHandler).toBe(mockLogHandler);
40+
});
41+
42+
it('should use a ConsoleLogHandler if no logHandler is provided', () => {
43+
const logger = extractLogger(createLogger({
44+
level: InfoLog,
45+
}));
46+
47+
expect(logger).toBe(MockedOptimizelyLogger.mock.instances[0]);
48+
const { logHandler } = MockedOptimizelyLogger.mock.calls[0][0];
49+
expect(logHandler).toBe(MockedConsoleLogHandler.mock.instances[0]);
50+
});
51+
});

lib/logging/logger_factory.ts

Lines changed: 82 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,87 @@
1-
// import { LogLevel, LogResolver } from './logger';
1+
import { ConsoleLogHandler, LogHandler, LogLevel, OptimizelyLogger } from './logger';
2+
import { errorResolver, infoResolver, MessageResolver } from '../message/message_resolver';
23

3-
// type LevelPreset = {
4-
// level: LogLevel;
5-
// resolver?: LogResolver;
6-
// }
4+
type LevelPreset = {
5+
level: LogLevel,
6+
infoResolver?: MessageResolver,
7+
errorResolver: MessageResolver,
8+
}
79

8-
// const levelPresetSymbol = Symbol('levelPreset');
10+
const debugPreset: LevelPreset = {
11+
level: LogLevel.Debug,
12+
infoResolver,
13+
errorResolver,
14+
};
915

10-
// export type OpaqueLevelPreset = {
11-
// [levelPresetSymbol]: unknown;
12-
// };
16+
const infoPreset: LevelPreset = {
17+
level: LogLevel.Info,
18+
infoResolver,
19+
errorResolver,
20+
}
1321

14-
// const Info: LevelPreset = {
15-
// level: LogLevel.Info,
16-
// };
22+
const warnPreset: LevelPreset = {
23+
level: LogLevel.Warn,
24+
errorResolver,
25+
}
1726

18-
// export const InfoLog: OpaqueLevelPreset = {
19-
// [levelPresetSymbol]: Info,
20-
// };
27+
const errorPreset: LevelPreset = {
28+
level: LogLevel.Error,
29+
errorResolver,
30+
}
31+
32+
const levelPresetSymbol = Symbol();
33+
34+
export type OpaqueLevelPreset = {
35+
[levelPresetSymbol]: unknown;
36+
};
37+
38+
export const DebugLog: OpaqueLevelPreset = {
39+
[levelPresetSymbol]: debugPreset,
40+
};
41+
42+
export const InfoLog: OpaqueLevelPreset = {
43+
[levelPresetSymbol]: infoPreset,
44+
};
45+
46+
export const WarnLog: OpaqueLevelPreset = {
47+
[levelPresetSymbol]: warnPreset,
48+
};
49+
50+
export const ErrorLog: OpaqueLevelPreset = {
51+
[levelPresetSymbol]: errorPreset,
52+
};
53+
54+
export const extractLevelPreset = (preset: OpaqueLevelPreset): LevelPreset => {
55+
return preset[levelPresetSymbol] as LevelPreset;
56+
}
57+
58+
const loggerSymbol = Symbol();
59+
60+
export type OpaqueLogger = {
61+
[loggerSymbol]: unknown;
62+
};
63+
64+
export type LoggerConfig = {
65+
level: OpaqueLevelPreset,
66+
logHandler?: LogHandler,
67+
};
68+
69+
export const createLogger = (config: LoggerConfig): OpaqueLogger => {
70+
const { level, infoResolver, errorResolver } = extractLevelPreset(config.level);
71+
72+
const loggerName = 'Optimizely';
73+
74+
return {
75+
[loggerSymbol]: new OptimizelyLogger({
76+
name: loggerName,
77+
level,
78+
infoMsgResolver: infoResolver,
79+
errorMsgResolver: errorResolver,
80+
logHandler: config.logHandler || new ConsoleLogHandler(),
81+
}),
82+
};
83+
};
84+
85+
export const extractLogger = (logger: OpaqueLogger): OptimizelyLogger => {
86+
return logger[loggerSymbol] as OptimizelyLogger;
87+
}

vitest.config.mts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export default defineConfig({
2020
test: {
2121
onConsoleLog: () => true,
2222
environment: 'happy-dom',
23-
include: ['**/logger.spec.ts'],
23+
include: ['**/logger_factory.spec.ts'],
2424
typecheck: {
2525
tsconfig: 'tsconfig.spec.json',
2626
},

0 commit comments

Comments
 (0)