import * as React from 'react'; import { renderHook } from '@testing-library/react-hooks'; import { faArrowLeft, faIgloo } from '@fortawesome/free-solid-svg-icons'; import { Icon } from '../Icon'; import render from '../../utils/_tests/render'; jest.mock('react-native-svg', () => ({ // eslint-disable-next-line Svg: (props) => , Circle: (props) => , G: (props) => , Defs: (props) => , ClipPath: (props) => , Path: (props) => , })); describe('props', () => { it('should render correctly', () => { const { container } = render(); expect(container.firstChild).toMatchSnapshot(); }); it('should render correctly with color prop', () => { const { container } = render( Hello world ); expect(container.firstChild).toMatchSnapshot(); }); it('should render correctly with a label', () => { const { container } = render( Hello world ); expect(container.firstChild).toMatchSnapshot(); }); it('should render correctly with a size', () => { const { container } = render( Hello world ); expect(container.firstChild).toMatchSnapshot(); }); it('should render correctly for direct import', () => { const { container } = render( // @ts-ignore Hello world ); expect(container.firstChild).toMatchSnapshot(); }); it('should render correctly for custom icon', () => { const calendar = { viewBoxWidth: 16, viewBoxHeight: 16, paths: [ 'M11 3c.6 0 1-.5 1-1V1c0-.6-.4-1-1-1s-1 .4-1 1v1c0 .5.4 1 1 1zm3-2h-1v1c0 1.1-.9 2-2 2s-2-.9-2-2V1H6v1c0 1.1-.9 2-2 2s-2-.9-2-2V1H1c-.6 0-1 .5-1 1v12c0 .6.4 1 1 1h13c.6 0 1-.4 1-1V2c0-.6-.5-1-1-1zM5 13H2v-3h3v3zm0-4H2V6h3v3zm4 4H6v-3h3v3zm0-4H6V6h3v3zm4 4h-3v-3h3v3zm0-4h-3V6h3v3zM4 3c.6 0 1-.5 1-1V1c0-.6-.4-1-1-1S3 .4 3 1v1c0 .5.4 1 1 1z', ], }; const { container } = render(Hello world); expect(container.firstChild).toMatchSnapshot(); }); it('should render correctly for custom icon', () => { const bat = { viewBoxWidth: 24, viewBoxHeight: 24, props: { fill: 'none', }, tree: [ { name: 'circle', type: 'element', value: '', attributes: { cx: '12', cy: '12', r: '12', fill: '#BAC0C5' }, children: [], }, { name: 'g', type: 'element', value: '', attributes: { 'clip-path': 'url(#clip0)' }, children: [ { name: 'path', type: 'element', value: '', attributes: { d: 'M12.0001 3.75V8.84637L15.0501 14.1323L19.4746 16.7026C19.5145 16.633 19.5088 16.5369 19.4478 16.4314L15.8349 10.17L12.222 3.9087C12.1608 3.80283 12.0803 3.75 12.0001 3.75Z', fill: 'white', }, children: [], }, { name: 'path', type: 'element', value: '', attributes: { d: 'M4.5253 16.7032L8.94993 14.1331L12.0002 8.84698V3.75061C11.9196 3.75061 11.8392 3.80344 11.7783 3.9092L8.16515 10.1707L4.55205 16.4319C4.49128 16.5375 4.48557 16.6335 4.5253 16.7032Z', fill: 'white', }, children: [], }, { name: 'path', type: 'element', value: '', attributes: { d: 'M19.4746 16.7026L15.0501 14.1324H8.94993L4.5253 16.7026C4.56537 16.7724 4.65132 16.8158 4.7732 16.8158H19.2268C19.3488 16.8158 19.4346 16.7724 19.4746 16.7026Z', fill: 'white', }, children: [], }, ], }, { name: 'defs', type: 'element', value: '', attributes: {}, children: [ { name: 'clipPath', type: 'element', value: '', attributes: { id: 'clip0' }, children: [ { name: 'rect', type: 'element', value: '', attributes: { width: '15', height: '13.0658', fill: 'white', transform: 'translate(4.5 3.75)', }, children: [], }, ], }, ], }, ], }; const { container } = render(Hello world); expect(container.firstChild).toMatchSnapshot(); }); }); describe('composition', () => { describe('hook', () => { it('should return with Icon props', () => { const { result } = renderHook(() => Icon.useProps({ icon: 'info-circle' })); expect(result.current).toMatchSnapshot(); }); }); }); describe('overrides', () => { it('Icon.base should render correctly', () => { const { container } = render( hello world ); expect(container.firstChild).toMatchSnapshot(); }); }); describe('theming', () => { it('Icon.base should render correctly', () => { const { container } = render(hello world, { theme: { Icon: { styles: { base: { height: '32px', width: '32px' } } } }, }); expect(container.firstChild).toMatchSnapshot(); }); it('Icon.iconSets should render correctly', () => { const { container } = render(hello world, { theme: { icons: { iconSets: [ { // @ts-ignore icons: [faArrowLeft], prefix: 'solid-', type: 'font-awesome', }, ], }, }, }); expect(container.firstChild).toMatchSnapshot(); }); it('Icon.icons should render correctly', () => { const { container } = render(hello world, { theme: { icons: { icons: { calendar: { viewBoxWidth: 16, viewBoxHeight: 16, paths: [ 'M11 3c.6 0 1-.5 1-1V1c0-.6-.4-1-1-1s-1 .4-1 1v1c0 .5.4 1 1 1zm3-2h-1v1c0 1.1-.9 2-2 2s-2-.9-2-2V1H6v1c0 1.1-.9 2-2 2s-2-.9-2-2V1H1c-.6 0-1 .5-1 1v12c0 .6.4 1 1 1h13c.6 0 1-.4 1-1V2c0-.6-.5-1-1-1zM5 13H2v-3h3v3zm0-4H2V6h3v3zm4 4H6v-3h3v3zm0-4H6V6h3v3zm4 4h-3v-3h3v3zm0-4h-3V6h3v3zM4 3c.6 0 1-.5 1-1V1c0-.6-.4-1-1-1S3 .4 3 1v1c0 .5.4 1 1 1z', ], }, }, }, }, }); expect(container.firstChild).toMatchSnapshot(); }); it('Icon.iconNames should render correctly', () => { const { container } = render(hello world, { theme: { icons: { iconSets: [ { // @ts-ignore icons: [faArrowLeft], prefix: 'solid-', type: 'font-awesome', }, ], iconNames: { foo: 'solid-arrow-left', }, }, }, }); expect(container.firstChild).toMatchSnapshot(); }); }); describe('defaultProps', () => { it('should render correctly for size', () => { const { container } = render(hello world, { theme: { Icon: { defaultProps: { size: '500' } } }, }); expect(container.firstChild).toMatchSnapshot(); }); });