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); }); }); });