1+ import { describe , it , expect , vi , beforeEach } from 'vitest' ;
2+
3+ /**
4+ * Each test gets a fresh module instance via vi.resetModules() so that
5+ * the module-level loggerInstance starts as null.
6+ */
7+ describe ( 'Logger' , ( ) => {
8+ beforeEach ( ( ) => {
9+ vi . resetModules ( ) ;
10+ } ) ;
11+
12+ it ( 'should return false from isLoggerSet when no logger has been registered' , async ( ) => {
13+ const { isLoggerSet } = await import ( '../../src/logger/logger' ) ;
14+
15+ expect ( isLoggerSet ( ) ) . toBe ( false ) ;
16+ } ) ;
17+
18+ it ( 'should return true from isLoggerSet after setLogger is called' , async ( ) => {
19+ const { isLoggerSet, setLogger } = await import ( '../../src/logger/logger' ) ;
20+
21+ setLogger ( vi . fn ( ) ) ;
22+
23+ expect ( isLoggerSet ( ) ) . toBe ( true ) ;
24+ } ) ;
25+
26+ it ( 'should not throw when log is called with no logger registered' , async ( ) => {
27+ const { log } = await import ( '../../src/logger/logger' ) ;
28+
29+ expect ( ( ) => log ( 'test message' ) ) . not . toThrow ( ) ;
30+ } ) ;
31+
32+ it ( 'should forward msg, type, and args to the registered logger' , async ( ) => {
33+ const { setLogger, log } = await import ( '../../src/logger/logger' ) ;
34+ const mockLogger = vi . fn ( ) ;
35+
36+ setLogger ( mockLogger ) ;
37+ log ( 'something went wrong' , 'warn' , { code : 42 } ) ;
38+
39+ expect ( mockLogger ) . toHaveBeenCalledOnce ( ) ;
40+ expect ( mockLogger ) . toHaveBeenCalledWith ( 'something went wrong' , 'warn' , { code : 42 } ) ;
41+ } ) ;
42+
43+ it ( 'should pass undefined for omitted type and args' , async ( ) => {
44+ const { setLogger, log } = await import ( '../../src/logger/logger' ) ;
45+ const mockLogger = vi . fn ( ) ;
46+
47+ setLogger ( mockLogger ) ;
48+ log ( 'simple' ) ;
49+
50+ expect ( mockLogger ) . toHaveBeenCalledWith ( 'simple' , undefined , undefined ) ;
51+ } ) ;
52+
53+ it ( 'should replace a previously registered logger when setLogger is called again' , async ( ) => {
54+ const { setLogger, log } = await import ( '../../src/logger/logger' ) ;
55+ const first = vi . fn ( ) ;
56+ const second = vi . fn ( ) ;
57+
58+ setLogger ( first ) ;
59+ setLogger ( second ) ;
60+ log ( 'msg' ) ;
61+
62+ expect ( first ) . not . toHaveBeenCalled ( ) ;
63+ expect ( second ) . toHaveBeenCalledWith ( 'msg' , undefined , undefined ) ;
64+ } ) ;
65+
66+ it ( 'should clear the registered logger when resetLogger is called' , async ( ) => {
67+ const { isLoggerSet, setLogger, resetLogger } = await import ( '../../src/logger/logger' ) ;
68+
69+ setLogger ( vi . fn ( ) ) ;
70+ expect ( isLoggerSet ( ) ) . toBe ( true ) ;
71+
72+ resetLogger ( ) ;
73+ expect ( isLoggerSet ( ) ) . toBe ( false ) ;
74+ } ) ;
75+
76+ it ( 'should become a no-op after resetLogger is called' , async ( ) => {
77+ const { setLogger, resetLogger, log } = await import ( '../../src/logger/logger' ) ;
78+ const mockLogger = vi . fn ( ) ;
79+
80+ setLogger ( mockLogger ) ;
81+ resetLogger ( ) ;
82+ log ( 'msg' ) ;
83+
84+ expect ( mockLogger ) . not . toHaveBeenCalled ( ) ;
85+ } ) ;
86+ } ) ;
0 commit comments