Files
school_compare/nextjs-app/__tests__/lib/schoolSections.test.ts
T

145 lines
4.8 KiB
TypeScript
Raw Normal View History

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');
});
});