import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; import { act, fireEvent, screen } from '@testing-library/react'; import { renderWithProviders } from '@/test/helpers/renderWithProviders'; import TooltipPortal from './TooltipPortal'; function Fixture() { return ( <> ); } describe('TooltipPortal open delay', () => { beforeEach(() => vi.useFakeTimers()); afterEach(() => { vi.runOnlyPendingTimers(); vi.useRealTimers(); }); it('shows the tooltip only after the 1s open delay', () => { renderWithProviders(); const btn = screen.getByText('play'); fireEvent.mouseOver(btn); expect(screen.queryByText('Play this album')).toBeNull(); act(() => { vi.advanceTimersByTime(999); }); expect(screen.queryByText('Play this album')).toBeNull(); act(() => { vi.advanceTimersByTime(1); }); expect(screen.getByText('Play this album')).toBeInTheDocument(); }); it('cancels the pending tooltip when the pointer leaves before the delay', () => { renderWithProviders(); const btn = screen.getByText('play'); fireEvent.mouseOver(btn); act(() => { vi.advanceTimersByTime(500); }); fireEvent.mouseOut(btn, { relatedTarget: document.body }); act(() => { vi.advanceTimersByTime(1000); }); expect(screen.queryByText('Play this album')).toBeNull(); }); it('hides immediately on mousedown', () => { renderWithProviders(); const btn = screen.getByText('play'); fireEvent.mouseOver(btn); act(() => { vi.advanceTimersByTime(1000); }); expect(screen.getByText('Play this album')).toBeInTheDocument(); fireEvent.mouseDown(btn); expect(screen.queryByText('Play this album')).toBeNull(); }); it('shows immediately on click when data-tooltip-click is set', () => { renderWithProviders( <> , ); const btn = screen.getByText('info'); fireEvent.click(btn); expect(screen.getByText('Server version')).toBeInTheDocument(); }); it('does not hide click-mode tooltips on mousedown', () => { renderWithProviders( <> , ); const btn = screen.getByText('info'); fireEvent.click(btn); expect(screen.getByText('Server version')).toBeInTheDocument(); fireEvent.mouseDown(btn); expect(screen.getByText('Server version')).toBeInTheDocument(); }); it('toggles off when the click anchor is clicked again', () => { renderWithProviders( <> , ); const btn = screen.getByText('info'); fireEvent.click(btn); expect(screen.getByText('Server version')).toBeInTheDocument(); fireEvent.click(btn); expect(screen.queryByText('Server version')).toBeNull(); }); it('keeps click-opened tooltips visible after mouseout', () => { renderWithProviders( <> , ); const btn = screen.getByText('info'); fireEvent.click(btn); expect(screen.getByText('Server version')).toBeInTheDocument(); fireEvent.mouseOut(btn, { relatedTarget: document.body }); expect(screen.getByText('Server version')).toBeInTheDocument(); }); });