fix(compare): stale basket fetch no longer blanks a freshly opened comparison
PR Checks / Frontend Typecheck + Tests (pull_request) Successful in 1m2s
PR Checks / Backend Smoke (pull_request) Successful in 7s
PR Checks / Build Backend (no push) (pull_request) Successful in 11s
PR Checks / Build Frontend (no push) (pull_request) Successful in 42s
PR Checks / Build Pipeline (no push) (pull_request) Successful in 10s
PR Checks / AI Code Review (Claude) (pull_request) Successful in 2m23s
PR Checks / Frontend Typecheck + Tests (pull_request) Successful in 1m2s
PR Checks / Backend Smoke (pull_request) Successful in 7s
PR Checks / Build Backend (no push) (pull_request) Successful in 11s
PR Checks / Build Frontend (no push) (pull_request) Successful in 42s
PR Checks / Build Pipeline (no push) (pull_request) Successful in 10s
PR Checks / AI Code Review (Claude) (pull_request) Successful in 2m23s
Opening a compare link while localStorage held a different basket raced a fetch for the OLD school set against the URL's SSR data; the stale response replaced comparisonData, so no active school had data and every section (including the trends chart) vanished until a hard refresh. Responses from superseded effect runs are now dropped, successful ones merge instead of replace, and the URL-seed effect re-runs when a client-side navigation changes ?urns=. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0146VHeLAWjDVE2B5uU67jCB
This commit is contained in:
@@ -239,6 +239,31 @@ test('comparing two secondary schools renders the secondary sections', async ({
|
||||
await expect(page.getByText(/No primary schools in your comparison/)).toHaveCount(0);
|
||||
});
|
||||
|
||||
test('opening a different compare link after a previous comparison still renders', async ({ page }) => {
|
||||
// Regression: the first visit stores a basket in localStorage; opening a
|
||||
// link for a DIFFERENT school set then raced a stale fetch for the stored
|
||||
// basket against the new SSR data, blanking every section (including the
|
||||
// trends chart) until a hard refresh.
|
||||
const [s0, s1] = await twoSecondaryUrns(page);
|
||||
const [p0, p1] = await twoPrimaryUrns(page);
|
||||
|
||||
await page.goto(`/compare?urns=${s0},${s1}`);
|
||||
await expect(page.getByRole('heading', { name: 'At a glance' }).first()).toBeVisible({
|
||||
timeout: 15_000,
|
||||
});
|
||||
|
||||
await page.goto(`/compare?urns=${p0},${p1}`);
|
||||
await expect(page.getByRole('heading', { name: 'At a glance' }).first()).toBeVisible({
|
||||
timeout: 15_000,
|
||||
});
|
||||
// Give any straggling stale response time to land, then confirm the new
|
||||
// comparison is still on screen.
|
||||
await page.waitForTimeout(1500);
|
||||
await expect(page.getByRole('heading', { name: 'At a glance' }).first()).toBeVisible();
|
||||
await expect(page.getByRole('heading', { name: 'Explore trends' }).first()).toBeVisible();
|
||||
await expect(page.locator(`a[href*="${p0}"]`).first()).toBeVisible();
|
||||
});
|
||||
|
||||
test('compare chart on mobile shows school chips with tap-to-focus', async ({ page }) => {
|
||||
await page.setViewportSize({ width: 390, height: 844 });
|
||||
|
||||
|
||||
Reference in New Issue
Block a user