2022-01-09 21:23:02 +00:00
|
|
|
import { promises as fs } from 'fs';
|
2021-12-11 23:26:58 +00:00
|
|
|
import { getCustomIcon } from '../lib';
|
2022-03-21 17:39:44 +00:00
|
|
|
import type { IconifyLoaderOptions } from '../lib';
|
2021-12-11 23:26:58 +00:00
|
|
|
|
2022-03-03 23:36:30 +00:00
|
|
|
const fixturesDir = './tests/fixtures';
|
2021-12-11 23:26:58 +00:00
|
|
|
|
|
|
|
describe('Testing getCustomIcon', () => {
|
2022-01-09 20:44:48 +00:00
|
|
|
test('CustomIconLoader', async () => {
|
2022-01-09 21:23:02 +00:00
|
|
|
const svg = await fs.readFile(fixturesDir + '/circle.svg', 'utf8');
|
2022-01-09 20:44:48 +00:00
|
|
|
const result = await getCustomIcon(() => svg, 'a', 'b');
|
2021-12-11 23:26:58 +00:00
|
|
|
expect(svg).toEqual(result);
|
|
|
|
});
|
2022-01-09 20:44:48 +00:00
|
|
|
|
2022-03-18 13:52:53 +00:00
|
|
|
test('CustomIconLoader without xmlns', async () => {
|
|
|
|
const svg =
|
|
|
|
'<svg viewBox="0 0 120 120"><circle cx="60" cy="60" r="50"/></svg>';
|
|
|
|
const result = await getCustomIcon(() => svg, 'a', 'b', {
|
|
|
|
addXmlNs: true,
|
|
|
|
});
|
|
|
|
expect(result).toEqual(
|
|
|
|
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 120"><circle cx="60" cy="60" r="50"/></svg>'
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
2022-03-21 17:38:18 +00:00
|
|
|
test('CustomIconLoader should apply trim', async () => {
|
|
|
|
const svg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 120">
|
|
|
|
<circle cx="60" cy="60" r="50"/>
|
|
|
|
</svg>
|
|
|
|
`;
|
|
|
|
const result = await getCustomIcon(() => svg, 'a', 'b', {
|
|
|
|
customizations: { trimCustomSvg: true },
|
|
|
|
});
|
|
|
|
expect(result).toEqual(
|
|
|
|
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 120"><circle cx="60" cy="60" r="50"/></svg>'
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
2022-03-17 11:48:49 +00:00
|
|
|
test("CustomIconLoader with transform: scale/width/height shouldn't take effect", async () => {
|
2022-01-09 21:23:02 +00:00
|
|
|
const svg = await fs.readFile(fixturesDir + '/circle.svg', 'utf8');
|
2022-03-17 11:48:49 +00:00
|
|
|
const options: IconifyLoaderOptions = {
|
|
|
|
scale: 2,
|
2022-02-26 14:12:13 +00:00
|
|
|
customizations: {
|
2022-03-17 11:48:49 +00:00
|
|
|
additionalProps: {
|
|
|
|
width: '4em',
|
|
|
|
height: '4em',
|
|
|
|
},
|
2022-03-24 20:16:13 +00:00
|
|
|
transform(svg) {
|
|
|
|
return svg.replace(
|
2022-03-04 16:37:21 +00:00
|
|
|
'<svg ',
|
|
|
|
'<svg width="1em" height="1em" '
|
|
|
|
);
|
2022-02-26 14:12:13 +00:00
|
|
|
},
|
2022-03-04 16:37:21 +00:00
|
|
|
},
|
2022-03-17 11:48:49 +00:00
|
|
|
usedProps: {},
|
|
|
|
};
|
|
|
|
const result = await getCustomIcon(() => svg, 'a', 'b', options);
|
2021-12-11 23:26:58 +00:00
|
|
|
expect(result && result.indexOf('width="1em"') > -1).toBeTruthy();
|
|
|
|
expect(result && result.indexOf('height="1em"') > -1).toBeTruthy();
|
2022-03-18 13:55:47 +00:00
|
|
|
|
2022-03-17 12:14:35 +00:00
|
|
|
expect(options.usedProps).toBeTruthy();
|
2022-03-18 13:55:47 +00:00
|
|
|
|
|
|
|
const usedProps = options.usedProps as Record<string, string>;
|
|
|
|
expect(usedProps).toHaveProperty('width');
|
|
|
|
expect(usedProps).toHaveProperty('height');
|
|
|
|
expect(usedProps.width).toEqual('4em');
|
|
|
|
expect(usedProps.height).toEqual('4em');
|
2021-12-11 23:26:58 +00:00
|
|
|
});
|
2022-01-09 21:23:02 +00:00
|
|
|
|
|
|
|
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(svg).toEqual(result);
|
|
|
|
expect(warned).toEqual(true);
|
|
|
|
});
|
2021-12-11 23:26:58 +00:00
|
|
|
});
|