import * as React from 'react'; import { act, render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { Tooltip, TooltipProps } from './Tooltip'; const mockOnShow = jest.fn(); const mockOnHide = jest.fn(); const contentText = 'Tooltip content'; // eslint-disable-next-line react/jsx-no-useless-fragment const content = <>{contentText}; const triggerText = 'Tooltip trigger'; const trigger =
{triggerText}
; const renderTooltip = (props?: TooltipProps) => { return render( {trigger} ); }; describe('Tooltip', () => { afterEach(() => { jest.resetAllMocks(); }); test('renders correctly', () => { renderTooltip(); expect(screen.getByText(triggerText)).toBeInTheDocument(); }); test('renders popper correctly on hover', async () => { renderTooltip(); act(() => { userEvent.hover(screen.getByText(triggerText)); }); expect(screen.getByText(contentText)).toBeInTheDocument(); act(() => { userEvent.unhover(screen.getByText(triggerText)); }); expect(screen.queryByText(contentText)).not.toBeInTheDocument(); }); test("doesn't render popper when hideTooltip is true", () => { const { unmount } = renderTooltip({ hideTooltip: true }); act(() => { userEvent.hover(screen.getByText(triggerText)); }); expect(screen.queryByText(contentText)).not.toBeInTheDocument(); unmount(); renderTooltip({ hideTooltip: true, forceShow: true }); act(() => { userEvent.hover(screen.getByText(triggerText)); }); expect(screen.queryByText(contentText)).not.toBeInTheDocument(); }); test('shows the tooltip on click instead of hover when useClickInsteadOfHover is true', async () => { renderTooltip({ useClickInsteadOfHover: true }); act(() => { userEvent.hover(screen.getByText(triggerText)); }); expect(screen.queryByText(contentText)).not.toBeInTheDocument(); act(() => { userEvent.unhover(screen.getByText(triggerText)); }); act(() => { userEvent.click(screen.getByText(triggerText)); }); expect(screen.getByText(contentText)).toBeInTheDocument(); act(() => { userEvent.click(screen.getByText(triggerText)); }); expect(screen.queryByText(contentText)).not.toBeInTheDocument(); }); test('renders popper correctly immediately when forceShow is true', async () => { const { unmount } = renderTooltip({ forceShow: true }); expect(screen.getByText(contentText)).toBeInTheDocument(); unmount(); }); test('calls onHide and onShow at appropriate times', async () => { renderTooltip({ onHide: mockOnHide, onShow: mockOnShow }); act(() => { userEvent.hover(screen.getByText(triggerText)); }); expect(screen.getByText(contentText)).toBeInTheDocument(); expect(mockOnShow).toHaveBeenCalledTimes(1); expect(mockOnHide).not.toHaveBeenCalled(); act(() => { userEvent.unhover(screen.getByText(triggerText)); }); expect(screen.queryByText(contentText)).not.toBeInTheDocument(); expect(mockOnShow).toHaveBeenCalledTimes(1); expect(mockOnHide).toHaveBeenCalledTimes(1); }); });