fix(compare): expert sign-off must-fixes — phase-matched admissions, Ofsted sentinel codes, selective-school copy
PR Checks / Frontend Typecheck + Tests (pull_request) Successful in 1m4s
PR Checks / Backend Smoke (pull_request) Successful in 7s
PR Checks / Build Backend (no push) (pull_request) Successful in 17s
PR Checks / Build Frontend (no push) (pull_request) Successful in 46s
PR Checks / Build Pipeline (no push) (pull_request) Successful in 10s
PR Checks / AI Code Review (Claude) (pull_request) Successful in 2m53s
PR Checks / Frontend Typecheck + Tests (pull_request) Successful in 1m4s
PR Checks / Backend Smoke (pull_request) Successful in 7s
PR Checks / Build Backend (no push) (pull_request) Successful in 17s
PR Checks / Build Frontend (no push) (pull_request) Successful in 46s
PR Checks / Build Pipeline (no push) (pull_request) Successful in 10s
PR Checks / AI Code Review (Claude) (pull_request) Successful in 2m53s
M1: admissions rounds are now selected by the active phase tab (admissionsForPhase) — an all-through school's Year 7 round no longer masquerades as Reception odds beside pure primaries; honest per-cell and section fallbacks name the round (Reception / Year 7). M2: Ofsted sentinel codes (9 = not applicable) never render as judgement chips, and the sixth-form judgement — previously dropped — now renders for schools that have one. M3: 'What this means' is phase- and type-aware: selective schools get entrance-test framing, secondary faith schools a faith-criteria note, and the primaries' distance template never appears on the secondary tab (admissions_policy now exposed in compare school_info). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0146VHeLAWjDVE2B5uU67jCB
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
|
||||
import {
|
||||
OFSTED_LEGACY_GRADES,
|
||||
admissionsForPhase,
|
||||
ofstedDisplay,
|
||||
progressBand,
|
||||
rcAreaLabel,
|
||||
@@ -188,6 +189,44 @@ describe('summariseAdmissions', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('admissionsForPhase', () => {
|
||||
const row = (year: number, school_phase: string | null): SchoolAdmissions =>
|
||||
({ year, school_phase, places_offered: 100, total_applications: 200, first_preference_offer_pct: 80 }) as SchoolAdmissions;
|
||||
|
||||
it('returns the latest round matching the active phase', () => {
|
||||
const data = {
|
||||
admissions: row(202627, 'Secondary'),
|
||||
admissions_history: [row(202526, 'Secondary'), row(202526, 'Primary'), row(202425, 'Primary')],
|
||||
};
|
||||
expect(admissionsForPhase(data, true)?.year).toBe(202627);
|
||||
expect(admissionsForPhase(data, false)?.year).toBe(202526);
|
||||
expect(admissionsForPhase(data, false)?.school_phase).toBe('Primary');
|
||||
});
|
||||
|
||||
it("never substitutes the other phase's round (all-through with Year 7 data only)", () => {
|
||||
const data = {
|
||||
admissions: row(202627, 'Secondary'),
|
||||
admissions_history: [row(202526, 'Secondary')],
|
||||
};
|
||||
expect(admissionsForPhase(data, false)).toBeNull();
|
||||
expect(admissionsForPhase(data, true)?.year).toBe(202627);
|
||||
});
|
||||
|
||||
it('uses untagged legacy rows only when no row carries a phase', () => {
|
||||
const untagged = { admissions: row(202627, null), admissions_history: [row(202526, null)] };
|
||||
expect(admissionsForPhase(untagged, false)?.year).toBe(202627);
|
||||
expect(admissionsForPhase(untagged, true)?.year).toBe(202627);
|
||||
|
||||
const mixed = { admissions: row(202627, 'Secondary'), admissions_history: [row(202526, null)] };
|
||||
expect(admissionsForPhase(mixed, false)).toBeNull();
|
||||
});
|
||||
|
||||
it('handles missing data', () => {
|
||||
expect(admissionsForPhase(null, false)).toBeNull();
|
||||
expect(admissionsForPhase({ admissions: null, admissions_history: [] }, true)).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
describe('progressBand', () => {
|
||||
it('CI entirely above zero → above', () => {
|
||||
expect(progressBand(1.2, 0.4, 2.0)).toBe('above');
|
||||
|
||||
Reference in New Issue
Block a user