@@ -5,16 +5,22 @@ const showProjects = vi.fn();
55const showWorkspace = vi . fn ( ) ;
66const loadSession = vi . fn ( ) ;
77const showSearchPage = vi . fn ( ) ;
8+ const toggleTheme = vi . fn ( ) ;
9+ const toggleSidebar = vi . fn ( ) ;
810
911vi . mock ( './projects.js' , ( ) => ( { showProjects } ) ) ;
1012vi . mock ( './sessions.js' , ( ) => ( { showWorkspace, loadSession, selectSession : vi . fn ( ) , copyAll : vi . fn ( ) } ) ) ;
1113vi . mock ( './search.js' , ( ) => ( { showSearchPage, doSearch : vi . fn ( ) } ) ) ;
1214vi . mock ( './export.js' , ( ) => ( { bulkExport : vi . fn ( ) , downloadSession : vi . fn ( ) } ) ) ;
15+ vi . mock ( './shared/utils.js' , async ( importOriginal ) => {
16+ const actual = await importOriginal ( ) ;
17+ return { ...actual , toggleSidebar, closeSidebar : vi . fn ( ) } ;
18+ } ) ;
1319vi . mock ( './shared/theme.js' , ( ) => ( {
1420 HLJS_THEME_SHEETS : { } ,
1521 applyHljsTheme : vi . fn ( ) ,
1622 applyTheme : vi . fn ( ) ,
17- toggleTheme : vi . fn ( ) ,
23+ toggleTheme,
1824 setWorkspaceMode : vi . fn ( ) ,
1925} ) ) ;
2026
@@ -109,3 +115,55 @@ describe('router (app.js)', () => {
109115 expect ( showWorkspace ) . toHaveBeenCalledWith ( 'other' ) ;
110116 } ) ;
111117} ) ;
118+
119+ describe ( 'navbar handlers (app.js DOMContentLoaded)' , ( ) => {
120+ const origScrollTo = window . scrollTo ;
121+
122+ beforeAll ( async ( ) => {
123+ vi . resetModules ( ) ;
124+ window . scrollTo = vi . fn ( ) ;
125+ document . body . innerHTML = `
126+ <button id="hamburger-btn"></button>
127+ <a id="navbar-brand" href="#"></a>
128+ <a id="nav-search-link" href="#search"></a>
129+ <button id="theme-toggle"></button>
130+ <div id="content"></div>
131+ <span id="footer-year"></span>
132+ ` ;
133+ await import ( './app.js' ) ;
134+ document . dispatchEvent ( new Event ( 'DOMContentLoaded' ) ) ;
135+ } ) ;
136+
137+ afterAll ( ( ) => {
138+ window . scrollTo = origScrollTo ;
139+ } ) ;
140+
141+ beforeEach ( ( ) => {
142+ toggleTheme . mockClear ( ) ;
143+ toggleSidebar . mockClear ( ) ;
144+ showProjects . mockClear ( ) ;
145+ showSearchPage . mockClear ( ) ;
146+ } ) ;
147+
148+ it ( 'wires hamburger click to toggleSidebar' , ( ) => {
149+ document . getElementById ( 'hamburger-btn' ) . click ( ) ;
150+ expect ( toggleSidebar ) . toHaveBeenCalledTimes ( 1 ) ;
151+ } ) ;
152+
153+ it ( 'wires navbar brand click to showProjects' , ( ) => {
154+ const brand = document . getElementById ( 'navbar-brand' ) ;
155+ brand . dispatchEvent ( new MouseEvent ( 'click' , { bubbles : true , cancelable : true } ) ) ;
156+ expect ( showProjects ) . toHaveBeenCalled ( ) ;
157+ } ) ;
158+
159+ it ( 'wires nav search link click to showSearchPage' , ( ) => {
160+ const link = document . getElementById ( 'nav-search-link' ) ;
161+ link . dispatchEvent ( new MouseEvent ( 'click' , { bubbles : true , cancelable : true } ) ) ;
162+ expect ( showSearchPage ) . toHaveBeenCalled ( ) ;
163+ } ) ;
164+
165+ it ( 'wires theme toggle click to toggleTheme' , ( ) => {
166+ document . getElementById ( 'theme-toggle' ) . click ( ) ;
167+ expect ( toggleTheme ) . toHaveBeenCalledTimes ( 1 ) ;
168+ } ) ;
169+ } ) ;
0 commit comments