// Wave 2B — OFFSEASON HUB · NewsWire. Source + helper asserts. The wire is REAL // ESPN news + real injuries fed into the retired INJURY_WIRE layout; it self- // hides when both feeds are empty, timestamps are mono, and no sample data // from TerminalTemplates is imported. const fs = require('fs'); const path = require('path'); const WEB = path.join(__dirname, '..', '..', 'web', 'src'); const src = fs.readFileSync(path.join(WEB, 'components', 'vyndr', 'NewsWire.tsx'), 'utf8'); const { timeAgo, typeLabel } = require('../../web/src/lib/newsFormat'); describe('newsFormat.timeAgo — mono-timestamp source', () => { const now = Date.parse('2026-07-13T12:00:00Z'); it('absent / invalid → empty string (never a fabricated stamp)', () => { expect(timeAgo(null, now)).toBe(''); expect(timeAgo('', now)).toBe(''); expect(timeAgo('not-a-date', now)).toBe(''); }); it('minutes / hours / days ago', () => { expect(timeAgo(now - 5 * 60000, now)).toBe('5m ago'); expect(timeAgo(now - 3 * 3600000, now)).toBe('3h ago'); expect(timeAgo(now - 2 * 86400000, now)).toBe('2d ago'); }); it('sub-minute → now', () => { expect(timeAgo(now - 10000, now)).toBe('now'); }); }); describe('newsFormat.typeLabel', () => { it('maps known ESPN types', () => { expect(typeLabel('Recap')).toBe('RECAP'); expect(typeLabel('HeadlineNews')).toBe('NEWS'); }); it('falls back to a title-cased split for unknown types (never dropped)', () => { expect(typeLabel('Story')).toBe('STORY'); expect(typeLabel('')).toBe(''); }); }); describe('NewsWire.tsx source', () => { it('fetches the REAL news + injuries endpoints (no sample data)', () => { expect(src).toMatch(/\/api\/news\//); expect(src).toMatch(/\/api\/schedule\/.*\/injuries/); expect(src).not.toMatch(/import[^\n]*TerminalTemplates/); // never routes sample data expect(src).not.toContain('Jamal Murray'); // no sample constants }); it('SELF-HIDES when both feeds are empty (returns null)', () => { expect(src).toMatch(/return null/); // the guard combines news + injuries emptiness expect(src).toMatch(/news\.length === 0 && inj\.length === 0/); }); it('renders real items newest-first and maps them', () => { expect(src).toMatch(/news\.map/); expect(src).toMatch(/\.sort\(/); expect(src).toContain('headline'); }); it('timestamps + statuses render in mono (data-is-mono rule)', () => { expect(src).toContain('className="mono"'); expect(src).toContain('timeAgo('); }); it('links player/team via the canonical helpers', () => { expect(src).toContain('playerHref'); expect(src).toMatch(/\/team\//); }); it('data surface carries NO glitch classes', () => { expect(src).not.toMatch(/wm-tear|glitch-shift|head-tear|glitch-hover/); }); }); describe('ExploreHub mounts NewsWire', () => { const hub = fs.readFileSync(path.join(WEB, 'components', 'ExploreHub.tsx'), 'utf8'); it('imports + mounts { expect(hub).toContain('OFF_SEASON'); expect(hub).toMatch(/isOffseason/); }); });