Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
100 changes: 30 additions & 70 deletions app/error.empty-fallback.test.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
// app/error.empty-fallback.test.tsx

import { describe, expect, it, vi, beforeEach } from 'vitest';
import { render, screen, fireEvent } from '@testing-library/react';
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import '@testing-library/jest-dom/vitest';
import ErrorBoundary from './error';

vi.mock('next/link', () => ({
default: ({
Expand All @@ -20,105 +22,63 @@ vi.mock('sonner', () => ({
},
}));

import ErrorBoundary from './error';

describe('Root Error Boundary - Empty & Missing Input Fallbacks', () => {
const mockWriteText = vi.fn().mockResolvedValue(undefined);

beforeEach(() => {
vi.clearAllMocks();
// Mock clipboard API
Object.defineProperty(navigator, 'clipboard', {
value: {
writeText: vi.fn().mockResolvedValue(undefined),
vi.stubGlobal('navigator', {
clipboard: {
writeText: mockWriteText,
},
configurable: true,
writable: true,
});
});

it('renders successfully when error is null', () => {
expect(() =>
render(<ErrorBoundary error={null as unknown as Error} reset={vi.fn()} />)
).not.toThrow();

expect(
screen.getByRole('heading', {
name: /Looks like an exception was thrown in the application/i,
})
).toBeInTheDocument();
expect(screen.getByText('Unknown runtime error occurred.')).toBeInTheDocument();
});

it('renders successfully when error is undefined', () => {
expect(() =>
render(<ErrorBoundary error={undefined as unknown as Error} reset={vi.fn()} />)
).not.toThrow();

expect(
screen.getByRole('heading', {
name: /Looks like an exception was thrown in the application/i,
})
).toBeInTheDocument();
expect(screen.getByText('Unknown runtime error occurred.')).toBeInTheDocument();
});

it('renders successfully when error is an empty object', () => {
expect(() =>
render(<ErrorBoundary error={{} as unknown as Error} reset={vi.fn()} />)
).not.toThrow();

expect(
screen.getByRole('heading', {
name: /Looks like an exception was thrown in the application/i,
})
).toBeInTheDocument();
expect(screen.getByText('Unknown runtime error occurred.')).toBeInTheDocument();
});

it('renders successfully when error has no message property', () => {
expect(() =>
render(<ErrorBoundary error={{ name: 'CustomError' } as unknown as Error} reset={vi.fn()} />)
).not.toThrow();

expect(
screen.getByRole('heading', {
name: /Looks like an exception was thrown in the application/i,
})
).toBeInTheDocument();
expect(screen.getByText('Unknown runtime error occurred.')).toBeInTheDocument();
});
const emptyErrorCases = [
{ description: 'null', error: null as unknown as Error },
{ description: 'undefined', error: undefined as unknown as Error },
{ description: 'an empty object', error: {} as unknown as Error },
{ description: 'missing message property', error: { name: 'CustomError' } as unknown as Error },
{ description: 'an empty string message', error: new Error('') },
];

it('renders successfully when error message is an empty string', () => {
expect(() => render(<ErrorBoundary error={new Error('')} reset={vi.fn()} />)).not.toThrow();
it.each(emptyErrorCases)('renders successfully when error is $description', ({ error }) => {
expect(() => render(<ErrorBoundary error={error} reset={vi.fn()} />)).not.toThrow();

expect(
screen.getByRole('heading', {
name: /Looks like an exception was thrown in the application/i,
})
).toBeInTheDocument();

expect(screen.getByText('Unknown runtime error occurred.')).toBeInTheDocument();
});

it('renders interactive elements and triggers actions correctly in fallback state', async () => {
const user = userEvent.setup(); // Initialize user-event
const resetMock = vi.fn();

render(<ErrorBoundary error={{} as unknown as Error} reset={resetMock} />);

// Check actions
const retryButton = screen.getByRole('button', { name: /git fetch/i });
expect(retryButton).toBeInTheDocument();
fireEvent.click(retryButton);

await user.click(retryButton);
expect(resetMock).toHaveBeenCalledOnce();

const homeLink = screen.getByRole('link', { name: /Return to main/i });
expect(homeLink).toBeInTheDocument();

// Check clipboard copy fallback behavior
const terminalContainer = screen.getByText('commitpulse β€” error').closest('div');
expect(terminalContainer).toBeInTheDocument();
if (terminalContainer) {
fireEvent.click(terminalContainer);
expect(navigator.clipboard.writeText).toHaveBeenCalledWith(
expect.stringContaining('Unknown exception in the render tree.')
);
}

expect(terminalContainer).not.toBeNull();

await user.click(terminalContainer!);

expect(mockWriteText).toHaveBeenCalledWith(
expect.stringContaining('Unknown exception in the render tree.')
);
});
});
Loading