// Session 42 — Settings page + BookChip. const fs = require('fs'); const path = require('path'); const WEB = path.join(__dirname, '..', '..', 'web', 'src'); const read = (rel) => fs.readFileSync(path.join(WEB, rel), 'utf8'); const { bookInfo } = require('../../web/src/lib/books'); describe('books lib (BookChip data)', () => { it('maps known books to brand colors (case-insensitive aliases)', () => { expect(bookInfo('DK')).toMatchObject({ name: 'DraftKings', fg: '#53D337' }); expect(bookInfo('draftkings').mono).toBe('DK'); // ESPN BET retired → theScore Bet (PENN) successor (item 7). expect(bookInfo('THESCORE')).toMatchObject({ name: 'theScore Bet', mono: 'TS' }); }); it('degrades unknown books to a neutral chip', () => { const b = bookInfo('ZZZ'); expect(b.mono).toBe('ZZZ'); expect(b.fg).toBe('#B8BCC8'); }); }); describe('Settings page', () => { const src = read('app/settings/page.tsx'); it('is a real page now (not a redirect)', () => { expect(src).not.toContain("redirect('/profile')"); expect(src).toContain("'use client'"); }); it('renders the design sections', () => { for (const label of ['ACCOUNT', 'SUBSCRIPTION', 'NOTIFICATIONS', 'DISPLAY PREFERENCES', 'RESPONSIBLE PLAY', 'DANGER ZONE']) { expect(src).toContain(label); } }); it('reads the plan tier from useAuth (consistent with nav/profile)', () => { expect(src).toContain('useAuth()'); expect(src).toContain('tierLabel'); }); it('LINKS to /settings/security (does NOT replace the MFA page)', () => { expect(src).toContain('href="/settings/security"'); }); it('danger zone delete button is gated on typing DELETE exactly', () => { expect(src).toContain("deleteText === 'DELETE'"); expect(src).toContain('disabled={!canDelete'); }); it('opens the existing Preferences modal via window.__prefs', () => { expect(src).toContain('window.__prefs'); }); it('does not fake account-deletion success', () => { // On a non-ok response we surface an honest message, not a success. expect(src).toContain('could not be completed'); }); }); describe('BookChip.tsx', () => { const src = read('components/vyndr/BookChip.tsx'); it('renders a mono tile from the books lib', () => { expect(src).toContain('bookInfo'); expect(src).toContain('className="mono"'); }); });