diff --git a/src/app/__tests__/error.test.tsx b/src/app/__tests__/error.test.tsx new file mode 100644 index 00000000..633ca346 --- /dev/null +++ b/src/app/__tests__/error.test.tsx @@ -0,0 +1,51 @@ +import { render } from '@testing-library/react'; +import { describe, it, expect, vi } from 'vitest'; +import ErrorBoundary from '../error'; + +const mockReportError = vi.fn(); +const mockAddBreadcrumb = vi.fn(); + +vi.mock('@/services/errorReporting', () => ({ + errorReportingService: { + reportError: (...args: any[]) => mockReportError(...args), + addBreadcrumb: (...args: any[]) => mockAddBreadcrumb(...args), + }, +})); + +describe('ErrorBoundary', () => { + it('calls reportError when an error is caught', () => { + const testError = new Error('Test error'); + const reset = vi.fn(); + + render(); + + expect(mockReportError).toHaveBeenCalledWith(testError, { + errorInfo: { componentStack: '' }, + }); + }); + + it('calls addBreadcrumb when an error is caught', () => { + const testError = new Error('Test error'); + const reset = vi.fn(); + + render(); + + expect(mockAddBreadcrumb).toHaveBeenCalledWith('error.tsx', { + errorMessage: 'Test error', + digest: undefined, + }); + }); + + it('passes digest as metadata when available', () => { + const testError = new Error('Test error'); + (testError as any).digest = 'abc123'; + const reset = vi.fn(); + + render(); + + expect(mockReportError).toHaveBeenCalledWith(testError, { + errorInfo: { componentStack: '' }, + digest: 'abc123', + }); + }); +}); diff --git a/src/app/error.tsx b/src/app/error.tsx index c0816cfb..26cfc0d5 100644 --- a/src/app/error.tsx +++ b/src/app/error.tsx @@ -18,6 +18,10 @@ export default function ErrorBoundary({ errorMessage: error.message, digest: error.digest, }); + errorReportingService.reportError(error, { + errorInfo: { componentStack: '' }, + ...(error.digest ? { digest: error.digest } : {}), + }); logger.error('Application error', { error }); }, [error]);