Handle unhandled rejections more gracefully. (#4417)

Co-authored-by: Tommaso Sciortino <sciortino@gmail.com>
This commit is contained in:
Jacob Richman
2025-07-25 17:35:26 -07:00
committed by GitHub
parent fb751c542b
commit 21fef1620d
7 changed files with 321 additions and 214 deletions

View File

@@ -20,7 +20,8 @@ import {
import { LoadedSettings, SettingsFile, Settings } from '../config/settings.js';
import process from 'node:process';
import { useGeminiStream } from './hooks/useGeminiStream.js';
import { StreamingState } from './types.js';
import { useConsoleMessages } from './hooks/useConsoleMessages.js';
import { StreamingState, ConsoleMessageItem } from './types.js';
import { Tips } from './components/Tips.js';
// Define a more complete mock server config based on actual Config
@@ -192,6 +193,14 @@ vi.mock('./hooks/useLogger', () => ({
})),
}));
vi.mock('./hooks/useConsoleMessages.js', () => ({
useConsoleMessages: vi.fn(() => ({
consoleMessages: [],
handleNewMessage: vi.fn(),
clearConsoleMessages: vi.fn(),
})),
}));
vi.mock('../config/config.js', async (importOriginal) => {
const actual = await importOriginal();
return {
@@ -692,4 +701,35 @@ describe('App UI', () => {
);
});
});
describe('errorCount', () => {
it('should correctly sum the counts of error messages', async () => {
const mockConsoleMessages: ConsoleMessageItem[] = [
{ type: 'error', content: 'First error', count: 1 },
{ type: 'log', content: 'some log', count: 1 },
{ type: 'error', content: 'Second error', count: 3 },
{ type: 'warn', content: 'a warning', count: 1 },
{ type: 'error', content: 'Third error', count: 1 },
];
vi.mocked(useConsoleMessages).mockReturnValue({
consoleMessages: mockConsoleMessages,
handleNewMessage: vi.fn(),
clearConsoleMessages: vi.fn(),
});
const { lastFrame, unmount } = render(
<App
config={mockConfig as unknown as ServerConfig}
settings={mockSettings}
version={mockVersion}
/>,
);
currentUnmount = unmount;
await Promise.resolve();
// Total error count should be 1 + 3 + 1 = 5
expect(lastFrame()).toContain('5 errors');
});
});
});