/** * v0.36.1.0 (T15 / D23) — server-rendered SVG renderer tests. * * Pure functions, hermetic. No DOM, no JSDOM. Asserts structural * properties of the emitted SVG markup. */ import { describe, test, expect } from 'bun:test'; import { renderBrierTrend, renderDomainBars, renderAbandonedThreadsCard, renderPatternStatementsCard, escapeXml, } from '../src/core/calibration/svg-renderer.ts'; describe('escapeXml', () => { test('escapes the 5 mandatory entities', () => { expect(escapeXml('')).toBe('<script>&"'</script>'); }); }); describe('renderBrierTrend', () => { test('empty series → empty-state SVG with placeholder text', () => { const out = renderBrierTrend({ series: [] }); expect(out).toContain('No Brier-trend data yet'); expect(out).toContain('=2 points', () => { const out = renderBrierTrend({ series: [ { date: '2025-01-01', brier: 0.22 }, { date: '2025-02-01', brier: 0.2 }, { date: '2025-03-01', brier: 0.18 }, ], }); expect(out).toContain(' { const out = renderBrierTrend({ series: [ { date: '2025-01-01', brier: 0.9 }, { date: '2025-02-01', brier: 0.1 }, ], }); expect(out).toContain(' { const out = renderBrierTrend({ series: [{ date: '2025-01-01', brier: 0.2 }] }); expect(out).toContain('#0a0a0f'); // bg expect(out).toContain('#3b82f6'); // accent }); test('XSS-safe on attacker-controlled date strings', () => { const out = renderBrierTrend({ series: [ { date: '', brier: 0.2 }, { date: '2025-02-01', brier: 0.18 }, ], }); expect(out).not.toContain('' }, ]); expect(out).not.toContain('