feat(places): name every authority a place sits in
SW19 is mostly Merton but partly Wandsworth, and the page said only Merton. The cause was one field doing two jobs: _parent_authority takes the modal authority, which is right for a 301 target and wrong as a statement about where a place is. This is not a corner case. A quarter of viable outcodes (425 of 1,760) and a third of viable towns (263 of 783) cross an authority boundary — Bedford the town spans Bedford and Central Bedfordshire. Place now carries `authorities`, every authority holding at least a tenth of the schools and at least two of them, largest first. parent_authority stays single and unchanged, because a redirect still needs one target. The share threshold exists because GIAS carries postcode errors: EN6 lists two Shropshire schools among fourteen in Hertfordshire, and a bare "any authority present" rule would print those as though they were real. A place too small or too fragmented to clear the threshold still names its largest, so the page never goes silent about where it is. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015mWQnpye9F299NVRCCSRvj
This commit is contained in:
1 parent
4cea26b813
commit
1cb5314c53
7 files changed
+214
-6
No files matched your search
@@ -1885,3 +1885,29 @@ test('no page title repeats the brand', async ({ page }) => {
|
||||
expect(brands, `${path} repeats the brand: ${title}`).toBeLessThanOrEqual(1);
|
||||
}
|
||||
});
|
||||
|
||||
test('a place straddling a boundary names every authority it sits in', async ({ page }) => {
|
||||
// A quarter of outcodes and a third of towns cross an authority boundary —
|
||||
// SW19 is mostly Merton but partly Wandsworth. Naming only the largest
|
||||
// asserts something false about the place.
|
||||
const { places } = await (await page.request.get('/api/places')).json();
|
||||
const outcode = places.find((p: { kind: string }) => p.kind === 'outcode');
|
||||
expect(outcode).toBeTruthy();
|
||||
|
||||
// Find any place the registry reports as straddling.
|
||||
let straddling: { kind: string; slug: string } | null = null;
|
||||
for (const p of places.filter((p: { kind: string }) => p.kind === 'outcode').slice(0, 40)) {
|
||||
const d = await (await page.request.get(`/api/places/outcode/${p.slug}`)).json();
|
||||
if ((d.place.authorities ?? []).length > 1) { straddling = p; break; }
|
||||
}
|
||||
test.skip(!straddling, 'no straddling outcode found in the sample');
|
||||
|
||||
const detail = await (await page.request.get(
|
||||
`/api/places/outcode/${straddling!.slug}`)).json();
|
||||
await page.goto(`/schools/near/${straddling!.slug}`);
|
||||
|
||||
for (const a of detail.place.authorities) {
|
||||
await expect(page.locator(`a[href="/schools/authority/${a.slug}"]`).first())
|
||||
.toBeVisible();
|
||||
}
|
||||
});
|
||||
Reference in new issue
Block a user