Files
lucide/packages/vue/tests/Icon.spec.ts
KarsaandEric Fennis 99d25bdee2 feat(packages): extract icon build logic into @lucide/shared (#4409)
* feat(packages): extract build logic to @lucide/shared, still wip

* feat(): unify icon build logic some more, add nonScalingStroke option, marking absoluteStrokeWidth as deprecated

* feat(): unify icon build logic some more, add nonScalingStroke option, marking absoluteStrokeWidth as deprecated

* feat(packages): extract build logic to @lucide/shared, still wip

* feat(): unify icon build logic some more, add nonScalingStroke option, marking absoluteStrokeWidth as deprecated

* feat(): unify icon build logic some more, add nonScalingStroke option, marking absoluteStrokeWidth as deprecated

* chore(icons): revert git hook changes made to icons

* fix(packages/astro,react-native,vue): fix iconNode type
fix(packages/vue): fix hasA11yProp

* fix(packages/solid): make component reactive & add unit tests for checking prop changes

* test(packages/vue): add reactivity tests to @lucide/vue

* fix(packages): replace cpy-cli, accidentally removed during main merge

* docs(packages): upgrade react documentation with nonScalingStroke

* fix(tests): update snapshots for lucide-react

* feat(docs): upgraded package guides with nonScalingStroke, dropping absoluteStrokeWidth

* fix(vue,react-native): fix linting issues

* fix(icons): add proper fallback for icon width in calculatedStrokeWidth

* fix(packages/svelte): add globalProps.class to icons

* fix(packages/shared): wrap width, height & size in isDefined

* Update types.ts

* fix(packages/svelte): do not pass propsClass to mergeClasses

---------

Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
2026-09-04 16:38:01 +02:00

73 lines
1.9 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import { render } from '@testing-library/vue';
import { defineComponent } from 'vue';
import { airVent } from './testIconNodes';
import { Icon } from '../src/lucide-vue';
describe('Using Icon Component', () => {
const airVentIcon = { name: 'air-vent', node: airVent, size: 24 };
it('should render icon based on an icon node', async () => {
const { container } = render(Icon, {
props: {
iconNode: airVent,
name: 'AirVent',
size: 48,
color: 'red',
absoluteStrokeWidth: true,
},
});
expect(container.firstChild).toMatchSnapshot();
});
it('should render when iconNode is passed as the kebab-case icon-node prop', async () => {
const { container } = render(Icon, {
props: {
'icon-node': airVent,
name: 'AirVent',
},
});
expect(container.firstChild).toBeDefined();
expect(container.querySelector('svg')).toBeTruthy();
});
it('should render icon and match snapshot', async () => {
const { container } = render(Icon, {
props: {
icon: airVentIcon,
size: 48,
color: 'red',
absoluteStrokeWidth: true,
},
});
expect(container.firstChild).toMatchSnapshot();
});
it('should update when reactive props change', async () => {
const wrapper = defineComponent({
components: { Icon },
props: {
size: Number,
},
setup() {
return { airVentIcon };
},
template: '<Icon :icon="airVentIcon" :size="size" />',
});
const { container, rerender } = render(wrapper, { props: { size: 24 } });
expect(container.firstChild).toHaveAttribute('width', '24');
expect(container.firstChild).toHaveAttribute('height', '24');
await rerender({ size: 48 });
expect(container.firstChild).toHaveAttribute('width', '48');
expect(container.firstChild).toHaveAttribute('height', '48');
});
});