import { render } from '@testing-library/svelte'; import { iconExists } from '../../dist/iconify'; import { mockAPIData } from '@iconify/core/lib/api/modules/mock'; import { provider, nextPrefix } from './load'; import ChangeIcon from './fixtures/ChangeIcon.svelte'; import ChangeProps from './fixtures/ChangeProps.svelte'; const iconData = { body: '', width: 24, height: 24, }; const iconData2 = { body: '', width: 32, height: 32, }; describe('Rendering icon', () => { test('changing icon property', (done) => { const prefix = nextPrefix(); const name = 'changing-prop'; const name2 = 'changing-prop2'; const iconName = `@${provider}:${prefix}:${name}`; const iconName2 = `@${provider}:${prefix}:${name2}`; let triggerSwap; mockAPIData({ provider, prefix, response: { prefix, icons: { [name]: iconData, }, }, delay: (next) => { // Fixture callback should have been called expect(typeof triggerSwap).toEqual('function'); // Icon should not have loaded yet expect(iconExists(iconName)).toEqual(false); // Send icon data next(); // Test it again expect(iconExists(iconName)).toEqual(true); // Check if state was changed // Wrapped in double setTimeout() because re-render takes 2 ticks setTimeout(() => { setTimeout(() => { const node = component.container.querySelector('svg'); const html = node.parentNode.innerHTML; // Check HTML expect(html).toEqual( '' ); // Change property triggerSwap(); }, 0); }, 0); }, }); mockAPIData({ provider, prefix, response: { prefix, icons: { [name2]: iconData2, }, }, delay: (next) => { // Icon should not have loaded yet expect(iconExists(iconName2)).toEqual(false); // Send icon data next(); // Test it again expect(iconExists(iconName2)).toEqual(true); // Check if state was changed // Wrapped in double setTimeout() because re-render takes 2 ticks setTimeout(() => { setTimeout(() => { const node = component.container.querySelector('svg'); const html = node.parentNode.innerHTML; // Check HTML expect(html).toEqual( '' ); done(); }, 0); }, 0); }, }); // Check if icon has been loaded expect(iconExists(iconName)).toEqual(false); // Render component const component = render(ChangeIcon, { icon1: iconName, icon2: iconName2, expose: (swap) => { triggerSwap = swap; }, }); // Should render empty icon const html = component.container.innerHTML; expect(html).toEqual('
'); }); test('changing multiple properties', (done) => { const prefix = nextPrefix(); const name = 'multiple-props'; const iconName = `@${provider}:${prefix}:${name}`; let triggerSwap; mockAPIData({ provider, prefix, response: { prefix, icons: { [name]: iconData, }, }, delay: (next) => { // Fixture callback should have been called expect(typeof triggerSwap).toEqual('function'); // Icon should not have loaded yet expect(iconExists(iconName)).toEqual(false); // Send icon data next(); // Test it again expect(iconExists(iconName)).toEqual(true); // Check if state was changed // Wrapped in double setTimeout() because re-render takes 2 ticks setTimeout(() => { setTimeout(() => { const node = component.container.querySelector('svg'); const html = node.parentNode.innerHTML; // Check HTML expect(html).toEqual( '' ); // Add horizontal flip and style triggerSwap(); // Wait for component to re-render setTimeout(() => { setTimeout(() => { // Check HTML again const node = component.container.querySelector( 'svg' ); const html = node.parentNode.innerHTML; expect(html).toEqual( '' ); done(); }, 0); }, 0); }, 0); }, 0); }, }); // Check if icon has been loaded expect(iconExists(iconName)).toEqual(false); // Render component const component = render(ChangeProps, { icon: iconName, expose: (swap) => { triggerSwap = swap; }, }); // Should render empty icon const html = component.container.innerHTML; expect(html).toEqual('
'); }); });