import React from 'react'; import { mount } from 'enzyme'; import { spyElementPrototype } from 'rc-util/lib/test/domHook'; import { fireEvent, render } from '@testing-library/react'; 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 } 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 wrapper = mount( , ); expect(wrapper.find('span')).toHaveLength(1); const button = wrapper.find('span').at(0); button.simulate('mouseenter'); expect(onVisibleChange).toHaveBeenCalledWith(true); expect(ref.current.props.visible).toBe(true); button.simulate('mouseleave'); 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 wrapper = mount( , ); expect(wrapper.render()).toMatchSnapshot(); const button = wrapper.find('span').at(0); button.simulate('mouseenter'); expect(onVisibleChange).toHaveBeenCalledWith(true); expect(ref.current.props.visible).toBe(true); button.simulate('mouseleave'); 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 wrapper1 = mount( , ); const wrapper2 = mount( , ); expect(wrapper1.find('span').first().getDOMNode().style.display).toBe('inline-block'); expect(wrapper2.find('span').first().getDOMNode().style.display).toBe('block'); }); it('should works for arrowPointAtCenter', () => { const arrowWidth = 5; const horizontalArrowShift = 16; const triggerWidth = 200; const suit = () => { const wrapper = mount( , ); wrapper.find('button').at(0).simulate('click'); const popupLeftDefault = parseInt(wrapper.instance().getPopupDomNode().style.left, 10); const wrapper2 = mount( , ); wrapper2.find('button').at(0).simulate('click'); const popupLeftArrowPointAtCenter = parseInt( wrapper2.instance().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 wrapper = mount( , ); expect(wrapper.find('.ant-picker')).toHaveLength(1); const picker = wrapper.find('.ant-picker').at(0); picker.simulate('mouseenter'); await sleep(100); expect(onVisibleChange).toHaveBeenCalledWith(true); expect(ref.current.props.visible).toBe(true); picker.simulate('mouseleave'); 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 picker = container.getElementsByClassName('ant-input-group')[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); }); // https://github.com/ant-design/ant-design/issues/20891 it('should display zero', () => { const wrapper = mount(
, ); expect(wrapper.find('.ant-tooltip-inner').getDOMNode().innerHTML).toBe('0'); }); it('autoAdjustOverflow should be object or undefined', () => { expect(() => { mount(
, ); }).not.toThrow(); expect(() => { mount(
, ); }).not.toThrow(); }); it('support other placement', done => { const wrapper = mount( { if (visible) { expect(wrapper.find('Trigger').props().popupPlacement).toBe('bottomLeft'); } done(); }} > Hello world! , ); expect(wrapper.find('span')).toHaveLength(1); const button = wrapper.find('span').at(0); button.simulate('mouseenter'); }); it('other placement when mouse enter', async () => { const ref = React.createRef(); const wrapper = mount( Hello world! , ); expect(wrapper.find('span')).toHaveLength(1); const button = wrapper.find('span').at(0); button.simulate('mouseenter'); await sleep(500); expect(ref.current.getPopupDomNode().className).toContain('placement-topRight'); }); it('should works for mismatch placement', async () => { const ref = React.createRef(); const wrapper = mount( Hello world! , ); const button = wrapper.find('span').at(0); button.simulate('mouseenter'); await sleep(600); expect(ref.current.getPopupDomNode().className).toContain('ant-tooltip'); }); it('should pass overlayInnerStyle through to the inner component', () => { const wrapper = mount(
, ); expect(wrapper.find('.ant-tooltip-inner').getDOMNode().style.color).toBe('red'); }); it('should work with loading switch', () => { const onVisibleChange = jest.fn(); const wrapper = mount( , ); const wrapperEl = wrapper.find('.ant-tooltip-disabled-compatible-wrapper'); expect(wrapperEl).toHaveLength(1); wrapper.find('span').first().simulate('mouseenter'); expect(onVisibleChange).toHaveBeenLastCalledWith(true); }); });