90 lines
3.7 KiB
TypeScript
90 lines
3.7 KiB
TypeScript
/**
|
|||
|
|
* Last distance offered, rendered on both detail templates.
|
||
|
|
*
|
||
|
|
* The figure is the one number on these pages that a parent may act on — it is
|
||
|
|
* easy to read as "we live inside the catchment, we will get a place". These
|
||
|
|
* tests pin the things that stop it being read that way: the year is always
|
||
|
|
* present, the caveat is always present, and the blanket "not available"
|
||
|
|
* sentence appears only when it is actually true.
|
||
|
|
*/
|
||
|
|
|
||
|
|
import { screen } from '@testing-library/react';
|
||
|
|
import { renderSchoolDetail, renderSecondarySchoolDetail } from '../support/renderSchoolDetail';
|
||
|
|
import { primaryFixture, secondaryFixture } from '../support/schoolFixtures';
|
||
|
|
import type { SchoolAdmissionDistance } from '@/lib/types';
|
||
|
|
|
||
|
|
const cutoff = (over: Partial<SchoolAdmissionDistance> = {}): SchoolAdmissionDistance => ({
|
||
|
|
year: 2025,
|
||
|
|
distance_m: 500,
|
||
|
|
route_count: 1,
|
||
|
|
la_name: 'Camden',
|
||
|
|
distance_unit_raw: 'miles',
|
||
|
|
...over,
|
||
|
|
});
|
||
|
|
|
||
|
|
describe('primary detail page', () => {
|
||
|
|
it('shows the figure with the year it belongs to', () => {
|
||
|
|
renderSchoolDetail({ ...primaryFixture, admissionDistance: cutoff({ distance_m: 772.49, year: 2024 }) });
|
||
|
|
|
||
|
|
expect(screen.getByText('0.48 miles')).toBeInTheDocument();
|
||
|
|
expect(screen.getByText(/Last distance offered/)).toHaveTextContent('September 2024');
|
||
|
|
});
|
||
|
|
|
||
|
|
it('never shows the figure without saying it is not a catchment', () => {
|
||
|
|
renderSchoolDetail({ ...primaryFixture, admissionDistance: cutoff() });
|
||
|
|
|
||
|
|
expect(screen.getByText(/not a fixed catchment/)).toBeInTheDocument();
|
||
|
|
expect(screen.getByText(/moves every year/)).toBeInTheDocument();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('flags that a banded school\'s figure is the widest of several routes', () => {
|
||
|
|
renderSchoolDetail({ ...primaryFixture, admissionDistance: cutoff({ route_count: 4 }) });
|
||
|
|
|
||
|
|
expect(screen.getByText(/4 admission routes/)).toBeInTheDocument();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('renders nothing distance-related when the LA publishes none', () => {
|
||
|
|
renderSchoolDetail({ ...primaryFixture, admissionDistance: null });
|
||
|
|
|
||
|
|
expect(screen.queryByText(/Last distance offered/)).not.toBeInTheDocument();
|
||
|
|
expect(screen.queryByText(/not a fixed catchment/)).not.toBeInTheDocument();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('carries the figure even with no EES admissions row', () => {
|
||
|
|
// The two sources are independent; this school has a cut-off and no
|
||
|
|
// admissions figures. Before this feature the section did not render at all.
|
||
|
|
renderSchoolDetail({
|
||
|
|
...primaryFixture,
|
||
|
|
admissions: null,
|
||
|
|
admissionsHistory: [],
|
||
|
|
admissionDistance: cutoff({ distance_m: 1421.05 }),
|
||
|
|
});
|
||
|
|
|
||
|
|
expect(screen.getByText('0.88 miles')).toBeInTheDocument();
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe('secondary detail page', () => {
|
||
|
|
it('shows the figure with the year it belongs to', () => {
|
||
|
|
renderSecondarySchoolDetail({ ...secondaryFixture, admissionDistance: cutoff({ distance_m: 3472.96 }) });
|
||
|
|
|
||
|
|
expect(screen.getByText('2.16 miles')).toBeInTheDocument();
|
||
|
|
expect(screen.getByText(/Last distance offered/)).toHaveTextContent('September 2025');
|
||
|
|
});
|
||
|
|
|
||
|
|
it('drops the blanket "not available" line once a distance exists', () => {
|
||
|
|
renderSecondarySchoolDetail({ ...secondaryFixture, admissionDistance: cutoff() });
|
||
|
|
|
||
|
|
expect(screen.queryByText(/has not published a cut-off distance/)).not.toBeInTheDocument();
|
||
|
|
expect(screen.getByText(/not a fixed catchment/)).toBeInTheDocument();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('names the authority that would hold the data when there is none', () => {
|
||
|
|
// The old copy asserted "Historical distance cut-off data is not available
|
||
|
|
// for this school" on every secondary page, including the ones whose
|
||
|
|
// council does publish it.
|
||
|
|
renderSecondarySchoolDetail({ ...secondaryFixture, admissionDistance: null });
|
||
|
|
|
||
|
|
expect(screen.getByText(/has not published a cut-off distance/)).toBeInTheDocument();
|
||
|
|
});
|
||
|
|
});
|