import { readFileSync } from 'node:fs'; import { renderToStaticMarkup } from 'react-dom/server'; import { describe, expect, it } from 'vitest'; import { DonutMetricCard } from '../../src/components/DonutMetricCard/DonutMetricCard'; const styles = readFileSync(new URL('../../src/styles/components.css', import.meta.url), 'utf8'); const tokens = readFileSync(new URL('../../src/styles/ui-tokens.css', import.meta.url), 'utf8'); describe('DonutMetricCard binding design contract', () => { it('renders the reference card structure, 270-degree progress and visible values', () => { const html = renderToStaticMarkup( ); expect(html).toContain('class="donut-metric-card donut-metric-card--deviation"'); expect(html).toContain('class="donut-metric-card__title">Deviation'); expect(html).toContain('stroke-dasharray="75 25"'); expect(html).toContain('stroke-dasharray="38.25 61.75"'); expect(html).toContain('453'); expect(html).toContain('51%'); expect(html).toContain('--donut-progress-dash:38.25 61.75'); expect(styles).toContain('@keyframes donut-progress-build'); expect(styles).toContain('@keyframes donut-accent-build'); expect(styles).toContain('animation: donut-progress-build var(--dur-data-build) var(--ease-data-build) both;'); expect(tokens).toContain('--dur-data-build: 700ms;'); }); it('renders an empty progress arc at zero and clamps percentages', () => { const zero = renderToStaticMarkup( ); const clamped = renderToStaticMarkup( ); expect(zero).toContain('stroke-dasharray="0 100"'); expect(zero).toContain('0%'); expect(clamped).toContain('stroke-dasharray="75 25"'); expect(clamped).toContain('100%'); expect(zero).not.toContain(' { const html = renderToStaticMarkup( ); expect(html).toContain('36%'); expect(html).not.toContain('36%'); }); it('becomes an accessible active filter control when clickable', () => { const html = renderToStaticMarkup( undefined} className="sidebar-severity-card" /> ); expect(html).toContain('type="button"'); expect(html).toContain('aria-pressed="true"'); expect(html).toContain('donut-metric-card--high sidebar-severity-card'); }); });