diff --git a/src/__tests__/renderer/components/QuickActionsModal.test.tsx b/src/__tests__/renderer/components/QuickActionsModal.test.tsx index f00cb2a6..24396d71 100644 --- a/src/__tests__/renderer/components/QuickActionsModal.test.tsx +++ b/src/__tests__/renderer/components/QuickActionsModal.test.tsx @@ -37,9 +37,10 @@ vi.mock('../../../renderer/contexts/LayerStackContext', () => ({ }), })); +const mockAddToast = vi.fn(); vi.mock('../../../renderer/contexts/ToastContext', () => ({ useToast: () => ({ - addToast: vi.fn(), + addToast: mockAddToast, }), })); @@ -1271,7 +1272,7 @@ describe('QuickActionsModal', () => { }); }); - it('handles git remote URL returning null', async () => { + it('handles git remote URL returning null with toast notification', async () => { const { gitService } = await import('../../../renderer/services/git'); vi.mocked(gitService.getRemoteBrowserUrl).mockResolvedValueOnce(null); @@ -1282,10 +1283,41 @@ describe('QuickActionsModal', () => { await waitFor(() => { expect(window.maestro.shell.openExternal).not.toHaveBeenCalled(); + expect(mockAddToast).toHaveBeenCalledWith({ + type: 'error', + title: 'No Remote URL', + message: 'Could not find a remote URL for this repository', + }); expect(props.setQuickActionOpen).toHaveBeenCalledWith(false); }); }); + it('handles error when opening repository in browser', async () => { + const { gitService } = await import('../../../renderer/services/git'); + const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); + vi.mocked(gitService.getRemoteBrowserUrl).mockRejectedValueOnce(new Error('Network error')); + + const props = createDefaultProps(); + render(); + + fireEvent.click(screen.getByText('Open Repository in Browser')); + + await waitFor(() => { + expect(consoleSpy).toHaveBeenCalledWith( + 'Failed to open repository in browser:', + expect.any(Error) + ); + expect(mockAddToast).toHaveBeenCalledWith({ + type: 'error', + title: 'Error', + message: 'Network error', + }); + expect(props.setQuickActionOpen).toHaveBeenCalledWith(false); + }); + + consoleSpy.mockRestore(); + }); + it('sorts actions alphabetically', () => { const props = createDefaultProps(); render(); diff --git a/src/renderer/components/QuickActionsModal.tsx b/src/renderer/components/QuickActionsModal.tsx index de59f3e5..103d8b6d 100644 --- a/src/renderer/components/QuickActionsModal.tsx +++ b/src/renderer/components/QuickActionsModal.tsx @@ -777,9 +777,27 @@ export function QuickActionsModal(props: QuickActionsModalProps) { activeSession.inputMode === 'terminal' ? activeSession.shellCwd || activeSession.cwd : activeSession.cwd; - const browserUrl = await gitService.getRemoteBrowserUrl(cwd); - if (browserUrl) { - window.maestro.shell.openExternal(browserUrl); + try { + const browserUrl = await gitService.getRemoteBrowserUrl(cwd); + if (browserUrl) { + await window.maestro.shell.openExternal(browserUrl); + } else { + addToast({ + type: 'error', + title: 'No Remote URL', + message: 'Could not find a remote URL for this repository', + }); + } + } catch (error) { + console.error('Failed to open repository in browser:', error); + addToast({ + type: 'error', + title: 'Error', + message: + error instanceof Error + ? error.message + : 'Failed to open repository in browser', + }); } setQuickActionOpen(false); },