feat(web): render similar schools on both detail templates
Inside SchoolDetailShell rather than after it, because the sticky nav's scroll-spy finds sections with getElementById and can only reach one that lives in the shell. Last in the order, and last in the nav, because the two must agree or the nav links to an anchor that was never rendered. hasSimilarSchools is optional on NavItemsInput, matching hasLocation beside it: absent has to mean "no section", and making it required would have churned ten unrelated call sites for no added safety. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
91314a80b5
commit
4e0d8bcf87
5 files changed
+86
-5
No files matched your search
@@ -172,3 +172,39 @@ describe('buildSecondaryNavItems', () => {
|
||||
expect(ids).not.toContain('history');
|
||||
});
|
||||
});
|
||||
|
||||
describe('the similar-schools nav item', () => {
|
||||
const navInput = {
|
||||
ofsted: null, admissions: null, admissionDistance: null,
|
||||
hasLocation: true, yearlyDataLength: 1,
|
||||
};
|
||||
|
||||
it('appears on both templates when the section renders', () => {
|
||||
const primary = computeSchoolFlags(primaryFixture);
|
||||
const secondary = computeSecondaryFlags(secondaryFixture);
|
||||
const input = { ...navInput, hasSimilarSchools: true };
|
||||
|
||||
expect(buildNavItems(primary, input).map((i) => i.id)).toContain('similar');
|
||||
expect(buildSecondaryNavItems(secondary, input).map((i) => i.id)).toContain('similar');
|
||||
});
|
||||
|
||||
it('is absent when the section does not render', () => {
|
||||
const primary = computeSchoolFlags(primaryFixture);
|
||||
const secondary = computeSecondaryFlags(secondaryFixture);
|
||||
const input = { ...navInput, hasSimilarSchools: false };
|
||||
|
||||
expect(buildNavItems(primary, input).map((i) => i.id)).not.toContain('similar');
|
||||
expect(buildSecondaryNavItems(secondary, input).map((i) => i.id)).not.toContain('similar');
|
||||
});
|
||||
|
||||
it('is absent when nothing says either way', () => {
|
||||
const primary = computeSchoolFlags(primaryFixture);
|
||||
expect(buildNavItems(primary, navInput).map((i) => i.id)).not.toContain('similar');
|
||||
});
|
||||
|
||||
it('comes last, because the section renders last', () => {
|
||||
const primary = computeSchoolFlags(primaryFixture);
|
||||
const ids = buildNavItems(primary, { ...navInput, hasSimilarSchools: true }).map((i) => i.id);
|
||||
expect(ids[ids.length - 1]).toBe('similar');
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user