import * as React from 'react';
import {act, render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
import {Hovercard, HOVERCARD_PORTAL_ID} from 'sentry/components/hovercard';
describe('Hovercard', () => {
beforeEach(() => {
jest.useFakeTimers();
jest.clearAllMocks();
});
afterEach(() => {
jest.useRealTimers();
});
it('reuses portal', () => {
render(
Hovercard Trigger
Hovercard Trigger
);
// eslint-disable-next-line
expect(document.querySelectorAll(`#${HOVERCARD_PORTAL_ID}`)).toHaveLength(1);
});
it('Displays card', async () => {
render(
Hovercard Trigger
);
userEvent.hover(screen.getByText('Hovercard Trigger'));
expect(await screen.findByText(/Hovercard Body/)).toBeInTheDocument();
expect(await screen.findByText(/Hovercard Header/)).toBeInTheDocument();
});
it('Does not display card', () => {
render(
Hovercard Trigger
);
userEvent.hover(screen.getByText('Hovercard Trigger'));
jest.runAllTimers();
expect(screen.queryByText(/Hovercard Body/)).not.toBeInTheDocument();
expect(screen.queryByText(/Hovercard Header/)).not.toBeInTheDocument();
});
it('Always displays card', () => {
render(
Hovercard Trigger
);
expect(screen.getByText(/Hovercard Body/)).toBeInTheDocument();
expect(screen.getByText(/Hovercard Header/)).toBeInTheDocument();
});
it('Respects displayTimeout displays card', async () => {
const DISPLAY_TIMEOUT = 100;
render(
Hovercard Trigger
);
userEvent.hover(screen.getByText('Hovercard Trigger'));
act(() => {
jest.advanceTimersByTime(DISPLAY_TIMEOUT - 1);
});
expect(screen.queryByText(/Hovercard Body/)).not.toBeInTheDocument();
expect(screen.queryByText(/Hovercard Header/)).not.toBeInTheDocument();
expect(await screen.findByText(/Hovercard Body/)).toBeInTheDocument();
expect(await screen.findByText(/Hovercard Header/)).toBeInTheDocument();
});
it('Doesnt leak timeout', () => {
render(
Hovercard Trigger
);
userEvent.hover(screen.getByText('Hovercard Trigger'));
act(() => {
jest.advanceTimersByTime(99);
});
expect(screen.queryByText(/Hovercard Body/)).not.toBeInTheDocument();
expect(screen.queryByText(/Hovercard Header/)).not.toBeInTheDocument();
userEvent.unhover(screen.getByText('Hovercard Trigger'));
act(() => {
jest.advanceTimersByTime(1);
});
expect(screen.queryByText(/Hovercard Body/)).not.toBeInTheDocument();
expect(screen.queryByText(/Hovercard Header/)).not.toBeInTheDocument();
});
});