/** * ORDER B — edge_pct DISPLAY retirement (specs/edge-pct-display-retirement.md). * * The point of these tests: the CLAIM is withdrawn from the UI, but the COMPUTATION and * the board's signed-edge sort fallback SURVIVE. Deleting those would re-break the * grade-board sort fixed on 2026-07-29. */ const fs = require('fs'); const path = require('path'); const read = (p) => fs.readFileSync(path.join(__dirname, '../../', p), 'utf8'); describe('the "% edge" claim is gone from the user-facing cards', () => { test('GradeResultCard no longer renders an edge percentage', () => { const src = read('web/src/components/vyndr/GradeResultCard.tsx'); expect(src).not.toMatch(/\{d\.edge >= 0 \? '\+' : ''\}\{d\.edge\}% edge/); expect(src).not.toMatch(/\$\{d\.edge >= 0 \? '\+' : ''\}\$\{d\.edge\}%/); // the EDGE stat cell is honest-absent expect(src).toMatch(/l: 'EDGE', v: '—'/); }); test('the alt-ladder rung no longer renders the same price-free number', () => { const src = read('web/src/components/vyndr/GradeResultCard.tsx'); expect(src).not.toMatch(/\{Number\(a\.edge\) >= 0 \? '\+' : ''\}\{a\.edge\}%/); }); test('SoccerGradeResult no longer renders "% edge"', () => { const src = read('web/src/components/SoccerGradeResult.tsx'); expect(src).not.toMatch(/\{edge_pct >= 0 \? '\+' : ''\}\{edge_pct\.toFixed\(1\)\}% edge/); }); test('no dangling unused edgeColor import (build-breaker guard)', () => { const src = read('web/src/components/vyndr/GradeResultCard.tsx'); const imports = src.match(/import \{[^}]*\} from '@\/lib\/colorContract'/); if (imports && /edgeColor/.test(imports[0])) { expect(src).toMatch(/edgeColor\(/); // imported ⇒ must be used } }); }); describe('COMPUTATION and SORT survive — removing them would re-break the board', () => { test('backend edgePctFor still computes edge_pct', () => { expect(read('src/services/intelligence/analyzeViaEngine1.js')).toMatch(/function edgePctFor/); }); test('web computeEdge still exists', () => { expect(read('web/src/lib/gradeAdapter.js')).toMatch(/function computeEdge/); }); test('the signed-edge sort fallback is INTACT (nulls last, no abs)', () => { const src = read('web/src/lib/slateAdapter.js'); expect(src).toMatch(/descNullsLast\(a\.edge, b\.edge\)/); // Strip comments before asserting the abs() bug is gone — the file's own // doc-comment QUOTES the old broken key to explain the fix, and matching // that would be a false positive. const code = src.replace(/\/\*[\s\S]*?\*\//g, '').replace(/^\s*\/\/.*$/gm, ''); expect(code).not.toMatch(/Math\.abs\(numOr\(g\.edge/); expect(code).toMatch(/edge: strictNum\(g\.edge\)/); }); test('the sort still orders a real signed edge correctly', () => { const adapter = require('../../web/src/lib/slateAdapter'); const out = adapter.selectTopGrades([ { player: 'disagrees', grade: 'B', confidence: 50, edge: -40 }, { player: 'agrees', grade: 'B', confidence: 50, edge: 12 }, { player: 'absent', grade: 'B', confidence: 50 }, ], 10).map((g) => g.player); expect(out).toEqual(['agrees', 'disagrees', 'absent']); }); test('DeskShowcase keeps its own already-honest rendering', () => { const src = read('web/src/app/pricing/DeskShowcase.tsx'); expect(src).toMatch(/edge == null \? '—'/); }); });