veza/apps/web/src/components/ui/virtualized-list.test.tsx

87 lines
2.2 KiB
TypeScript
Raw Normal View History

import { render, screen } from '@testing-library/react';
import { describe, it, expect, vi } from 'vitest';
import { VirtualizedList } from './virtualized-list';
// Mock @tanstack/react-virtual
vi.mock('@tanstack/react-virtual', () => ({
useVirtualizer: () => ({
getVirtualItems: () => [
{ index: 0, key: 0, start: 0, end: 50, size: 50 },
{ index: 1, key: 1, start: 50, end: 100, size: 50 },
],
getTotalSize: () => 150,
measureElement: () => {},
}),
}));
describe('VirtualizedList Component', () => {
const mockItems = [
{ id: '1', name: 'Item 1' },
{ id: '2', name: 'Item 2' },
{ id: '3', name: 'Item 3' },
];
it('renders virtualized list', () => {
render(
<VirtualizedList
items={mockItems}
itemHeight={50}
containerHeight={200}
renderItem={(item) => <div>{item.name}</div>}
/>,
);
expect(screen.getByText('Item 1')).toBeInTheDocument();
expect(screen.getByText('Item 2')).toBeInTheDocument();
});
it('applies custom className', () => {
const { container } = render(
<VirtualizedList
items={mockItems}
itemHeight={50}
containerHeight={200}
renderItem={(item) => <div>{item.name}</div>}
className="custom-class"
/>,
);
expect(container.firstChild).toHaveClass('custom-class');
});
it('calls onScroll when scrolling', () => {
const mockOnScroll = vi.fn();
render(
<VirtualizedList
items={mockItems}
itemHeight={50}
containerHeight={200}
renderItem={(item) => <div>{item.name}</div>}
onScroll={mockOnScroll}
/>,
);
// Scroll event would trigger onScroll
// This is a basic test - actual scroll testing would require more setup
expect(mockOnScroll).toBeDefined();
});
it('calls onItemsRendered when items are rendered', () => {
const mockOnItemsRendered = vi.fn();
render(
<VirtualizedList
items={mockItems}
itemHeight={50}
containerHeight={200}
renderItem={(item) => <div>{item.name}</div>}
onItemsRendered={mockOnItemsRendered}
/>,
);
// onItemsRendered would be called during rendering
expect(mockOnItemsRendered).toBeDefined();
});
});