diff --git a/web/src/routes/admin/tuning/tuning.test.ts b/web/src/routes/admin/tuning/tuning.test.ts index 49a91bac..d0e2f63c 100644 --- a/web/src/routes/admin/tuning/tuning.test.ts +++ b/web/src/routes/admin/tuning/tuning.test.ts @@ -200,10 +200,13 @@ describe('Admin tuning page', () => { // Radio's latest week: 40% skip over 15 plays; Discover's: 60% over 5. expect(screen.getByText('/15')).toBeInTheDocument(); expect(screen.getByText('/5')).toBeInTheDocument(); - // Completion columns are unchanged and still bare percentages — radio 70%, - // discover 40%. + // Completion columns are unchanged and still bare percentages — radio 70%. expect(screen.getByText('70%')).toBeInTheDocument(); - expect(screen.getByText('40%')).toBeInTheDocument(); + // '40%' is now genuinely ambiguous: radio's latest SKIP rate and discover's + // latest COMPLETION are both 40%. testing-library matches an element's own + // direct text nodes, so the skip cell still matches despite its trailing + // play-count span. Assert the count rather than pretending it's unique. + expect(screen.getAllByText('40%')).toHaveLength(2); // The window/last-week distinction has to be visible in the headers, or the // Plays total reads as the denominator of the skip rate. That misreading is // what #2495 was filed over. diff --git a/web/src/routes/settings/+page.svelte b/web/src/routes/settings/+page.svelte index 96a950b6..17fbabc5 100644 --- a/web/src/routes/settings/+page.svelte +++ b/web/src/routes/settings/+page.svelte @@ -405,6 +405,7 @@ {pct(m.skip_rate)} {#if m.skip_delta} {deltaText(m.skip_delta)} {/if} @@ -412,6 +413,7 @@ {pct(m.avg_completion)} {#if m.completion_delta} {deltaText(m.completion_delta)} {/if} @@ -439,6 +441,7 @@ {pct(b.skip_rate)} {#if b.skip_delta} {deltaText(b.skip_delta)} {/if} @@ -446,6 +449,7 @@ {pct(b.avg_completion)} {#if b.completion_delta} {deltaText(b.completion_delta)} {/if} diff --git a/web/src/routes/settings/settings.test.ts b/web/src/routes/settings/settings.test.ts index 53179a6a..7923241b 100644 --- a/web/src/routes/settings/settings.test.ts +++ b/web/src/routes/settings/settings.test.ts @@ -269,16 +269,18 @@ describe('Settings page — Recommendation metrics card', () => { render(SettingsPage); await waitFor(() => expect(screen.getByText('Discover')).toBeInTheDocument()); - // The indistinguishable skip delta is prefixed and explained on hover. - const skip = screen.getByText('≈-13'); - expect(skip).toBeInTheDocument(); + // Targeted by test id rather than text: the legend below the table also + // contains a "≈", so matching on the glyph finds the explanation instead of + // the delta. (It did, on the first attempt at this test.) + const skip = screen.getByTestId('skip-delta-discover'); + expect(skip).toHaveTextContent('≈-13'); expect(skip).toHaveAttribute('title', expect.stringContaining('not distinguishable from zero')); // It must NOT be coloured as a real regression/improvement. expect(skip.className).toContain('opacity-60'); // The completion delta clears its margin, so it renders plainly. - const completion = screen.getByText('+28'); - expect(completion).toBeInTheDocument(); + const completion = screen.getByTestId('completion-delta-discover'); + expect(completion).toHaveTextContent('+28'); expect(completion.className).not.toContain('opacity-60'); // And the legend explains the glyph rather than leaving it a mystery. @@ -303,7 +305,8 @@ describe('Settings page — Recommendation metrics card', () => { }; render(SettingsPage); await waitFor(() => expect(screen.getByText('Radio')).toBeInTheDocument()); - expect(screen.queryByText(/≈/)).not.toBeInTheDocument(); + expect(screen.queryByTestId('skip-delta-radio')).not.toBeInTheDocument(); + expect(screen.queryByTestId('completion-delta-radio')).not.toBeInTheDocument(); }); test('surfaces without a breakdown render no toggle and no sub-rows', async () => {