Skip to content

Commit ad87e51

Browse files
committed
test(LanguageChart): add empty fallback coverage
1 parent 41222eb commit ad87e51

1 file changed

Lines changed: 46 additions & 0 deletions

File tree

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { render, screen } from '@testing-library/react';
2+
import { describe, expect, it, vi } from 'vitest';
3+
4+
import LanguageChart, { buildGradientStops } from './LanguageChart';
5+
6+
class MockIntersectionObserver implements IntersectionObserver {
7+
readonly root: Element | Document | null = null;
8+
readonly rootMargin: string = '';
9+
readonly thresholds: ReadonlyArray<number> = [];
10+
11+
disconnect = vi.fn();
12+
observe = vi.fn();
13+
takeRecords = vi.fn(() => []);
14+
unobserve = vi.fn();
15+
}
16+
17+
global.IntersectionObserver = MockIntersectionObserver;
18+
describe('LanguageChart empty fallback', () => {
19+
it('renders fallback UI for empty languages array', () => {
20+
render(<LanguageChart languages={[]} />);
21+
22+
expect(screen.getByText('Top Languages')).toBeInTheDocument();
23+
expect(screen.getByText('No language data found')).toBeInTheDocument();
24+
});
25+
26+
it('does not render language percentage markers in empty state', () => {
27+
render(<LanguageChart languages={[]} />);
28+
29+
expect(screen.queryByText('%')).not.toBeInTheDocument();
30+
});
31+
32+
it('keeps the fallback layout stable', () => {
33+
const { container } = render(<LanguageChart languages={[]} />);
34+
35+
expect(container.firstChild).toBeInTheDocument();
36+
expect(container.textContent).toContain('No language data found');
37+
});
38+
39+
it('does not throw runtime error for empty languages array', () => {
40+
expect(() => render(<LanguageChart languages={[]} />)).not.toThrow();
41+
});
42+
43+
it('returns empty gradient stops for empty language data', () => {
44+
expect(buildGradientStops([])).toBe('');
45+
});
46+
});

0 commit comments

Comments
 (0)