import React, { Suspense, useRef, useState } from 'react'; import { SearchOutlined } from '@ant-design/icons'; import { resetWarned } from 'rc-util/lib/warning'; import Button from '..'; import type { GetRef } from '../../_util/type'; import mountTest from '../../../tests/shared/mountTest'; import rtlTest from '../../../tests/shared/rtlTest'; import { act, fireEvent, render, waitFakeTimer } from '../../../tests/utils'; import ConfigProvider from '../../config-provider'; import type { BaseButtonProps } from '../button'; 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'; // @ts-expect-error: Type '"who am I"' is not assignable to type 'SizeType'.ts(2322) 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: React.FC = ({ children }) => {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', () => { expect(Button.__ANT_BUTTON).toBe(true); }); it('should change loading state instantly by default', () => { const DefaultButton: React.FC = () => { const [loading, setLoading] = useState(false); 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', () => { const DefaultButton: React.FC = () => { const [loading, setLoading] = useState(false); return ( ); }; const wrapper = render(); fireEvent.click(wrapper.container.firstChild!); expect(wrapper.container.firstChild).not.toHaveClass('ant-btn-loading'); }); it('should support custom icon className', () => { const { 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 () => { jest.useFakeTimers(); const { container, rerender, unmount } = render(); rerender( , ); Object.defineProperty(buttonInstance.current, '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(); }); it("should prevent children's event when button is disabled", () => { const { container } = render( , ); expect(window.getComputedStyle(container.querySelector('#link')!).pointerEvents).toBe('none'); }); it('Correct type', () => { const onBtnClick: React.MouseEventHandler = () => {}; const onAnchorClick: React.MouseEventHandler = () => {}; const button = ; } const MyCom: React.FC = () => { const [freeze, setFreeze] = useState(false); return (
frozen}>
); }; const { container } = render(); fireEvent.click(container.querySelector('.change-btn')!); expect(container.querySelector('.foo')).toHaveTextContent('frozen'); fireEvent.click(container.querySelector('.change-btn')!); expect(container.querySelectorAll('.ant-btn-loading-icon').length).toBe(0); }); // https://github.com/ant-design/ant-design/issues/45273 it('should display loading when delay is zero', () => { const { container } = render(); expect(container.querySelectorAll('.ant-btn-loading').length).toBe(1); }); // https://github.com/ant-design/ant-design/issues/47605 it('Compatible with original `type` behavior', async () => { const { container } = render(); expect(container.querySelector('button')?.textContent).toBe(text); }); });