Files
F-r-ldraledigplannerare/frontend/e2e/support/onboarding.ts
T
jacobh2 bcc93e5c03 Test the two gestures the rework is actually about
The browser suite checked what the app renders but nothing about authoring,
which is the part that changed. It now registers a fresh account and walks
the wizard, including the case where a partner added mid-wizard has to appear
by name without navigating away first, and it drags a range on the calendar,
deletes the period, and reloads to confirm the days really went. Both are
regressions that were found by hand within the last day and would have been
found here instead.

Doing this surfaced that the age-four spec had been asserting on figures that
moved inside a collapsed section, so it had stopped checking anything. The
stale note about the retired tips page went too.
2026-09-18 00:50:01 +02:00

55 lines
2.7 KiB
TypeScript

/**
* Shared registration/onboarding steps for specs that need a brand-new,
* empty account rather than the shared demo workspace (`global-setup.ts`'s
* seeded data) — e.g. because the gesture under test needs a clean
* calendar, or because the demo user's own balance is deliberately drained
* (see `backend/scripts/seed_demo.py`'s "near-drained FP pool" for Alex,
* which a fresh drag-created period pinned to the logged-in parent would
* otherwise fail to fund).
*
* Every date here is derived from "today", never a hardcoded year.
*/
import type { Page } from '@playwright/test'
import { expect } from '@playwright/test'
import { toIsoDate, addDays } from './dates'
export function uniqueEmail(tag: string): string {
return `e2e-${tag}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}@example.com`
}
export const ONBOARDING_PASSWORD = 'E2ePassOnboard123!'
/** Registers a brand-new account through the real UI and waits for the
* onboarding wizard's first step. */
export async function registerAndReachOnboarding(page: Page, email: string, displayName: string): Promise<void> {
await page.goto('/auth')
await page.getByRole('button', { name: 'Skapa konto' }).click()
await page.getByPlaceholder('Namn').fill(displayName)
await page.getByTestId('auth-email').fill(email)
await page.getByTestId('auth-password').fill(ONBOARDING_PASSWORD)
await page.getByTestId('auth-submit').click()
await expect(page.getByTestId('onboarding')).toBeVisible({ timeout: 15_000 })
await expect(page.getByTestId('onboarding-step-child')).toBeVisible()
}
/** Step 1 of the wizard: add the child, landing on step 2 (family). */
export async function fillChildStep(page: Page, childName: string): Promise<void> {
// Safely in the past relative to "today", regardless of when this runs.
const birthDate = toIsoDate(addDays(new Date(), -400))
await page.getByLabel('Barnets namn').fill(childName)
await page.getByTestId('birth-date-input').fill(birthDate)
await page.getByRole('button', { name: 'Lägg till barn' }).click()
await expect(page.getByTestId('onboarding-step-family')).toBeVisible()
}
/** From step 2 (family), keeps the default "solo" planning mode, continues
* to step 3 (balances) and skips it — landing on the Dashboard with the
* statutory-assumption balance (no manual fetch, no drained pool). */
export async function continueSoloAndSkipBalances(page: Page): Promise<void> {
await page.getByRole('button', { name: 'Fortsätt' }).click()
await expect(page.getByTestId('onboarding-step-balances')).toBeVisible()
await page.getByRole('button', { name: 'Hoppa över för nu' }).click()
await expect(page.getByTestId('dashboard')).toBeVisible({ timeout: 15_000 })
}