import { render, screen, fireEvent } from '@testing-library/react'; import { DataTrail } from './DataTrail'; import { DataTrailsBookmarks } from './DataTrailBookmarks'; import { getTrailStore, DataTrailBookmark } from './TrailStore/TrailStore'; jest.mock('./TrailStore/TrailStore', () => ({ getTrailStore: jest.fn(), getBookmarkKey: jest.fn(() => 'bookmark-key'), })); const onSelect = jest.fn(); const onDelete = jest.fn(); describe('DataTrailsBookmarks', () => { const trail = new DataTrail({}); const bookmark: DataTrailBookmark = { urlValues: { key: '1', metric: '' }, createdAt: Date.now() }; beforeEach(() => { onSelect.mockClear(); (getTrailStore as jest.Mock).mockImplementation(() => ({ bookmarks: [], recent: [], getTrailForBookmark: jest.fn(), })); }); it('does not render if there are no bookmarks', () => { render(); expect(screen.queryByText('Or view bookmarks')).not.toBeInTheDocument(); }); it('renders the bookmarks header and toggle button', () => { (getTrailStore as jest.Mock).mockImplementation(() => ({ bookmarks: [bookmark], recent: [], })); render(); expect(screen.getByText('Or view bookmarks')).toBeInTheDocument(); expect(screen.getByLabelText('bookmarkCarrot')).toBeInTheDocument(); }); it('toggles the bookmark list when the toggle button is clicked', () => { (getTrailStore as jest.Mock).mockImplementation(() => ({ bookmarks: [bookmark], recent: [], getTrailForBookmark: jest.fn().mockReturnValue(trail), })); render(); const button = screen.getByLabelText('bookmarkCarrot'); fireEvent.click(button); expect(screen.getByText('All metrics')).toBeInTheDocument(); fireEvent.click(button); expect(screen.queryByText('All metrics')).not.toBeInTheDocument(); }); it('calls onDelete when the delete button is clicked', () => { (getTrailStore as jest.Mock).mockImplementation(() => ({ bookmarks: [bookmark], recent: [], getTrailForBookmark: jest.fn().mockReturnValue(trail), })); render(); fireEvent.click(screen.getByLabelText('bookmarkCarrot')); fireEvent.click(screen.getByLabelText('Remove bookmark')); expect(onDelete).toHaveBeenCalled(); }); });