Files
TudorandClaude Fable 5 99b769ca9e feat(compare): fill the sticky bar's label rail with a comparison caption
'COMPARING / 3 primary schools' — 0.72rem uppercase eyebrow over a
0.95rem semibold count, sized to sit alongside the 0.92rem chip names
without dominating. Desktop only; mobile pills unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0146VHeLAWjDVE2B5uU67jCB
2026-07-16 21:27:25 +01:00

79 lines
2.5 KiB
TypeScript

/**
* Regression: an all-secondary comparison must render the secondary sections.
*
* The basket hydrates from the URL a beat after mount, so the auto-phase
* effect must re-run once selectedSchools arrives — with deps of only
* [comparisonData] it fired once against an empty basket, bailed, and the
* page stayed on an empty "primary" tab ("No primary schools in your
* comparison") even though all schools were secondary.
*/
import { render, screen, waitFor } from '@testing-library/react';
import { ComparisonView } from '@/components/ComparisonView';
import { ComparisonProvider } from '@/context/ComparisonProvider';
import type { ComparisonData, School } from '@/lib/types';
const fetchComparison = jest.fn();
jest.mock('@/lib/api', () => ({
fetchComparison: (...args: unknown[]) => fetchComparison(...args),
}));
jest.mock('@/lib/analytics', () => ({ track: jest.fn() }));
function secondarySchool(urn: number, name: string): School {
return {
urn,
school_name: name,
local_authority: 'Testshire',
school_type: 'Academy converter',
attainment_8_score: 55,
phase: 'Secondary',
} as School;
}
function data(urn: number, name: string): ComparisonData {
return {
school_info: secondarySchool(urn, name),
yearly_data: [{ year: 202425, attainment_8_score: 55 }] as ComparisonData['yearly_data'],
ofsted: null,
census: null,
admissions: null,
admissions_history: [],
deprivation: null,
};
}
const INITIAL_DATA = {
'300': data(300, 'Gamma High'),
'400': data(400, 'Delta Academy'),
};
test('an all-secondary comparison renders the sections, not an empty primary tab', async () => {
render(
<ComparisonProvider>
<ComparisonView
initialData={INITIAL_DATA}
initialNationalAverages={{
year: 202425,
primary: {},
secondary: { attainment_8_score: 46 },
by_year: [],
}}
initialBenchmarks={undefined}
initialUrns={[300, 400]}
metrics={[]}
selectedMetric="attainment_8_score"
/>
</ComparisonProvider>,
);
await waitFor(() => {
expect(screen.getByRole('heading', { name: 'At a glance' })).toBeInTheDocument();
});
expect(screen.getAllByText('Gamma High').length).toBeGreaterThan(0);
expect(screen.queryByText(/No primary schools in your comparison/)).toBeNull();
// The sticky bar's rail caption reflects the active phase and count.
expect(screen.getByText('2 secondary schools')).toBeInTheDocument();
expect(fetchComparison).not.toHaveBeenCalled();
});