import React from 'react'; import { spyElementPrototype } from 'rc-util/lib/test/domHook'; import Tooltip from '..'; import Button from '../../button'; import Switch from '../../switch'; import DatePicker from '../../date-picker'; import Input from '../../input'; import Group from '../../input/Group'; import { sleep, render, fireEvent, waitFor } from '../../../tests/utils'; import mountTest from '../../../tests/shared/mountTest'; import rtlTest from '../../../tests/shared/rtlTest'; describe('Tooltip', () => { mountTest(Tooltip); rtlTest(Tooltip); beforeAll(() => { spyElementPrototype(HTMLElement, 'offsetParent', { get: () => ({}), }); }); it('check `onVisibleChange` arguments', () => { const onVisibleChange = jest.fn(); const ref = React.createRef(); const { container, rerender } = render(
Hello world!
, ); // `title` is empty. const divElement = container.querySelector('#hello'); fireEvent.mouseEnter(divElement); expect(onVisibleChange).not.toHaveBeenCalled(); expect(ref.current.props.visible).toBe(false); fireEvent.mouseLeave(divElement); expect(onVisibleChange).not.toHaveBeenCalled(); expect(ref.current.props.visible).toBe(false); // update `title` value. rerender(
Hello world!
, ); fireEvent.mouseEnter(divElement); expect(onVisibleChange).toHaveBeenLastCalledWith(true); expect(ref.current.props.visible).toBe(true); fireEvent.mouseLeave(divElement); expect(onVisibleChange).toHaveBeenLastCalledWith(false); expect(ref.current.props.visible).toBe(false); // add `visible` props. rerender(
Hello world!
, ); fireEvent.mouseEnter(divElement); expect(onVisibleChange).toHaveBeenLastCalledWith(true); const lastCount = onVisibleChange.mock.calls.length; expect(ref.current.props.visible).toBe(false); // always trigger onVisibleChange fireEvent.mouseLeave(divElement); expect(onVisibleChange.mock.calls.length).toBe(lastCount); // no change with lastCount expect(ref.current.props.visible).toBe(false); }); it('should hide when mouse leave native disabled button', () => { const onVisibleChange = jest.fn(); const ref = React.createRef(); const { container } = render( , ); expect(container.getElementsByTagName('span')).toHaveLength(1); const button = container.getElementsByTagName('span')[0]; fireEvent.mouseEnter(button); expect(onVisibleChange).toHaveBeenCalledWith(true); expect(ref.current.props.visible).toBe(true); fireEvent.mouseLeave(button); expect(onVisibleChange).toHaveBeenCalledWith(false); expect(ref.current.props.visible).toBe(false); }); describe('should hide when mouse leave antd disabled component', () => { function testComponent(name, Component) { it(name, () => { const onVisibleChange = jest.fn(); const ref = React.createRef(); const { container } = render( , ); expect(container.children[0]).toMatchSnapshot(); const button = container.getElementsByTagName('span')[0]; fireEvent.mouseEnter(button); expect(onVisibleChange).toHaveBeenCalledWith(true); expect(ref.current.props.visible).toBe(true); fireEvent.mouseLeave(button); expect(onVisibleChange).toHaveBeenCalledWith(false); expect(ref.current.props.visible).toBe(false); }); } testComponent('Button', Button); testComponent('Switch', Switch); }); it('should render disabled Button style properly', () => { const { container: containerInline } = render( , ); const { container: containerBlock } = render( , ); expect(containerInline.getElementsByTagName('span')[0].style.display).toBe('inline-block'); expect(containerBlock.getElementsByTagName('span')[0].style.display).toBe('block'); }); it('should works for arrowPointAtCenter', () => { const arrowWidth = 5; const horizontalArrowShift = 16; const triggerWidth = 200; const suit = () => { const ref1 = React.createRef(); const ref2 = React.createRef(); const { container } = render( , ); fireEvent.click(container.getElementsByTagName('button')[0]); const popupLeftDefault = parseInt(ref1.current.getPopupDomNode().style.left, 10); const { container: container2 } = render( , ); fireEvent.click(container2.getElementsByTagName('button')[0]); const popupLeftArrowPointAtCenter = parseInt(ref2.current.getPopupDomNode().style.left, 10); expect(popupLeftArrowPointAtCenter - popupLeftDefault).toBe( triggerWidth / 2 - horizontalArrowShift - arrowWidth, ); }; jest.dontMock('rc-trigger', suit); }); it('should works for date picker', async () => { const onVisibleChange = jest.fn(); const ref = React.createRef(); const { container } = render( , ); expect(container.getElementsByClassName('ant-picker')).toHaveLength(1); const picker = container.getElementsByClassName('ant-picker')[0]; fireEvent.mouseEnter(picker); await sleep(100); expect(onVisibleChange).toHaveBeenCalledWith(true); expect(ref.current.props.visible).toBe(true); fireEvent.mouseLeave(picker); await sleep(100); expect(onVisibleChange).toHaveBeenCalledWith(false); expect(ref.current.props.visible).toBe(false); }); it('should works for input group', async () => { const onVisibleChange = jest.fn(); const ref = React.createRef(); const { container } = render( , ); expect(container.getElementsByClassName('ant-input-group')).toHaveLength(1); const inputGroup = container.getElementsByClassName('ant-input-group')[0]; fireEvent.mouseEnter(inputGroup); await sleep(100); expect(onVisibleChange).toHaveBeenCalledWith(true); expect(ref.current.props.visible).toBe(true); fireEvent.mouseLeave(inputGroup); await sleep(100); expect(onVisibleChange).toHaveBeenCalledWith(false); expect(ref.current.props.visible).toBe(false); }); // https://github.com/ant-design/ant-design/issues/20891 it('should display zero', () => { const { container } = render(
, ); expect(container.querySelector('.ant-tooltip-inner').innerHTML).toBe('0'); }); it('autoAdjustOverflow should be object or undefined', () => { expect(() => { render(
, ); }).not.toThrow(); expect(() => { render(
, ); }).not.toThrow(); }); it('support other placement', done => { const ref = React.createRef(); const { container } = render( { if (visible) { await sleep(500); // FIXME: // await waitFor(() => { // expect(document.querySelector('.ant-tooltip-placement-bottomLeft')).not.toBeNull(); // }); } done(); }} > Hello world! , ); expect(container.getElementsByTagName('span')).toHaveLength(1); const button = container.getElementsByTagName('span')[0]; fireEvent.mouseEnter(button); }); it('other placement when mouse enter', async () => { const { container } = render( Hello world! , ); expect(container.getElementsByTagName('span')).toHaveLength(1); const element = container.getElementsByTagName('span')[0]; fireEvent.mouseEnter(element); await sleep(500); await waitFor(() => { expect(document.querySelector('.ant-tooltip-placement-topRight')).not.toBeNull(); }); }); it('should works for mismatch placement', async () => { const ref = React.createRef(); const { container } = render( Hello world! , ); const button = container.getElementsByTagName('span')[0]; fireEvent.mouseEnter(button); await sleep(600); expect(ref.current.getPopupDomNode().className).toContain('ant-tooltip'); }); it('should pass overlayInnerStyle through to the inner component', () => { const { container } = render(
, ); expect(container.querySelector('.ant-tooltip-inner').style.color).toBe('red'); }); it('should work with loading switch', () => { const onVisibleChange = jest.fn(); const { container } = render( , ); const wrapperEl = container.querySelectorAll('.ant-tooltip-disabled-compatible-wrapper'); expect(wrapperEl).toHaveLength(1); fireEvent.mouseEnter(container.getElementsByTagName('span')[0]); expect(onVisibleChange).toHaveBeenLastCalledWith(true); }); });