@@ -32,18 +32,24 @@ vi.mock('electron', () => {
3232 } satisfies Pick < typeof Electron . Menu , 'buildFromTemplate' > ,
3333 MenuItem : MockMenuItem ,
3434 shell : {
35- openExternal : vi . fn ( ) ,
35+ openExternal : vi . fn ( async ( ) => undefined ) ,
3636 } satisfies Pick < Electron . Shell , 'openExternal' > ,
3737 } ;
3838} ) ;
3939
4040vi . mock ( 'electron-updater' , ( ) => ( {
4141 autoUpdater : {
42- checkForUpdatesAndNotify : vi . fn ( ) ,
42+ checkForUpdatesAndNotify : vi . fn ( async ( ) => undefined ) ,
4343 quitAndInstall : vi . fn ( ) ,
4444 } ,
4545} ) ) ;
4646
47+ const logErrorMock = vi . fn ( ) ;
48+ vi . mock ( '../shared/logger' , ( ) => ( {
49+ logError : ( ...args : unknown [ ] ) => logErrorMock ( ...args ) ,
50+ toError : ( err : unknown ) => ( err instanceof Error ? err : new Error ( String ( err ) ) ) ,
51+ } ) ) ;
52+
4753vi . mock ( './utils' , ( ) => ( {
4854 takeScreenshot : vi . fn ( ) ,
4955 openLogsDirectory : vi . fn ( ) ,
@@ -92,7 +98,7 @@ describe('main/menu.ts', () => {
9298 menuItemInstances . length = 0 ; // Clear tracked instances
9399 menubar = {
94100 app : { quit : vi . fn ( ) } ,
95- showWindow : vi . fn ( ) ,
101+ showWindow : vi . fn ( async ( ) => undefined ) ,
96102 hideWindow : vi . fn ( ) ,
97103 refreshContextMenu : vi . fn ( ) ,
98104 tray : {
@@ -303,6 +309,71 @@ describe('main/menu.ts', () => {
303309 expect ( menubar . app . quit ) . toHaveBeenCalled ( ) ;
304310 } ) ;
305311
312+ it ( 'logs an error when checking for updates fails' , async ( ) => {
313+ const cfg = getMenuItemConfigByLabel ( 'Check for updates' ) ;
314+ vi . mocked ( autoUpdater . checkForUpdatesAndNotify ) . mockRejectedValueOnce (
315+ new Error ( 'update failed' ) ,
316+ ) ;
317+
318+ cfg ?. click ?.( ) ;
319+
320+ await vi . waitFor ( ( ) =>
321+ expect ( logErrorMock ) . toHaveBeenCalledWith (
322+ 'menu' ,
323+ 'Failed to check for updates' ,
324+ expect . any ( Error ) ,
325+ ) ,
326+ ) ;
327+ } ) ;
328+
329+ it ( 'logs an error when showing the window fails' , async ( ) => {
330+ const cfg = getMenuItemConfigByLabel ( `Show ${ APPLICATION . NAME } ` ) ;
331+ vi . mocked ( menubar . showWindow ) . mockRejectedValueOnce ( new Error ( 'show failed' ) ) ;
332+
333+ cfg ?. click ?.( ) ;
334+
335+ await vi . waitFor ( ( ) =>
336+ expect ( logErrorMock ) . toHaveBeenCalledWith (
337+ 'menu' ,
338+ 'Failed to show window' ,
339+ expect . any ( Error ) ,
340+ ) ,
341+ ) ;
342+ } ) ;
343+
344+ it ( 'logs an error when opening the repository fails' , async ( ) => {
345+ const template = buildAndGetTemplate ( ) ;
346+ const devEntry = template . find ( ( item ) => item ?. label === 'Developer' ) as TemplateItem ;
347+ const item = devEntry . submenu ?. find ( ( i ) => i . label === 'Visit Repository' ) ;
348+ vi . mocked ( shell . openExternal ) . mockRejectedValueOnce ( new Error ( 'open failed' ) ) ;
349+
350+ item ?. click ?.( ) ;
351+
352+ await vi . waitFor ( ( ) =>
353+ expect ( logErrorMock ) . toHaveBeenCalledWith (
354+ 'menu' ,
355+ 'Failed to open repository in browser' ,
356+ expect . any ( Error ) ,
357+ ) ,
358+ ) ;
359+ } ) ;
360+
361+ it ( 'logs an error when opening the website fails' , async ( ) => {
362+ const template = buildAndGetTemplate ( ) ;
363+ const item = template . find ( ( i ) => i . label === 'Visit Website' ) ;
364+ vi . mocked ( shell . openExternal ) . mockRejectedValueOnce ( new Error ( 'open failed' ) ) ;
365+
366+ item ?. click ?.( ) ;
367+
368+ await vi . waitFor ( ( ) =>
369+ expect ( logErrorMock ) . toHaveBeenCalledWith (
370+ 'menu' ,
371+ 'Failed to open website in browser' ,
372+ expect . any ( Error ) ,
373+ ) ,
374+ ) ;
375+ } ) ;
376+
306377 it ( 'show window menu item calls showWindow' , ( ) => {
307378 const cfg = getMenuItemConfigByLabel ( `Show ${ APPLICATION . NAME } ` ) ;
308379 cfg ?. click ?.( ) ;
0 commit comments