import test from 'node:test'; import assert from 'node:assert/strict'; import { buildCoverageEvidence } from '../../scripts/lib/wp7-05-coverage.mjs'; import { REQUIRED_COVERAGE_UNITS } from '../../scripts/lib/wp7-05-ui-gate.mjs'; const viewports = [ { width: 1920, height: 1080, deviceScaleFactor: 1, zoom: 100 }, { width: 1920, height: 1080, deviceScaleFactor: 1, zoom: 200 }, ]; function completeUnits() { return REQUIRED_COVERAGE_UNITS.map((page_id) => ({ page_id, states: [{ state: 'normal', screenshot_100pct: `ui/${page_id}/normal/100pct.png`, screenshot_200pct: `ui/${page_id}/normal/200pct.png`, trace: `ui/${page_id}/normal/trace.zip`, }], })); } test('builds ordered, sanitized evidence for all 22 coverage units', () => { const evidence = buildCoverageEvidence({ runId: 'wp7-05-red-001', candidateSha256: 'a'.repeat(64), coverageUnits: completeUnits(), viewports, }); assert.equal(evidence.coverage_units.length, 22); assert.equal(evidence.coverage_units[0].page_id, 'support-gate'); assert.equal(evidence.candidate_sha256, 'A'.repeat(64)); }); test('rejects absolute evidence paths and incomplete page state', () => { const units = completeUnits(); units[0].states[0].trace = 'C:\\secret\\trace.zip'; assert.throws(() => buildCoverageEvidence({ runId: 'wp7-05-red-001', candidateSha256: 'a'.repeat(64), coverageUnits: units, viewports, }), /WP7_05_UNSAFE_TRACE/); });