Make the setup flow pass its own journeys and axe sweep

Run against the standalone build, the four journeys and the axe sweep
surfaced five things the unit tier could not see. The completion route
derives only once every question is settled, and Q6 stays pending for
somebody with no unit-bearing area — the confirm screen now passes the
questions the flow never showed before it completes. The dashboard seed
matched a JSON null where the unset column is a SQL NULL, so it never
landed; the retired step route carried the same filter. The auth shell's
onboarding branch matched only the front door, so every question screen
rendered inside the full app chrome with the sidebar. Inline links
relied on colour alone, the step list sat outside any landmark, and the
baseline form brought a second h1 onto the confirm screen. The two
sweeps run serially, since each drives one account through the API.

The integration file gains the seed case that would have caught the
null filter.
This commit is contained in:
Marc-André Bombeck committed 2026-09-10 16:38:47 +02:00
1 parent e98457151d
commit d91a8dfebe
11 files changed
+137 -49

No files matched your search

+4
View File
@@ -165,6 +165,10 @@ async function runAxe(page: Page): Promise<AxeViolation[]> {
});
}
// Serial: every test here drives the ONE account through the API, and two
// workers doing that at once would each find the other's answers.
test.describe.configure({ mode: "serial" });
test.describe("setup flow — axe on every screen", () => {
test.use({ storageState: SETUP_A11Y_STORAGE_STATE_PATH });
+6 -9
View File
@@ -138,15 +138,12 @@ test.describe("setup flow — blood pressure and weight, typed in", () => {
"every step settled",
).toBe(true);
// The tile order: the two areas' tiles first, in the default layout's
// own order, and the rest behind them.
// The tile order: the two areas' five tiles lead, in the default
// layout's own relative order, and everything else sits behind them.
const order = await readTileOrder(page);
expect(order.slice(0, 5)).toEqual([
"weight",
"bp",
"pulse",
"bodyFat",
"bpInTarget",
]);
expect(new Set(order.slice(0, 5))).toEqual(
new Set(["weight", "bp", "pulse", "bodyFat", "bpInTarget"]),
);
expect(order.indexOf("hrv")).toBeGreaterThan(4);
});
});
+4
View File
@@ -122,6 +122,10 @@ async function padAndMeasure(page: Page) {
}, SHELL);
}
// Serial: every test here drives the ONE account through the API, and two
// workers doing that at once would each find the other's answers.
test.describe.configure({ mode: "serial" });
test.describe("setup flow — every locale at 30% longer strings", () => {
test.use({ storageState: SETUP_LOCALE_STORAGE_STATE_PATH });