import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import React from 'react';
import { describe, expect, it, vi } from 'vitest';
import { MdLink } from '../MdLink';
describe('MdLink', () => {
describe('rendering', () => {
it('renders as anchor when href is provided', () => {
render(Link text);
expect(screen.getByRole('link')).toBeInTheDocument();
});
it('renders as button when no href is provided', () => {
render(Button link);
expect(screen.getByRole('button')).toBeInTheDocument();
});
it('renders children', () => {
render(Click me);
expect(screen.getByText('Click me')).toBeInTheDocument();
});
it('renders with icon', () => {
const { container } = render(
}>
Link
,
);
expect(container.querySelector('.md-link__icon')).toBeInTheDocument();
expect(screen.getByTestId('icon')).toBeInTheDocument();
});
});
describe('anchor behavior', () => {
it('sets href attribute', () => {
render(External);
expect(screen.getByRole('link')).toHaveAttribute('href', 'https://example.com');
});
it('forwards target attribute', () => {
render(
New tab
,
);
expect(screen.getByRole('link')).toHaveAttribute('target', '_blank');
});
it('forwards rel attribute', () => {
render(
Safe link
,
);
expect(screen.getByRole('link')).toHaveAttribute('rel', 'noopener');
});
});
describe('button behavior', () => {
it('handles click events', async () => {
const user = userEvent.setup();
const onClick = vi.fn();
render(Click me);
await user.click(screen.getByRole('button'));
expect(onClick).toHaveBeenCalledTimes(1);
});
it('has type="button" by default', () => {
render(Button);
expect(screen.getByRole('button')).toHaveAttribute('type', 'button');
});
});
describe('asChild pattern', () => {
it('renders custom element with asChild', () => {
render(
Custom Link}>
Content
,
);
expect(screen.getByRole('link')).toHaveTextContent('Content');
});
});
describe('props forwarding', () => {
it('forwards className', () => {
render(
Link
,
);
expect(screen.getByRole('link')).toHaveClass('md-link');
expect(screen.getByRole('link')).toHaveClass('custom-class');
});
it('forwards id', () => {
render(
Link
,
);
expect(screen.getByRole('link')).toHaveAttribute('id', 'my-link');
});
it('forwards aria-label', () => {
render(
Link
,
);
expect(screen.getByRole('link')).toHaveAttribute('aria-label', 'Navigate to page');
});
});
describe('ref forwarding', () => {
it('forwards ref to anchor element', () => {
const ref = React.createRef();
render(
Link
,
);
expect(ref.current).toBeInstanceOf(HTMLAnchorElement);
});
it('forwards ref to button element', () => {
const ref = React.createRef();
render(Button);
expect(ref.current).toBeInstanceOf(HTMLButtonElement);
});
});
});