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