import { mount } from '@vue/test-utils'; import Icon from '..'; import VueIcon from '@ant-design/icons-vue'; import { getThemeFromTypeName, withThemeSuffix } from '../utils'; import { cloneElement } from '../../_util/vnode'; describe('Icon', () => { it('should render to a ...', () => { const wrapper = mount({ render() { return ; }, }); expect(wrapper.html()).toMatchSnapshot(); }); it('should support basic usage', () => { const wrapper = mount({ render() { return (
); }, }); expect(wrapper.html()).toMatchSnapshot(); }); it('should support older usage', () => { const wrapper = mount({ render() { return (
); }, }); expect(wrapper.html()).toMatchSnapshot(); }); it('should support two-tone icon', () => { const wrapper = mount({ render() { return ; }, }); expect(wrapper.html()).toMatchSnapshot(); }); it('should support config global two-tone primary color', () => { const colors = VueIcon.getTwoToneColors(); Icon.setTwoToneColor('#1890ff'); expect(Icon.getTwoToneColor()).toBe('#1890ff'); const wrapper = mount({ render() { return ; }, }); expect(wrapper.html()).toMatchSnapshot(); VueIcon.setTwoToneColors(colors); }); it('should support pass svg paths as children', () => { const wrapper = mount({ render() { return ( Cool Home ); }, }); expect(wrapper.html()).toMatchSnapshot(); }); it('should give warning and render {null}', () => { const wrapper = mount({ render() { return ; }, }); expect(wrapper.html()).toMatchSnapshot(); }); it('should support custom usage of children', () => { expect(() => { mount({ render() { return &E648; }, }); }).not.toThrow(); }); describe('warning on conflicting theme', () => { let errorSpy; beforeEach(() => { errorSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); }); afterEach(() => { errorSpy.mockRestore(); }); it('does not warn', () => { mount({ render() { return ; }, }); expect(errorSpy).not.toBeCalled(); }); it('warns', () => { mount({ render() { return ; }, }); expect(errorSpy).toBeCalledWith( "Warning: The icon name 'clock-circle-o' already specify a theme 'outlined', the 'theme' prop 'filled' will be ignored.", ); }); }); describe('`component` prop', () => { it('can access to svg defs if has children', () => { const wrapper = mount({ render() { const component = { render() { return ( {this.$slots.default.map(child => { cloneElement(child, { attrs: child.type === 'path' ? { fill: 'scriptUrl(#gradient)' } : {}, }); })} ); }, }; return ( Cool Home ); }, }); expect(wrapper.html()).toMatchSnapshot(); }); }); it('should support svg vue component', () => { const SvgComponent = { render() { return ( Cool Home ); }, }; const wrapper = mount({ render() { return ( Cool Home ); }, }); expect(wrapper.html()).toMatchSnapshot(); }); }); describe('utils', () => { it('getThemeFromTypeName() should work', () => { const testCases = [ 'check-circle', 'check-circle-o', 'check-circle-fill', 'check-circle-twotone', ]; const result = testCases.map(type => getThemeFromTypeName(type)); expect(result).toEqual([null, 'outlined', 'filled', 'twoTone']); }); it('withThemeSuffix() should work', () => { const testCases = [ { type: 'home', theme: 'filled' }, { type: 'home', theme: 'outlined' }, { type: 'home', theme: 'twoTone' }, { type: 'home', theme: 'This-is-the-secret' }, { type: 'home-o', theme: 'filled' }, { type: 'home-fill', theme: 'outlined' }, { type: 'home-o', theme: 'twoTone' }, { type: 'home-o', theme: 'This-is-the-secret' }, ]; const result = testCases.map(({ type, theme }) => withThemeSuffix(type, theme)); expect(result).toEqual([ 'home-fill', 'home-o', 'home-twotone', 'home', 'home-o-fill', 'home-fill-o', 'home-o-twotone', 'home-o', ]); }); });