import { promises as fs } from 'fs'; import { getCustomIcon } from '../lib/loader/custom'; import type { IconifyLoaderOptions } from '../lib/loader/types'; const fixturesDir = './tests/fixtures'; describe('Testing getCustomIcon', () => { test('CustomIconLoader', async () => { const svg = await fs.readFile(fixturesDir + '/circle.svg', 'utf8'); const result = await getCustomIcon(() => svg, 'a', 'b'); expect(svg).toEqual(result); }); test('CustomIconLoader without xmlns', async () => { const svg = ''; const result = await getCustomIcon(() => svg, 'a', 'b', { addXmlNs: true, }); expect(result).toEqual( '' ); }); test('CustomIconLoader should apply trim', async () => { const svg = ` `; const result = await getCustomIcon(() => svg, 'a', 'b', { customizations: { trimCustomSvg: true }, }); expect(result).toEqual( '' ); }); test('CustomIconLoader cleanups svg preface', async () => { const svg = ` `; const result = await getCustomIcon(() => svg, 'a', 'b', { customizations: { trimCustomSvg: true }, }); expect(result).toEqual( '' ); }); test("CustomIconLoader with transform: scale/width/height shouldn't take effect", async () => { const svg = await fs.readFile(fixturesDir + '/circle.svg', 'utf8'); const options: IconifyLoaderOptions = { scale: 2, customizations: { additionalProps: { width: '4em', height: '4em', }, transform(svg) { return svg.replace( / svg, 'a', 'b', options); expect(result && result.indexOf('width="1em"') > -1).toBeTruthy(); expect(result && result.indexOf('height="1em"') > -1).toBeTruthy(); expect(options.usedProps).toBeTruthy(); const usedProps = options.usedProps as Record; expect(usedProps).toHaveProperty('width'); expect(usedProps).toHaveProperty('height'); expect(usedProps.width).toEqual('4em'); expect(usedProps.height).toEqual('4em'); }); test('Icon with XML heading', async () => { // Intercept console.warn let warned = false; const warn = console.warn; console.warn = (/*...args*/) => { // warn.apply(this, args); warned = true; }; const svg = await fs.readFile(fixturesDir + '/1f3eb.svg', 'utf8'); const result = await getCustomIcon(() => svg, 'a', 'b'); // Restore console.warn console.warn = warn; expect(result).toEqual( svg.replace( '', '' ) ); expect(warned).toEqual(false); }); test('Scale custom icon', async () => { const svg = ''; const options: IconifyLoaderOptions = { scale: 2, }; const result = await getCustomIcon(() => svg, 'a', 'b', options); expect(result && result.indexOf(' width="2em"') > -1).toBeTruthy(); expect(result && result.indexOf(' height="2em"') > -1).toBeTruthy(); }); test('Scale custom icon with stroke-width', async () => { const svg = ` `; const options: IconifyLoaderOptions = { scale: 1.2, }; const result = await getCustomIcon(() => svg, 'a', 'b', options); expect(result && result.indexOf(' width="1.2em"') > -1).toBeTruthy(); expect(result && result.indexOf(' height="1.2em"') > -1).toBeTruthy(); }); test('Disable scale for custom icon', async () => { const svg = ''; const options: IconifyLoaderOptions = { scale: 0, }; const result = await getCustomIcon(() => svg, 'a', 'b', options); expect(result && result.indexOf(' width="') === -1).toBeTruthy(); expect(result && result.indexOf(' height="') === -1).toBeTruthy(); }); test('CustomIconLoader with non-square icon', async () => { const svg = ''; const result = await getCustomIcon(() => svg, 'a', 'b', { addXmlNs: true, }); expect(result).toEqual( '' ); }); });