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 (h) { return }, }) expect(wrapper.html()).toMatchSnapshot() }) it('should support basic usage', () => { const wrapper = mount({ render (h) { return (
) }, }) expect(wrapper.html()).toMatchSnapshot() }) it('should support older usage', () => { const wrapper = mount({ render (h) { return (
) }, }) expect(wrapper.html()).toMatchSnapshot() }) it('should support two-tone icon', () => { const wrapper = mount({ render (h) { 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 (h) { return }, }) expect(wrapper.html()).toMatchSnapshot() VueIcon.setTwoToneColors(colors) }) it('should support pass svg paths as children', () => { const wrapper = mount({ render (h) { return Cool Home }, }) expect(wrapper.html()).toMatchSnapshot() }) it('should give warning and render {null}', () => { const wrapper = mount({ render (h) { 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 react 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'] ) }) })