import { computeSchoolFlags, buildNavItems, computeSecondaryFlags, buildSecondaryNavItems, } from '@/lib/schoolSections'; import { primaryFixture, secondaryFixture, allThroughFixture, specialFixture, } from '../support/schoolFixtures'; describe('computeSchoolFlags', () => { it('treats an all-through school as both primary-capable and secondary', () => { const f = computeSchoolFlags(allThroughFixture); expect(f.isAllThrough).toBe(true); expect(f.isSecondary).toBe(true); expect(f.hasKS2Results).toBe(true); expect(f.hasKS4Results).toBe(true); }); it('classifies an ordinary primary', () => { const f = computeSchoolFlags(primaryFixture); expect(f.isPrimary).toBe(true); expect(f.isSecondary).toBe(false); expect(f.hasKS2Results).toBe(true); expect(f.hasKS4Results).toBe(false); }); it('classifies an ordinary secondary', () => { const f = computeSchoolFlags(secondaryFixture); expect(f.isSecondary).toBe(true); expect(f.isAllThrough).toBe(false); expect(f.hasKS4Results).toBe(true); }); it('suppresses the KS2 comparison for a special school', () => { const f = computeSchoolFlags(specialFixture); expect(f.isSpecial).toBe(true); expect(f.suppressKs2Comparison).toBe(true); expect(f.suppressKs4Comparison).toBe(true); }); it('treats an all-zero KS2 row as a placeholder', () => { const f = computeSchoolFlags(specialFixture); expect(f.ks2Placeholder).toBe(true); }); it('does not suppress comparison for an ordinary primary', () => { const f = computeSchoolFlags(primaryFixture); expect(f.isSpecial).toBe(false); expect(f.suppressKs2Comparison).toBe(false); }); it('detects a gender split only when census counts are present', () => { expect(computeSchoolFlags(primaryFixture).hasGenderSplit).toBe(true); expect( computeSchoolFlags({ ...primaryFixture, census: null }).hasGenderSplit, ).toBe(false); }); }); describe('buildNavItems', () => { it('omits sections with no data', () => { const flags = computeSchoolFlags(specialFixture); const ids = buildNavItems(flags, { ofsted: null, admissions: null, yearlyDataLength: 1, }).map((n) => n.id); expect(ids).not.toContain('ofsted'); expect(ids).not.toContain('admissions'); expect(ids).toContain('history'); }); it('labels the results section by phase', () => { const label = (fixture: any) => { const flags = computeSchoolFlags(fixture); return buildNavItems(flags, { ofsted: fixture.ofsted, admissions: fixture.admissions, yearlyDataLength: fixture.yearlyData.length, }).find((n) => n.id === 'results')?.label; }; expect(label(primaryFixture)).toBe('SATs'); expect(label(secondaryFixture)).toBe('GCSEs'); expect(label(allThroughFixture)).toBe('Results'); }); it('keeps the engagement-led ordering', () => { const flags = computeSchoolFlags(primaryFixture); const ids = buildNavItems(flags, { ofsted: primaryFixture.ofsted, admissions: primaryFixture.admissions, yearlyDataLength: primaryFixture.yearlyData.length, }).map((n) => n.id); expect(ids).toEqual([ 'ofsted', 'results', 'admissions', 'inclusion', 'history', 'school-life', 'local-area', 'finances', ]); }); }); describe('computeSecondaryFlags', () => { it('reads results and sixth form from the secondary fixture', () => { const f = computeSecondaryFlags(secondaryFixture); expect(f.hasResults).toBe(true); expect(f.hasSixthForm).toBe(false); expect(f.hasWellbeing).toBe(true); }); it('reports sixth form when GIAS flags it', () => { expect(computeSecondaryFlags(allThroughFixture).hasSixthForm).toBe(true); }); it('suppresses the comparison for a special school', () => { const f = computeSecondaryFlags(specialFixture); expect(f.isSpecial).toBe(true); expect(f.suppressComparison).toBe(true); }); it('does not flag Progress 8 as suspended for pre-2024/25 cohorts', () => { expect(computeSecondaryFlags(secondaryFixture).p8Suspended).toBe(false); }); }); describe('buildSecondaryNavItems', () => { it('uses the secondary section ids', () => { const flags = computeSecondaryFlags(secondaryFixture); const ids = buildSecondaryNavItems(flags, { ofsted: secondaryFixture.ofsted, admissions: secondaryFixture.admissions, yearlyDataLength: secondaryFixture.yearlyData.length, }).map((n) => n.id); expect(ids).toEqual(['ofsted', 'gcse', 'admissions', 'history', 'wellbeing', 'finances']); }); it('gates History on more than one year, unlike the primary page', () => { const flags = computeSecondaryFlags(secondaryFixture); const ids = buildSecondaryNavItems(flags, { ofsted: null, admissions: null, yearlyDataLength: 1, }).map((n) => n.id); expect(ids).not.toContain('history'); }); });