import { render, screen, fireEvent } from '@testing-library/react'; import { ThemeProvider } from '../../theme'; import AdminDataTable, { type AdminTableColumn } from './AdminDataTable'; interface Row { id: number; name: string; } const ROWS: Row[] = [ { id: 1, name: 'Alpha' }, { id: 2, name: 'Beta' }, ]; const COLUMNS: AdminTableColumn[] = [ { key: 'id', header: 'ID', render: (r) => r.id }, { key: 'name', header: 'Name', render: (r) => r.name }, ]; describe('', () => { const wrap = (ui: React.ReactNode) => render({ui}); it('renders headers and every row cell', () => { wrap( r.id} />); expect(screen.getByText('ID')).toBeInTheDocument(); expect(screen.getByText('Name')).toBeInTheDocument(); expect(screen.getByText('Alpha')).toBeInTheDocument(); expect(screen.getByText('Beta')).toBeInTheDocument(); }); it('exposes a data-col attribute per column', () => { const { container } = wrap( r.id} />); expect(container.querySelectorAll('[data-col="name"]').length).toBe(2); }); it('calls onRowClick with the clicked row', () => { const onRowClick = jest.fn(); wrap( r.id} onRowClick={onRowClick} />); fireEvent.click(screen.getByText('Beta')); expect(onRowClick).toHaveBeenCalledWith(ROWS[1]); }); it('renders the footer line only when passed', () => { const { rerender, container } = wrap( r.id} />); expect(container.querySelector('p')).not.toBeInTheDocument(); rerender( r.id} footer="Showing 1–2 of 2" /> , ); expect(screen.getByText('Showing 1–2 of 2')).toBeInTheDocument(); }); it('fires onSortChange with the column key when a sortable header is clicked', () => { const onSortChange = jest.fn(); const sortableColumns: AdminTableColumn[] = [ { key: 'id', header: 'ID', render: (r) => r.id, sortable: true }, { key: 'name', header: 'Name', render: (r) => r.name }, ]; wrap( r.id} sort={{ key: 'id', direction: 'asc' }} onSortChange={onSortChange} />, ); fireEvent.click(screen.getByRole('button', { name: /ID/ })); expect(onSortChange).toHaveBeenCalledWith('id'); }); });