import React from 'react'; import { act } from 'react-dom/test-utils'; import type { ArgsProps, MessageType } from '..'; import message, { getInstance } from '..'; import ConfigProvider from '../../config-provider'; import { render, fireEvent, pureRender } from '../../../tests/utils'; describe('message.hooks', () => { beforeAll(() => { jest.useFakeTimers(); }); afterAll(() => { jest.useRealTimers(); }); afterEach(() => { message.destroy(); }); it('should work', () => { const Context = React.createContext('light'); const Demo: React.FC = () => { const [api, holder] = message.useMessage(); return ( {holder} ); }; const { container } = render(); fireEvent.click(container.querySelector('button')!); expect(document.querySelectorAll('.my-test-message-notice').length).toBe(1); expect(document.querySelector('.hook-test-result')?.innerHTML).toEqual('bamboo'); }); it('should work with success', () => { const Context = React.createContext('light'); const Demo: React.FC = () => { const [api, holder] = message.useMessage(); return ( {holder} ); }; const { container } = render(); fireEvent.click(container.querySelector('button')!); expect(document.querySelectorAll('.my-test-message-notice').length).toBe(1); expect(document.querySelectorAll('.anticon-check-circle').length).toBe(1); expect(document.querySelector('.hook-test-result')?.innerHTML).toEqual('bamboo'); }); it('should work with onClose', done => { // if not use real timer, done won't be called jest.useRealTimers(); const Demo: React.FC = () => { const [api, holder] = message.useMessage(); return ( <> {holder} ); }; const { container } = render(); fireEvent.click(container.querySelector('button')!); jest.useFakeTimers(); }); it('should work with close promise', done => { // if not use real timer, done won't be called jest.useRealTimers(); const Demo: React.FC = () => { const [api, holder] = message.useMessage(); return ( <> {holder} ); }; const { container } = render(); fireEvent.click(container.querySelector('button')!); jest.useFakeTimers(); }); it('should work with hide', () => { let hide: MessageType; const Demo: React.FC = () => { const [api, holder] = message.useMessage(); return ( {holder} ); }; const { container } = render(); fireEvent.click(container.querySelector('button')!); act(() => { jest.runAllTimers(); }); expect(document.querySelectorAll('.my-test-message-notice').length).toBe(1); act(() => { hide(); jest.runAllTimers(); }); expect(getInstance()?.component.state.notices).toHaveLength(0); }); it('should be same hook', () => { let count = 0; const Demo: React.FC = () => { const [, forceUpdate] = React.useState([]); const [api] = message.useMessage(); React.useEffect(() => { count += 1; expect(count).toEqual(1); forceUpdate([]); }, [api]); return null; }; pureRender(); }); it("should use ConfigProvider's getPopupContainer as message container", () => { const containerId = 'container'; const getPopupContainer = () => { const div = document.createElement('div'); div.id = containerId; document.body.appendChild(div); return div; }; const Demo: React.FC = () => { const [api, holder] = message.useMessage(); return ( {holder} ); }; const { container, baseElement } = render(); fireEvent.click(container.querySelector('button')!); expect(document.querySelectorAll('.my-test-message-notice').length).toBe(1); expect(document.querySelectorAll('.anticon-check-circle').length).toBe(1); expect(document.querySelector('.hook-content')?.innerHTML).toEqual('happy'); expect(document.querySelectorAll(`#${containerId}`).length).toBe(1); expect(baseElement.querySelectorAll(`#${containerId}`).length).toBe(1); }); });