| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365 | import { clear } from 'jest-date-mock';import * as _ from 'lodash';import Tooltip from '../index';import Button from '../../button';import Select from '../../select';import { BASE_CLASS_PREFIX } from '../../../semi-foundation/base/constants';import { strings } from '../../../semi-foundation/tooltip/constants';import { genAfterEach, genBeforeEach, mount, sleep } from '../../_test_/utils';describe(`Tooltip`, () => {    beforeEach(() => {        clear();        genBeforeEach()();    });    afterEach(genAfterEach());    it(`test appearance`, async () => {        const containerId = `container`;        const scrollItemId = `scroll-item`;        const scrollContainerId = `scroll-container`;        const triggerId = `trigger`;        const demo = mount(            <div                style={{                    height: 320,                    width: 320,                    display: 'inline-block',                    overflow: 'auto',                    padding: 50,                    marginTop: 100,                }}                id={scrollContainerId}            >                <div style={{ height: 480, width: 320 }} id={scrollItemId}>                    <div id={containerId}></div>                    <Tooltip                        motion={false}                        content={'Content'}                        visible={true}                        trigger={'click'}                        getPopupContainer={() => document.getElementById(containerId)}                    >                        <Button id={triggerId}>Click here</Button>                    </Tooltip>                </div>            </div>        );        const elem = demo.find(Tooltip);        const tooltipOuter = document.querySelector(`.${BASE_CLASS_PREFIX}-portal-inner`);        // check if rendered        expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-tooltip-wrapper`).length).toBe(1);        // scroll        await sleep(100);        const deltaY = 50;        const scrollContainer = demo.find(`#${scrollContainerId}`);        const oldTop = window.getComputedStyle(tooltipOuter).top;        scrollContainer.getDOMNode().scrollTop += deltaY;        scrollContainer.simulate('scroll');        await sleep(100);        const curTop = window.getComputedStyle(tooltipOuter).top;        expect(oldTop).toBe(curTop);        // click inside        document.querySelector(`.${BASE_CLASS_PREFIX}-tooltip-wrapper`).click();        await sleep(100);        expect(elem.state(`visible`)).toBe(true);        // click outside        // document.body.click();        document.dispatchEvent(new Event('mousedown', { bubbles: true, cancelable: true }));        // demo.find(`#${triggerId}`)        //     .at(0)        //     .simulate(`mouseDown`);        await sleep(100);        expect(elem.state('visible')).toBe(false);        // click button to show tooltip        document.getElementById(triggerId).click();        await sleep(100);        expect(elem.state('visible')).toBe(true);        // unmount elem        demo.unmount();        await sleep(100);        // document.body.click();        document.dispatchEvent(new Event('mousedown', { bubbles: true, cancelable: true }));        expect(document.getElementsByClassName(`${BASE_CLASS_PREFIX}-tooltip-wrapper`).length).toBe(0);    });    test(`test appearance with motion`, async () => {        const containerId = 'container';        const scrollItemId = `scroll-item`;        const scrollContainerId = `scroll-container`;        const triggerId = `trigger`;        const refObj = { current: null };        const refFn = sinon.spy();        const demo = mount(            <div style={{ height: 2000 }}>                <div                    style={{                        height: 320,                        width: 320,                        display: 'inline-block',                        overflow: 'auto',                        padding: 50,                        marginTop: 100,                    }}                    id={scrollContainerId}                >                    <div style={{ height: 480, width: 320 }} id={scrollItemId}>                        <div id={containerId}></div>                        <Tooltip                            motion={true}                            showArrow={true}                            content={'Content'}                            visible={true}                            trigger={'click'}                            getPopupContainer={() => document.getElementById(containerId)}                        >                            <Button ref={refObj} id={triggerId}>                                Click here                            </Button>                        </Tooltip>                        {/* <Tooltip                            disabled={true}                            motion={true}                            showArrow={true}                            content={'Content'}                            visible={true}                            trigger={'click'}                            getPopupContainer={() => document.getElementById(containerId)}                        >                            <Button disabled block>                                Click here                            </Button>                        </Tooltip> */}                        <Tooltip                            motion={true}                            showArrow={true}                            content={'Content'}                            visible={true}                            trigger={'click'}                            // getPopupContainer={() => document.getElementById(containerId)}                            wrapWhenSpecial={false}                        >                            <Button ref={refFn}>Click here</Button>                        </Tooltip>                    </div>                </div>            </div>        );        await sleep(100);        const portalInners = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-portal-inner`);        expect(portalInners.length).toBe(2);        expect(refObj.current).not.toBeNull();        expect(refFn.called).toBeTruthy();        // click outside        // document.body.click();        document.dispatchEvent(new Event('mousedown', { bubbles: true, cancelable: true }));        await sleep(100);        expect(            demo                .find(Tooltip)                .map(el => el.state('visible'))                .reduce((count, v) => (v ? count + 1 : count), 0)        ).toBe(0);    });    test(`test special appearance`, async () => {        const containerId = 'container';        const scrollItemId = `scroll-item`;        const scrollContainerId = `scroll-container`;        const demo = mount(            <div style={{ height: 2000 }}>                <div                    style={{                        height: 320,                        width: 320,                        display: 'inline-block',                        overflow: 'auto',                        padding: 50,                        marginTop: 100,                    }}                    id={scrollContainerId}                >                    <div style={{ height: 480, width: 320 }} id={scrollItemId}>                        <div id={containerId}></div>                        <Tooltip motion={true} showArrow={true} content={'Content'} visible={true} trigger={'click'}>                            <span style={{ display: 'block' }}>Click here</span>                        </Tooltip>                        <Tooltip motion={true} showArrow={true} content={'Content'} visible={true} trigger={'click'}>                            <Button block>Click here</Button>                        </Tooltip>                        <Tooltip motion={true} showArrow={true} content={'Content'} visible={true} trigger={'click'}>                            Click Me                        </Tooltip>                    </div>                </div>            </div>        );        await sleep(100);        expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-portal-inner`).length).toBe(3);        // expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-icons-triangle_arrow`).length).toBe(3);    });    test(`test events`, async () => {        const close = sinon.spy(() => {            demo.setProps({ visible: false });        });        const demo = mount(            <Tooltip                motion={true}                showArrow={true}                content={                    <article>                        <Button onClick={close} />                    </article>                }                visible={true}                trigger={'click'}            >                <span style={{ display: 'block' }}>Click here</span>            </Tooltip>        );        await sleep(100);        expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-portal-inner`).length).toBe(1);        document.querySelector(`.${BASE_CLASS_PREFIX}-portal-inner .${BASE_CLASS_PREFIX}-button`).click();        await sleep(100);        expect(demo.state('visible')).toBe(false);    });    test(`vertical position: `, async () => {        const close = sinon.spy(() => {            demo.setProps({ visible: false });        });        const demo = mount(            <Tooltip                position="left"                motion={true}                showArrow={true}                content={                    <article>                        <Button onClick={close} />                    </article>                }                visible={true}                trigger={'click'}                motion={() => false}            >                <span style={{ display: 'block' }}>Click here</span>            </Tooltip>        );        await sleep(100);        expect(document.querySelector(`.${BASE_CLASS_PREFIX}-portal-inner svg path`).getAttribute('d')).toBe('M0 0L1 0C1 4, 2 5.5, 4 7.5S7,10 7,12S6 14.5, 4 16.5S1,20 1,24L0 24L0 0z');    });    test(`test position: `, async () => {        const positionList = strings.POSITION_SET        for (const position of positionList) {            const demo = mount(                <Tooltip                    position={position}                    content={                        <article>                            1                        </article>                    }                    visible={true}                >                    <span style={{ display: 'block' }}>Click here</span>                </Tooltip>            );            await sleep(100);            expect(document.querySelector(`.${BASE_CLASS_PREFIX}-tooltip-wrapper`).getAttribute('x-placement')).toBe(position);        }    });  it(`test click outside handler`, async () => {    const containerId = `container`;    const demo = mount(      <div style={{ height: 480, width: 320 }}>        <div id={containerId}>Hello Semi</div>        <Tooltip          content='Content'          trigger='click'        >          <Button >Click here</Button>        </Tooltip>      </div>    );    const toolTipElem = demo.find(Tooltip);    const buttonElem = demo.find(Button);    // click inside    buttonElem.simulate('click');    toolTipElem.update();    await sleep(100);    expect(toolTipElem.state(`visible`)).toBe(true);    // click outside    // document.body.click();    document.dispatchEvent(new Event('mousedown', { bubbles: true, cancelable: true }));    toolTipElem.update();    await sleep(100);    expect(toolTipElem.state('visible')).toBe(false);    // click button to show tooltip    buttonElem.simulate('click');    toolTipElem.update();    await sleep(100);    expect(toolTipElem.state('visible')).toBe(true);    document.getElementById(containerId).dispatchEvent(new Event('mousedown', { bubbles: true, cancelable: true }));    toolTipElem.update();    await sleep(100);    expect(toolTipElem.state('visible')).toBe(false);  });});it('wrapperClassName', () => {    const wrapperWithMultipleChildren = mount(        <Tooltip wrapperClassName='test' content={'hi bytedance'}>            <Button>正常的多个按钮</Button>            <Button>正常的多个按钮</Button>        </Tooltip>    );    expect(wrapperWithMultipleChildren.exists('.test')).toEqual(true);    const wrapperWithDisabledButton = mount(        <Tooltip wrapperClassName='test' content={'hi bytedance'}>            <Button disabled>正常的多个按钮</Button>        </Tooltip>    );    expect(wrapperWithDisabledButton.exists('.test')).toEqual(true);    const wrapperWithDisabledSelect = mount(        <Tooltip wrapperClassName='test' content={'hi bytedance'}>            <Select disabled placeholder='请选择业务线' style={{ width: 120 }}>                <Select.Option value='abc'>抖音</Select.Option>                <Select.Option value='hotsoon'>火山</Select.Option>                <Select.Option value='jianying' disabled>剪映</Select.Option>                <Select.Option value='xigua'>西瓜视频</Select.Option>            </Select>        </Tooltip>    );    expect(wrapperWithDisabledSelect.exists('.test')).toEqual(true);});
 |