import { SearchOutlined } from '@ant-design/icons'; import { mount } from 'enzyme'; import { resetWarned } from 'rc-util/lib/warning'; import React, { Component } from 'react'; import { act } from 'react-dom/test-utils'; import Button from '..'; import mountTest from '../../../tests/shared/mountTest'; import rtlTest from '../../../tests/shared/rtlTest'; import { fireEvent, render, sleep } from '../../../tests/utils'; import ConfigProvider from '../../config-provider'; import type { SizeType } from '../../config-provider/SizeContext'; describe('Button', () => { mountTest(Button); mountTest(() => ); expect(container.firstChild).toMatchSnapshot(); }); it('mount correctly', () => { expect(() => render()).not.toThrow(); }); it('warns if size is wrong', () => { resetWarned(); const mockWarn = jest.spyOn(console, 'error').mockImplementation(() => {}); const size = 'who am I' as any as SizeType; render(); expect(mockWarn).toHaveBeenCalledWith('Warning: [antd: Button.Group] Invalid prop `size`.'); mockWarn.mockRestore(); }); it('renders Chinese characters correctly', () => { expect(render().container.firstChild).toMatchSnapshot(); // should not insert space when there is icon expect( render().container.firstChild, ).toMatchSnapshot(); // should not insert space when there is icon expect( render( , ).container.firstChild, ).toMatchSnapshot(); // should not insert space when there is icon expect( render().container.firstChild, ).toMatchSnapshot(); // should not insert space when there is icon while loading expect( render( , ).container.firstChild, ).toMatchSnapshot(); // should insert space while loading expect(render().container.firstChild).toMatchSnapshot(); // should insert space while only one nested element expect( render( , ).container.firstChild, ).toMatchSnapshot(); }); it('renders Chinese characters correctly in HOC', () => { const Text = ({ children }: { children: React.ReactNode }) => {children}; const { container, rerender } = render( , ); expect(container.querySelector('.ant-btn')).toHaveClass('ant-btn-two-chinese-chars'); rerender( , ); expect(container.querySelector('.ant-btn')).not.toHaveClass('ant-btn-two-chinese-chars'); rerender( , ); expect(container.querySelector('.ant-btn')).toHaveClass('ant-btn-two-chinese-chars'); }); // https://github.com/ant-design/ant-design/issues/18118 it('should not insert space to link or text button', () => { const wrapper1 = render(); expect(wrapper1.getByRole('button')).toHaveTextContent('按钮'); wrapper1.unmount(); const wrapper2 = render(); expect(wrapper2.getByRole('button')).toHaveTextContent('按钮'); }); it('should render empty button without errors', () => { const wrapper = render( , ); expect(wrapper.container.firstChild).toMatchSnapshot(); }); it('have static property for type detecting', () => { const wrapper = mount(); expect((wrapper.find(Button).type() as any).__ANT_BUTTON).toBe(true); }); it('should change loading state instantly by default', () => { class DefaultButton extends Component { state = { loading: false, }; enterLoading = () => { this.setState({ loading: true }); }; render() { const { loading } = this.state; return ( ); } } const wrapper = render(); fireEvent.click(wrapper.container.firstChild!); expect(wrapper.container.querySelectorAll('.ant-btn-loading').length).toBe(1); }); it('should change loading state with delay', () => { class DefaultButton extends Component { state = { loading: false, }; enterLoading = () => { this.setState({ loading: { delay: 1000 } }); }; render() { const { loading } = this.state; return ( ); } } const wrapper = render(); fireEvent.click(wrapper.container.firstChild!); expect(wrapper.container.firstChild).not.toHaveClass('ant-btn-loading'); }); it('reset when loading back of delay', () => { jest.useFakeTimers(); const { rerender, container } = render(, ); fireEvent.click(container.firstChild!); expect(onClick).not.toHaveBeenCalledWith(); }); it('should support link button', () => { const wrapper = render( , ); expect(wrapper.container.firstChild).toMatchSnapshot(); }); it('fixbug renders {0} , 0 and {false}', () => { expect(render().container.firstChild).toMatchSnapshot(); expect(render().container.firstChild).toMatchSnapshot(); expect(render().container.firstChild).toMatchSnapshot(); }); it('should not render as link button when href is undefined', async () => { const wrapper = render( , ); expect(wrapper.container.firstChild).toMatchSnapshot(); }); // // https://github.com/ant-design/ant-design/issues/15342 it('should merge text if children using variable', () => { const wrapper = render( , ); expect(wrapper.container.firstChild).toMatchSnapshot(); }); it('should support to change loading', async () => { const { rerender, container, unmount } = render(); rerender( , ); Object.defineProperty(buttonInstance, 'textContent', { get() { throw new Error('Should not called!!!'); }, }); }); it('should not redirect when button is disabled', () => { const onClick = jest.fn(); const { container } = render( , ); fireEvent.click(container.firstChild!); expect(onClick).not.toHaveBeenCalled(); }); it('should match class .ant-btn-disabled when button is disabled and href is not undefined', () => { const wrapper = render( , ); expect(wrapper.container.querySelector('.ant-btn')).toHaveClass('ant-btn-disabled'); }); // https://github.com/ant-design/ant-design/issues/30953 it('should handle fragment as children', () => { const wrapper = render( , ); expect(wrapper.container.firstChild).toMatchSnapshot(); }); });