import {
render,
screen,
} from '@testing-library/svelte';
import { createRawSnippet } from 'svelte';
import Link from './Link.svelte';
/**
* Helper to create a plain text snippet
*/
function textSnippet(text: string) {
return createRawSnippet(() => ({
render: () => `${text}`,
}));
}
/**
* Helper to create an icon snippet
*/
function iconSnippet() {
return createRawSnippet(() => ({
render: () => ``,
}));
}
describe('Link', () => {
const defaultProps = {
href: 'https://fonts.google.com',
};
describe('Rendering', () => {
it('renders text content via children snippet', () => {
render(Link, {
props: {
...defaultProps,
children: textSnippet('Google Fonts'),
},
});
expect(screen.getByText('Google Fonts')).toBeInTheDocument();
});
it('renders as an anchor element with correct href', () => {
render(Link, { props: defaultProps });
const link = screen.getByRole('link');
expect(link).toBeInTheDocument();
expect(link).toHaveAttribute('href', 'https://fonts.google.com');
});
it('renders the icon when provided via snippet', () => {
const { container } = render(Link, {
props: {
...defaultProps,
children: textSnippet('Google Fonts'),
icon: iconSnippet(),
},
});
const icon = container.querySelector('svg');
expect(icon).toBeInTheDocument();
expect(icon).toHaveClass('lucide-arrow-up-right');
});
});
describe('Attributes', () => {
it('applies custom CSS classes', () => {
render(Link, {
props: {
...defaultProps,
class: 'custom-class',
},
});
expect(screen.getByRole('link')).toHaveClass('custom-class');
});
it('spreads additional anchor attributes', () => {
render(Link, {
props: {
...defaultProps,
target: '_blank',
rel: 'noopener',
},
});
const link = screen.getByRole('link');
expect(link).toHaveAttribute('target', '_blank');
expect(link).toHaveAttribute('rel', 'noopener');
});
});
});