mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-09 13:01:00 +00:00
test(e2e): unblock chart-overlay toggle + mobile x-axis tick wait
Two specs have been red on main since the v1.4.20 hero rewrite, spamming
the GitHub Actions failure mailer on every push:
1. chart-overlay-controls.spec.ts — the test opens the dashboard's chart
overlay popover and toggles 'target range' on. The Radix dropdown
content portals to the document body, so on the 393×851 Pixel 5 and
near the bottom of the 1280×720 desktop viewport the toggle's bbox
lands below the fold. `click({force:true})` still asserts the bbox
intersects the viewport and refuses to fire, and
`scrollIntoViewIfNeeded` on the portalled content is a no-op because
the portal sits outside the page scroll container. Switching to
`dispatchEvent('click')` synthesises a click directly on the element
without any actionability or viewport check; Radix Switch's native
click handler fires `onCheckedChange` and the PUT lands as expected.
2. charts-mobile.spec.ts — the 30-day-window tick-count assertion times
out waiting for `.recharts-xAxis .recharts-cartesian-axis-tick text`
to be visible. Recharts does paint the <text> ticks into the SVG, but
the chart card on Pixel-5 is taller than the 851-px viewport, so the
bottom-anchored x-axis labels stay below the fold even after
`scrollIntoViewIfNeeded` brings the card's top into view. The
downstream `evaluate` only needs the ticks attached to the DOM (it
counts them via querySelectorAll), so `state: 'attached'` is both
sufficient and viewport-tolerant.
Neither fix changes the assertion semantics — both still exercise the
same user-visible behaviour against the same selectors. The CI mailer
should fall silent after the next push.
This commit is contained in:
1 parent
9e551b7868
commit
25477e8aea
2 files changed
+21
-7
No files matched your search
@@ -120,11 +120,18 @@ test.describe("chart overlay controls", () => {
|
||||
await expect(targetRangeToggle).toBeVisible({ timeout: 5_000 });
|
||||
|
||||
// Toggle target-range on. Radix Switch is a button[role=switch].
|
||||
// Force the click — `scrollIntoViewIfNeeded()` on the portalled
|
||||
// dropdown content is a no-op (the Radix portal sits at the body
|
||||
// root, outside the page scroll container) so we bypass Playwright's
|
||||
// viewport check directly.
|
||||
await targetRangeToggle.click({ force: true });
|
||||
// The Radix dropdown content portals to the body root and can land
|
||||
// below the viewport on a 393×851 Pixel 5 (or near the bottom edge
|
||||
// on the 1280×720 desktop profile). Playwright's `click({force:true})`
|
||||
// still computes the element's bbox against the viewport and refuses
|
||||
// to dispatch the click when it falls outside, so neither
|
||||
// `scrollIntoViewIfNeeded()` on the portalled content nor `force`
|
||||
// can rescue the action. `dispatchEvent('click')` synthesises a DOM
|
||||
// click on the element without any viewport / actionability check,
|
||||
// which is exactly the semantic we want for an off-screen portalled
|
||||
// Radix Switch — and it still fires the onCheckedChange handler that
|
||||
// the surface listens for.
|
||||
await targetRangeToggle.dispatchEvent("click");
|
||||
|
||||
// The PUT fires once for the toggle change.
|
||||
await expect.poll(() => putRequestCount).toBeGreaterThan(0);
|
||||
|
||||
@@ -211,11 +211,18 @@ test.describe("charts — mobile-viewport regression", () => {
|
||||
await firstChartCard.waitFor({ state: "visible", timeout: 10_000 });
|
||||
await firstChartCard.scrollIntoViewIfNeeded();
|
||||
// After scroll, give the chart a beat to lay out under the new
|
||||
// measured size before counting ticks.
|
||||
// measured size before counting ticks. The chart card on Pixel-5
|
||||
// is taller than the 851-px viewport, so `scrollIntoViewIfNeeded`
|
||||
// brings the card's TOP into view but the bottom-anchored x-axis
|
||||
// labels can remain below the fold — and `waitFor({state:"visible"})`
|
||||
// would then time out even though Recharts has already painted the
|
||||
// <text> ticks into the DOM. The subsequent `evaluate` only needs
|
||||
// them attached, not visually on-screen, so `state: "attached"` is
|
||||
// both sufficient and stable against viewport overflow.
|
||||
await page
|
||||
.locator(".recharts-xAxis .recharts-cartesian-axis-tick text")
|
||||
.first()
|
||||
.waitFor({ state: "visible", timeout: 10_000 });
|
||||
.waitFor({ state: "attached", timeout: 10_000 });
|
||||
|
||||
// Recharts lays its visible tick labels under
|
||||
// `.recharts-xAxis .recharts-cartesian-axis-tick`. Count the ones
|
||||
|
||||
Reference in new issue
Block a user