import React, { Component } from 'react'; import { mount, render } from 'enzyme'; import renderer from 'react-test-renderer'; import { SearchOutlined } from '@ant-design/icons'; import Button from '..'; import ConfigProvider from '../../config-provider'; import mountTest from '../../../tests/shared/mountTest'; import rtlTest from '../../../tests/shared/rtlTest'; import { sleep } from '../../../tests/utils'; describe('Button', () => { mountTest(Button); mountTest(() => ).toMatchRenderedSnapshot(); }); it('mount correctly', () => { expect(() => renderer.create()).not.toThrow(); }); it('warns if size is wrong', () => { const mockWarn = jest.fn(); jest.spyOn(console, 'warn').mockImplementation(mockWarn); render(); expect(mockWarn).toHaveBeenCalledTimes(1); expect(mockWarn.mock.calls[0][0]).toMatchObject({ message: 'unreachable case: "who am I"', }); }); it('renders Chinese characters correctly', () => { expect().toMatchRenderedSnapshot(); // should not insert space when there is icon expect().toMatchRenderedSnapshot(); // should not insert space when there is icon expect( , ).toMatchRenderedSnapshot(); // should not insert space when there is icon expect().toMatchRenderedSnapshot(); // should not insert space when there is icon while loading expect( , ).toMatchRenderedSnapshot(); // should insert space while loading expect().toMatchRenderedSnapshot(); // should insert space while only one nested element expect( , ).toMatchRenderedSnapshot(); }); it('renders Chinese characters correctly in HOC', () => { const Text = ({ children }) => {children}; const wrapper = mount( , ); expect(wrapper.find('.ant-btn').hasClass('ant-btn-two-chinese-chars')).toBe(true); wrapper.setProps({ children: 大按钮, }); wrapper.update(); expect(wrapper.find('.ant-btn').hasClass('ant-btn-two-chinese-chars')).toBe(false); wrapper.setProps({ children: 按钮, }); wrapper.update(); expect(wrapper.find('.ant-btn').hasClass('ant-btn-two-chinese-chars')).toBe(true); }); // https://github.com/ant-design/ant-design/issues/18118 it('should not insert space to link button', () => { expect().toMatchRenderedSnapshot(); }); it('should render empty button without errors', () => { const wrapper = mount( , ); expect(wrapper).toMatchSnapshot(); }); it('have static property for type detecting', () => { const wrapper = mount(); expect(wrapper.type().__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 = mount(); wrapper.simulate('click'); expect(wrapper.find('.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 = mount(); wrapper.simulate('click'); expect(wrapper.hasClass('ant-btn-loading')).toBe(false); }); it('should not clickable when button is loading', () => { const onClick = jest.fn(); const wrapper = mount( , ); wrapper.simulate('click'); expect(onClick).not.toHaveBeenCalledWith(); }); it('should support link button', () => { const wrapper = mount( , ); expect(wrapper.render()).toMatchSnapshot(); }); it('fixbug renders {0} , 0 and {false}', () => { expect().toMatchRenderedSnapshot(); expect().toMatchRenderedSnapshot(); expect().toMatchRenderedSnapshot(); }); it('should has click wave effect', async () => { const wrapper = mount(); wrapper.find('.ant-btn').getDOMNode().click(); await new Promise(resolve => setTimeout(resolve, 0)); expect(wrapper.render()).toMatchSnapshot(); }); it('should not render as link button when href is undefined', async () => { const wrapper = mount( , ); expect(wrapper.render()).toMatchSnapshot(); }); // https://github.com/ant-design/ant-design/issues/15342 it('should merge text if children using variable', () => { const wrapper = mount( , ); expect(wrapper.render()).toMatchSnapshot(); }); it('should support to change loading', async () => { const wrapper = mount(); wrapper.setProps({ loading: true }); wrapper.update(); expect(wrapper.find('.ant-btn-loading').length).toBe(1); wrapper.setProps({ loading: false }); wrapper.update(); expect(wrapper.find('.ant-btn-loading').length).toBe(0); wrapper.setProps({ loading: { delay: 50 } }); wrapper.update(); expect(wrapper.find('.ant-btn-loading').length).toBe(0); await sleep(50); wrapper.update(); expect(wrapper.find('.ant-btn-loading').length).toBe(1); wrapper.setProps({ loading: false }); await sleep(50); wrapper.update(); expect(wrapper.find('.ant-btn-loading').length).toBe(0); expect(() => { wrapper.unmount(); }).not.toThrow(); }); it('should warning when pass a string as icon props', () => { const warnSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); mount( , ); const btn = wrapper.find('button').instance(); Object.defineProperty(btn, 'textContent', { get() { throw new Error('Should not called!!!'); }, }); wrapper.find('Button').instance().forceUpdate(); }); });