import React from 'react'; import { render, fireEvent, pureRender } from '../../../tests/utils'; import notification from '..'; import ConfigProvider from '../../config-provider'; describe('notification.hooks', () => { beforeEach(() => { jest.useFakeTimers(); }); afterEach(() => { jest.useRealTimers(); }); it('should work', () => { const Context = React.createContext('light'); const Demo: React.FC = () => { const [api, holder] = notification.useNotification(); return ( {holder} ); }; const { container } = render(); fireEvent.click(container.querySelector('button')!); expect(document.querySelectorAll('.my-test-notification-notice')).toHaveLength(1); expect(document.querySelector('.hook-test-result')!.textContent).toEqual('bamboo'); }); it('should work with success', () => { const Context = React.createContext('light'); const Demo: React.FC = () => { const [api, holder] = notification.useNotification(); return ( {holder} ); }; const { container } = render(); fireEvent.click(container.querySelector('button')!); expect(document.querySelectorAll('.my-test-notification-notice')).toHaveLength(1); expect(document.querySelectorAll('.anticon-check-circle')).toHaveLength(1); expect(document.querySelector('.hook-test-result')!.textContent).toEqual('bamboo'); }); it('should be same hook', () => { let count = 0; const Demo: React.FC = () => { const [, forceUpdate] = React.useState([]); const [api] = notification.useNotification(); React.useEffect(() => { count += 1; expect(count).toEqual(1); forceUpdate([]); }, [api]); return null; }; pureRender(); }); describe('not break in effect', () => { it('basic', () => { const Demo = () => { const [api, holder] = notification.useNotification(); React.useEffect(() => { api.info({ message: null, description:
, }); }, []); return holder; }; render(); expect(document.querySelector('.bamboo')).toBeTruthy(); }); it('warning if user call update in render', () => { const errorSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); const Demo = () => { const [api, holder] = notification.useNotification(); const calledRef = React.useRef(false); if (!calledRef.current) { api.info({ message: null, description:
, }); calledRef.current = true; } return holder; }; render(); expect(document.querySelector('.bamboo')).toBeFalsy(); expect(errorSpy).toHaveBeenCalledWith( 'Warning: [antd: Notification] You are calling notice in render which will break in React 18 concurrent mode. Please trigger in effect instead.', ); errorSpy.mockRestore(); }); }); });