import { render, screen, fireEvent } from '@testing-library/react'
import { QualityBadge } from '../QualityBadge'
import { EnrichButton } from '../EnrichButton'
import { EnrichmentProgress } from '../EnrichmentProgress'
// ---------------------------------------------------------------------------
// QualityBadge
// ---------------------------------------------------------------------------
describe('QualityBadge', () => {
it('renders grade A with correct label in title', () => {
render()
const badge = screen.getByTitle('Data quality: Excellent (95/100)')
expect(badge).toBeInTheDocument()
expect(badge).toHaveTextContent('A')
})
it('renders grade B with correct title', () => {
render()
expect(screen.getByTitle('Data quality: Good (80/100)')).toBeInTheDocument()
})
it('renders grade C with correct title', () => {
render()
expect(screen.getByTitle('Data quality: Fair (65/100)')).toBeInTheDocument()
})
it('renders grade D with correct title', () => {
render()
expect(screen.getByTitle('Data quality: Poor (45/100)')).toBeInTheDocument()
})
it('renders grade F with correct title', () => {
render()
expect(screen.getByTitle('Data quality: Incomplete (20/100)')).toBeInTheDocument()
})
it('does not show score by default', () => {
render()
expect(screen.queryByText('(95)')).not.toBeInTheDocument()
})
it('shows score when showScore is true', () => {
render()
expect(screen.getByText('(95)')).toBeInTheDocument()
})
it('applies green styles for grade A', () => {
render()
const badge = screen.getByTitle('Data quality: Excellent (95/100)')
expect(badge).toHaveClass('bg-green-100')
expect(badge).toHaveClass('text-green-800')
})
it('applies red styles for grade F', () => {
render()
const badge = screen.getByTitle('Data quality: Incomplete (20/100)')
expect(badge).toHaveClass('bg-red-100')
expect(badge).toHaveClass('text-red-800')
})
it('applies yellow styles for grade C', () => {
render()
const badge = screen.getByTitle('Data quality: Fair (65/100)')
expect(badge).toHaveClass('bg-yellow-100')
})
})
// ---------------------------------------------------------------------------
// EnrichButton
// ---------------------------------------------------------------------------
describe('EnrichButton', () => {
it('renders default label', () => {
render()
expect(screen.getByRole('button', { name: /enrich/i })).toBeInTheDocument()
})
it('renders custom label', () => {
render()
expect(screen.getByRole('button', { name: /run enrichment/i })).toBeInTheDocument()
})
it('shows Enriching... when isLoading is true', () => {
render()
expect(screen.getByText('Enriching...')).toBeInTheDocument()
})
it('is disabled when isLoading is true', () => {
render()
expect(screen.getByRole('button')).toBeDisabled()
})
it('calls onClick when clicked', () => {
const onClick = jest.fn()
render()
fireEvent.click(screen.getByRole('button'))
expect(onClick).toHaveBeenCalledTimes(1)
})
it('does not call onClick when disabled', () => {
const onClick = jest.fn()
render()
fireEvent.click(screen.getByRole('button'))
expect(onClick).not.toHaveBeenCalled()
})
it('applies sm size classes by default', () => {
render()
expect(screen.getByRole('button')).toHaveClass('px-3', 'py-1.5', 'text-xs')
})
it('applies md size classes when size is md', () => {
render()
expect(screen.getByRole('button')).toHaveClass('px-4', 'py-2', 'text-sm')
})
it('applies custom className', () => {
render()
expect(screen.getByRole('button')).toHaveClass('my-custom-class')
})
})
// ---------------------------------------------------------------------------
// EnrichmentProgress
// ---------------------------------------------------------------------------
describe('EnrichmentProgress', () => {
const queueStatus = {
pending: 3,
processing: 1,
completed: 12,
failed: 0,
}
it('renders unavailable message when queueStatus is null', () => {
render()
expect(screen.getByText('Queue status unavailable')).toBeInTheDocument()
})
it('renders all four status counts', () => {
render()
expect(screen.getByText('3')).toBeInTheDocument() // pending
expect(screen.getByText('1')).toBeInTheDocument() // processing
expect(screen.getByText('12')).toBeInTheDocument() // completed
expect(screen.getByText('0')).toBeInTheDocument() // failed
})
it('renders all four status labels', () => {
render()
expect(screen.getByText('Pending')).toBeInTheDocument()
expect(screen.getByText('Processing')).toBeInTheDocument()
expect(screen.getByText('Completed')).toBeInTheDocument()
expect(screen.getByText('Failed')).toBeInTheDocument()
})
it('does not render refresh button when onRefresh is not provided', () => {
render()
expect(screen.queryByText('Refresh')).not.toBeInTheDocument()
})
it('renders refresh button when onRefresh is provided', () => {
render()
expect(screen.getByText('Refresh')).toBeInTheDocument()
})
it('calls onRefresh when refresh button is clicked', () => {
const onRefresh = jest.fn()
render()
fireEvent.click(screen.getByText('Refresh'))
expect(onRefresh).toHaveBeenCalledTimes(1)
})
it('disables refresh button when isLoading is true', () => {
render(
)
expect(screen.getByText('Refresh').closest('button')).toBeDisabled()
})
})