[] = [
{ field: 'id', label: 'Identifier', labelMobile: 'ID' },
{ field: 'name', label: 'Full Name', labelMobile: 'Name' },
];
render(withI18n( ));
// Both desktop and mobile labels should be in the DOM (hidden/shown via CSS)
expect(screen.getAllByText('Identifier').length).toBeGreaterThan(0);
expect(screen.getAllByText('ID').length).toBeGreaterThan(0);
expect(screen.getAllByText('Full Name').length).toBeGreaterThan(0);
expect(screen.getAllByText('Name').length).toBeGreaterThan(0);
});
});
describe('integration with useDataControl', () => {
test('search filters table data', () => {
const SearchableTable = () => {
const controller = useDataControl(mockData);
return (
{
controller.setSearchKeys(['name']);
controller.setSearchQuery(ev.target.value);
}}
/>
);
};
render(withI18n( ));
const searchInput = screen.getByTestId('search-input');
fireEvent.change(searchInput, { target: { value: 'Alpha' } });
// Only Alpha should be visible
expect(screen.getByText('Alpha')).toBeDefined();
expect(screen.queryByText('Beta')).toBeNull();
expect(screen.queryByText('Gamma')).toBeNull();
});
test('external sort control works', () => {
const ExternalSortTable = () => {
const controller = useDataControl(mockData);
return (
controller.setSortedBy('value-desc')}>
Sort by Value Desc
);
};
render(withI18n( ));
fireEvent.click(screen.getByTestId('sort-btn'));
// After sorting by value descending, Epsilon (300) should be first
const rows = screen.getAllByRole('row');
const firstDataRow = rows[1]!;
expect(within(firstDataRow).getByText('Epsilon')).toBeDefined();
});
});
});