import * as React from 'react'; import { render, screen, fireEvent } from '@testing-library/react'; import { ValidationChecklist } from '../ValidationChecklist'; import type { ContentCheck } from '../checks'; const checks: ContentCheck[] = [ { id: 'blog-words', label: 'Blog word count', status: 'pass', detail: '450 words' }, { id: 'linkedin-words', label: 'LinkedIn word count', status: 'warn', detail: '100 words' }, { id: 'no-hype', label: 'No hype words', status: 'fail', detail: 'revolutionary' }, ]; describe('ValidationChecklist', () => { it('renders every check with its label and detail', () => { render(); expect(screen.getByText('Blog word count')).toBeInTheDocument(); expect(screen.getByText('— 450 words')).toBeInTheDocument(); expect(screen.getByText('No hype words')).toBeInTheDocument(); }); it('summarises passing count in the overall pill', () => { render(); expect(screen.getByText('1/3 passing')).toBeInTheDocument(); }); it('renders the judge verdict, scores, and expandable issues', () => { render( , ); expect(screen.getByText('AI judge')).toBeInTheDocument(); expect(screen.getByText('revise')).toBeInTheDocument(); expect(screen.getByText('Reads well but sourcing is thin.')).toBeInTheDocument(); expect(screen.getByText('clarity')).toBeInTheDocument(); // issues collapsed by default, expand on click expect(screen.queryByText('Unsupported claim')).not.toBeInTheDocument(); fireEvent.click(screen.getByText('1 issue')); expect(screen.getByText('Unsupported claim')).toBeInTheDocument(); expect(screen.getByText('Fix: Add a citation')).toBeInTheDocument(); }); it('is read-only when no onOverride is provided', () => { render(); expect(screen.queryByText('Override checks (with reason)')).not.toBeInTheDocument(); }); it('drives the override flow when onOverride is provided', () => { const onOverride = jest.fn(); render(); fireEvent.click(screen.getByText('Override checks (with reason)')); const textarea = screen.getByLabelText('Reason for overriding checks'); // empty reason keeps the confirm disabled expect(screen.getByRole('button', { name: 'Override' })).toBeDisabled(); fireEvent.change(textarea, { target: { value: 'Client approved the exception.' } }); fireEvent.click(screen.getByRole('button', { name: 'Override' })); expect(onOverride).toHaveBeenCalledWith({ overridden: true, reason: 'Client approved the exception.' }); }); it('shows an overridden banner and can clear the override', () => { const onOverride = jest.fn(); render( , ); expect(screen.getByText('Checks overridden')).toBeInTheDocument(); expect(screen.getByText('Approved by editor.')).toBeInTheDocument(); expect(screen.getByText('Overridden')).toBeInTheDocument(); fireEvent.click(screen.getByText('Clear')); expect(onOverride).toHaveBeenCalledWith({ overridden: false }); }); });