import { describe, it, expect, vi } from 'vitest' import { render, screen } from '@testing-library/react' import { HoverCard, HoverCardTrigger, HoverCardContent } from '../hover-card' // Mock Radix UI vi.mock('@radix-ui/react-hover-card', () => ({ Root: ({ children, ...props }: any) =>
{children}
, Trigger: ({ children, ...props }: any) => , Portal: ({ children, ...props }: any) =>
{children}
, Content: ({ children, className, align, sideOffset, ...props }: any) => (
{children}
), })) describe('HoverCard Components', () => { describe('HoverCard', () => { it('should render HoverCard root component', () => { render(
Test content
) const hoverCard = screen.getByTestId('hover-card-root') expect(hoverCard).toBeDefined() expect(hoverCard).toHaveAttribute('data-slot', 'hover-card') expect(screen.getByText('Test content')).toBeDefined() }) it('should pass through props to root component', () => { render(
Test content
) const hoverCard = screen.getByTestId('hover-card-root') expect(hoverCard).toHaveAttribute('openDelay', '500') }) }) describe('HoverCardTrigger', () => { it('should render trigger component', () => { render( Hover me ) const trigger = screen.getByTestId('hover-card-trigger') expect(trigger).toBeDefined() expect(trigger).toHaveAttribute('data-slot', 'hover-card-trigger') expect(screen.getByText('Hover me')).toBeDefined() }) it('should pass through props to trigger component', () => { render( Disabled trigger ) const trigger = screen.getByTestId('hover-card-trigger') expect(trigger).toHaveAttribute('disabled') }) }) describe('HoverCardContent', () => { it('should render content with default props', () => { render(
Content here
) const portal = screen.getByTestId('hover-card-portal') expect(portal).toHaveAttribute('data-slot', 'hover-card-portal') const content = screen.getByTestId('hover-card-content') expect(content).toBeDefined() expect(content).toHaveAttribute('data-slot', 'hover-card-content') expect(content).toHaveAttribute('data-align', 'center') expect(content).toHaveAttribute('data-side-offset', '4') expect(screen.getByText('Content here')).toBeDefined() }) it('should render content with custom props', () => { render(
Custom content
) const content = screen.getByTestId('hover-card-content') expect(content).toHaveAttribute('data-align', 'start') expect(content).toHaveAttribute('data-side-offset', '8') expect(content.className).toContain('custom-class') }) it('should apply default styling classes', () => { render(
Content
) const content = screen.getByTestId('hover-card-content') expect(content.className).toContain('bg-main-view') expect(content.className).toContain('text-main-view-fg/70') expect(content.className).toContain('rounded-md') expect(content.className).toContain('border') expect(content.className).toContain('shadow-md') }) it('should merge custom className with default classes', () => { render(
Content
) const content = screen.getByTestId('hover-card-content') expect(content.className).toContain('bg-main-view') expect(content.className).toContain('my-custom-class') }) it('should pass through additional props', () => { render(
Content
) const content = screen.getByTestId('hover-card-content') expect(content).toHaveAttribute('data-testprop', 'test-value') }) }) describe('Integration', () => { it('should render complete hover card structure', () => { render(
Hover content
) expect(screen.getByTestId('hover-card-root')).toBeDefined() expect(screen.getByTestId('hover-card-trigger')).toBeDefined() expect(screen.getByTestId('hover-card-portal')).toBeDefined() expect(screen.getByTestId('hover-card-content')).toBeDefined() expect(screen.getByText('Trigger')).toBeDefined() expect(screen.getByText('Hover content')).toBeDefined() }) }) })