import { render, screen, fireEvent } from '@testing-library/react'; import { DataTrail } from './DataTrail'; import { DataTrailCard } from './DataTrailCard'; import { DataTrailBookmark } from './TrailStore/TrailStore'; jest.mock('./utils', () => ({ ...jest.requireActual('./utils'), })); describe('DataTrailCard', () => { // trail is a recent metric exploration const trail = new DataTrail({ key: '1', metric: 'Test Recent Exploration' }); // bookmark is a data trail stored in a url const bookmark: DataTrailBookmark = { urlValues: { key: '1', metric: 'Test Bookmark' }, createdAt: Date.now() }; const onSelect = jest.fn(); const onDelete = jest.fn(); beforeEach(() => { onSelect.mockClear(); onDelete.mockClear(); }); it('renders the card with recent metric exploration', () => { render(); expect(screen.getByText('Test Recent Exploration')).toBeInTheDocument(); }); it('renders the card with bookmark', () => { render(); expect(screen.getByText('Test Bookmark')).toBeInTheDocument(); }); it('calls onSelect when the card is clicked', () => { render(); fireEvent.click(screen.getByText('Test Bookmark')); expect(onSelect).toHaveBeenCalled(); }); it('calls onDelete when the delete button is clicked', () => { render(); fireEvent.click(screen.getByTestId('deleteButton')); expect(onDelete).toHaveBeenCalled(); }); it('truncates singular long label in recent explorations', () => { const longLabel = 'aajalsdkfaldkjfalskdjfalsdkjfalsdkjflaskjdflaskjdflaskjdflaskjdflasjkdflaskjdflaskjdflaskjflaskdjfldaskjflasjflaskdjflaskjflasjflaskfjalsdfjlskdjflaskjdflajkfjfalkdfjaverylongalskdjlalsjflajkfklsajdfalskjdflkasjdflkadjf'; const bookmarkWithLongLabel: DataTrailBookmark = { urlValues: { key: '1', metric: 'metric', 'var-filters': `zone|=|${longLabel}` }, createdAt: Date.now(), }; render(); expect(screen.getByText('...', { exact: false })).toBeInTheDocument(); }); it('truncates long list of labels after 2 lines in recent explorations', () => { const bookmarkWithLongLabel: DataTrailBookmark = { urlValues: { key: '1', metric: 'metric', // labels are in a comma separated list 'var-filters': `zone|=|averylonglabeltotakeupspace,zone1=averylonglabeltotakeupspace,zone2=averylonglabeltotakeupspace,zone3=averylonglabeltotakeupspace,zone4=averylonglabeltotakeupspace`, }, createdAt: Date.now(), }; render(); // to test the non-existence of a truncated label we need queryByText const truncatedLabel = screen.queryByText('zone3'); expect(truncatedLabel).not.toBeInTheDocument(); }); });