import {render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrary';
import {Tooltip} from 'sentry/components/tooltip';
describe('Tooltip', function () {
function mockOverflow(width: number, containerWidth: number) {
Object.defineProperty(HTMLElement.prototype, 'scrollWidth', {
configurable: true,
value: width,
});
Object.defineProperty(HTMLElement.prototype, 'clientWidth', {
configurable: true,
value: containerWidth,
});
}
afterEach(() => {
// @ts-expect-error
delete HTMLElement.prototype.scrollWidth;
// @ts-expect-error
delete HTMLElement.prototype.clientWidth;
});
beforeEach(() => {
jest.clearAllMocks();
});
it('renders', function () {
render(
My Button
);
});
it('updates title', async function () {
const {rerender} = render(
My Button
);
// Change title
rerender(
My Button
);
await userEvent.hover(screen.getByText('My Button'));
expect(screen.getByText('bar')).toBeInTheDocument();
await userEvent.unhover(screen.getByText('My Button'));
await waitFor(() => {
expect(screen.queryByText('bar')).not.toBeInTheDocument();
});
});
it('disables and does not render', async function () {
render(
My Button
);
await userEvent.hover(screen.getByText('My Button'));
expect(screen.queryByText('test')).not.toBeInTheDocument();
await userEvent.unhover(screen.getByText('My Button'));
});
it('resets visibility when becoming disabled', async function () {
const {rerender} = render(
My Button
);
await userEvent.hover(screen.getByText('My Button'));
expect(screen.getByText('test')).toBeInTheDocument();
rerender(
My Button
);
expect(screen.queryByText('test')).not.toBeInTheDocument();
// Becomes enabled again
rerender(
My Button
);
expect(screen.queryByText('test')).not.toBeInTheDocument();
});
it('does not render an empty tooltip', async function () {
render(
My Button
);
await userEvent.hover(screen.getByText('My Button'));
expect(screen.getByText('My Button')).not.toHaveAttribute('aria-describedby');
await userEvent.unhover(screen.getByText('My Button'));
});
it('displays a tooltip if the content overflows with showOnlyOnOverflow', async function () {
// Mock this to return true because scrollWidth and clientWidth are 0 in JSDOM
mockOverflow(100, 50);
render(
This text overflows
);
await userEvent.hover(screen.getByText('This text overflows'));
expect(screen.getByText('test')).toBeInTheDocument();
await userEvent.unhover(screen.getByText('This text overflows'));
});
it('does not display a tooltip if the content does not overflow with showOnlyOnOverflow', async function () {
mockOverflow(50, 100);
render(
This text does not overflow
);
await userEvent.hover(screen.getByText('This text does not overflow'));
expect(screen.queryByText('test')).not.toBeInTheDocument();
});
});