import Button from '../index'; import SearchOutlined from '@ant-design/icons-vue/SearchOutlined'; import { mount } from '@vue/test-utils'; import { nextTick } from 'vue'; import { asyncExpect, sleep } from '../../../tests/utils'; import mountTest from '../../../tests/shared/mountTest'; import { resetWarned } from '../../_util/warning'; describe('Button', () => { mountTest(Button); mountTest(Button.Group); it('renders correctly', () => { const wrapper = mount({ render() { return ; }, }); expect(wrapper.html()).toMatchSnapshot(); }); it('create primary button', () => { const wrapper = mount({ render() { return ; }, }); expect(wrapper.find('.ant-btn-primary').exists()).toBe(true); }); it('renders Chinese characters correctly', done => { const wrapper = mount({ render() { return ; }, }); expect(wrapper.text()).toBe('按 钮'); const wrapper1 = mount({ render() { return ( ); }, }); expect(wrapper1.html()).toMatchSnapshot(); const wrapper2 = mount({ render() { return ( ); }, }); expect(wrapper2.html()).toMatchSnapshot(); // should not insert space when there is icon const wrapper3 = mount({ render() { return ( ); }, }); expect(wrapper3.html()).toMatchSnapshot(); // should not insert space when there is icon while loading const wrapper4 = mount({ render() { return ( ); }, }); expect(wrapper4.html()).toMatchSnapshot(); // should insert space while loading const wrapper5 = mount({ render() { return ; }, }); expect(wrapper5.html()).toMatchSnapshot(); const wrapper6 = mount({ render() { return ( ); }, }); nextTick(() => { // expect(wrapper6.find('.ant-btn-two-chinese-chars').exists()).toBe(true); expect(wrapper6.html()).toMatchSnapshot(); done(); }); }); it('should change loading state instantly by default', async () => { const DefaultButton = { data() { return { loading: false, }; }, methods: { enterLoading() { this.loading = true; }, }, render() { return ( ); }, }; const wrapper = mount(DefaultButton, { sync: false }); await asyncExpect(() => { wrapper.trigger('click'); }); await asyncExpect(() => { expect(wrapper.findAll('.ant-btn-loading').length).toBe(1); }); }); it('should change loading state with delay', async () => { const DefaultButton = { data() { return { loading: false, }; }, methods: { enterLoading() { this.loading = { delay: 1000 }; }, }, render() { return ( ); }, }; const wrapper = mount(DefaultButton, { sync: false }); await asyncExpect(() => { wrapper.trigger('click'); }); await asyncExpect(() => { expect(wrapper.find('.ant-btn-loading').exists()).toBe(false); }); }); it('should not clickable when button is loading', () => { const onClick = jest.fn(); const wrapper = mount({ render() { return ( ); }, }); wrapper.trigger('click'); expect(onClick).not.toHaveBeenCalledWith(); }); it('should support link button', () => { const wrapper = mount({ render() { return ( ); }, }); expect(wrapper.html()).toMatchSnapshot(); }); it('fixbug renders {0} , 0 and {false}', () => { const wrapper = mount({ render() { return ; }, }); expect(wrapper.html()).toMatchSnapshot(); const wrapper1 = mount({ render() { return ; }, }); expect(wrapper1.html()).toMatchSnapshot(); const wrapper2 = mount({ render() { return ; }, }); expect(wrapper2.html()).toMatchSnapshot(); }); it('should not render as link button when href is undefined', async () => { const wrapper = mount({ render() { return ( ); }, }); expect(wrapper.html()).toMatchSnapshot(); }); it('should support to change loading', async () => { const wrapper = mount(Button); wrapper.setProps({ loading: true }); await sleep(); expect(wrapper.findAll('.ant-btn-loading').length).toBe(1); wrapper.setProps({ loading: false }); await sleep(); expect(wrapper.findAll('.ant-btn-loading').length).toBe(0); wrapper.setProps({ loading: { delay: 50 } }); await sleep(); expect(wrapper.findAll('.ant-btn-loading').length).toBe(0); await sleep(50); expect(wrapper.findAll('.ant-btn-loading').length).toBe(1); wrapper.setProps({ loading: false }); await sleep(50); expect(wrapper.findAll('.ant-btn-loading').length).toBe(0); expect(() => { wrapper.unmount(); }).not.toThrow(); }); it('should warning when pass type=link and ghost=true', () => { resetWarned(); const warnSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); mount({ render() { return ); }, }); await asyncExpect(() => { wrapper.trigger('click'); }); await asyncExpect(() => { expect(onClick).not.toHaveBeenCalled(); }); }); });