Barazo default frontend
barazo.forum
1import { render, screen } from '@testing-library/react'
2import userEvent from '@testing-library/user-event'
3import { axe } from 'vitest-axe'
4import RootError from './error'
5
6// Mock next/link to render a plain anchor
7vi.mock('next/link', () => ({
8 default: ({ href, children, ...props }: { href: string; children: React.ReactNode }) => (
9 <a href={href} {...props}>
10 {children}
11 </a>
12 ),
13}))
14
15describe('RootError', () => {
16 const error = new Error('Something broke')
17 const reset = vi.fn()
18
19 beforeEach(() => {
20 reset.mockClear()
21 })
22
23 it('renders error heading', () => {
24 render(<RootError error={error} reset={reset} />)
25 expect(screen.getByRole('heading', { name: 'Something went wrong' })).toBeInTheDocument()
26 })
27
28 it('renders an alert region', () => {
29 render(<RootError error={error} reset={reset} />)
30 expect(screen.getByRole('alert')).toBeInTheDocument()
31 })
32
33 it('renders try again button that calls reset', async () => {
34 const user = userEvent.setup()
35 render(<RootError error={error} reset={reset} />)
36 const button = screen.getByRole('button', { name: /try again/i })
37 await user.click(button)
38 expect(reset).toHaveBeenCalledOnce()
39 })
40
41 it('renders a go home link', () => {
42 render(<RootError error={error} reset={reset} />)
43 const link = screen.getByRole('link', { name: /go home/i })
44 expect(link).toHaveAttribute('href', '/')
45 })
46
47 it('shows error message in development', () => {
48 vi.stubEnv('NODE_ENV', 'development')
49 render(<RootError error={error} reset={reset} />)
50 expect(screen.getByText('Something broke')).toBeInTheDocument()
51 vi.unstubAllEnvs()
52 })
53
54 it('passes axe accessibility check', async () => {
55 const { container } = render(<RootError error={error} reset={reset} />)
56 const results = await axe(container)
57 expect(results).toHaveNoViolations()
58 })
59})