2022-12-04 22:38:56 +01:00
|
|
|
import { describe, it, expect } from 'vitest';
|
2023-07-13 16:39:02 +02:00
|
|
|
import { render, cleanup, waitFor } from '@testing-library/react'
|
2023-11-24 13:59:12 +01:00
|
|
|
import { Pen, Edit2, Grid, LucideProps, Droplet } from '../src/lucide-react';
|
2023-07-13 16:39:02 +02:00
|
|
|
import { Suspense, lazy } from 'react';
|
2023-07-19 19:32:34 +02:00
|
|
|
import dynamicIconImports from '../src/dynamicIconImports';
|
2022-06-12 22:31:05 +02:00
|
|
|
|
|
|
|
|
describe('Using lucide icon components', () => {
|
|
|
|
|
it('should render an component', () => {
|
|
|
|
|
const { container } = render( <Grid/> );
|
|
|
|
|
|
|
|
|
|
expect( container.innerHTML ).toMatchSnapshot();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('should adjust the size, stroke color and stroke width', () => {
|
|
|
|
|
const testId = 'grid-icon';
|
|
|
|
|
const { container, getByTestId } = render(
|
|
|
|
|
<Grid
|
|
|
|
|
data-testid={testId}
|
|
|
|
|
size={48}
|
|
|
|
|
stroke="red"
|
|
|
|
|
strokeWidth={4}
|
|
|
|
|
/>,
|
|
|
|
|
);
|
|
|
|
|
|
2022-12-04 22:38:56 +01:00
|
|
|
const { attributes } = getByTestId(testId) as unknown as{ attributes: Record<string, { value: string }>};
|
2022-06-12 22:31:05 +02:00
|
|
|
expect(attributes.stroke.value).toBe('red');
|
|
|
|
|
expect(attributes.width.value).toBe('48');
|
|
|
|
|
expect(attributes.height.value).toBe('48');
|
|
|
|
|
expect(attributes['stroke-width'].value).toBe('4');
|
|
|
|
|
|
|
|
|
|
expect( container.innerHTML ).toMatchSnapshot();
|
|
|
|
|
});
|
2023-01-17 08:04:34 +01:00
|
|
|
|
|
|
|
|
it('should render the alias icon', () => {
|
|
|
|
|
const { container } = render(
|
|
|
|
|
<Pen
|
|
|
|
|
size={48}
|
|
|
|
|
stroke="red"
|
|
|
|
|
strokeWidth={4}
|
|
|
|
|
/>,
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const PenIconRenderedHTML = container.innerHTML
|
|
|
|
|
|
|
|
|
|
cleanup()
|
|
|
|
|
|
|
|
|
|
const { container: Edit2Container } = render(
|
|
|
|
|
<Edit2
|
|
|
|
|
size={48}
|
|
|
|
|
stroke="red"
|
|
|
|
|
strokeWidth={4}
|
|
|
|
|
/>,
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
expect(PenIconRenderedHTML).toBe(Edit2Container.innerHTML)
|
|
|
|
|
});
|
2023-04-20 16:08:34 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
it('should not scale the strokeWidth when absoluteStrokeWidth is set', () => {
|
|
|
|
|
const testId = 'grid-icon';
|
|
|
|
|
const { container, getByTestId } = render(
|
|
|
|
|
<Grid
|
|
|
|
|
data-testid={testId}
|
|
|
|
|
size={48}
|
|
|
|
|
stroke="red"
|
|
|
|
|
absoluteStrokeWidth
|
|
|
|
|
/>,
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const { attributes } = getByTestId(testId) as unknown as{ attributes: Record<string, { value: string }>};
|
|
|
|
|
expect(attributes.stroke.value).toBe('red');
|
|
|
|
|
expect(attributes.width.value).toBe('48');
|
|
|
|
|
expect(attributes.height.value).toBe('48');
|
|
|
|
|
expect(attributes['stroke-width'].value).toBe('1');
|
|
|
|
|
|
|
|
|
|
expect( container.innerHTML ).toMatchSnapshot();
|
|
|
|
|
});
|
2023-07-13 16:39:02 +02:00
|
|
|
|
2023-11-24 13:59:12 +01:00
|
|
|
it('should apply all classNames to the element', () => {
|
|
|
|
|
const testClass = 'my-class';
|
|
|
|
|
const { container } = render(
|
|
|
|
|
<Droplet className={testClass} />,
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
expect(container.firstChild).toHaveClass(testClass);
|
|
|
|
|
expect(container.firstChild).toHaveClass('lucide');
|
|
|
|
|
expect(container.firstChild).toHaveClass('lucide-droplet');
|
|
|
|
|
});
|
|
|
|
|
|
2023-07-13 16:39:02 +02:00
|
|
|
it('should render icons dynamically by using the dynamicIconImports module', async () => {
|
|
|
|
|
interface IconProps extends Omit<LucideProps, 'ref'> {
|
|
|
|
|
name: keyof typeof dynamicIconImports;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const Icon = ({ name, ...props }: IconProps) => {
|
|
|
|
|
const LucideIcon = lazy(dynamicIconImports[name]);
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<Suspense fallback={null}>
|
|
|
|
|
<LucideIcon {...props} />
|
|
|
|
|
</Suspense>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const { container, getByLabelText } = render(
|
|
|
|
|
<Icon
|
|
|
|
|
aria-label="smile"
|
|
|
|
|
name="smile"
|
|
|
|
|
size={48}
|
|
|
|
|
stroke="red"
|
|
|
|
|
absoluteStrokeWidth
|
|
|
|
|
/>,
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
await waitFor(() => getByLabelText('smile'))
|
|
|
|
|
|
|
|
|
|
expect( container.innerHTML ).toMatchSnapshot();
|
|
|
|
|
|
|
|
|
|
});
|
2022-06-12 22:31:05 +02:00
|
|
|
})
|