// Shared sign-in prelude for the pre-auth-gate E2E suites. Each suite creates // its own fresh family per run (unique name) so accumulated data from a // previous run's assets/hibah/etc. can never bleed into another run's // percentage/coverage assertions — same isolation the old per-context // localStorage gave for free, now done explicitly since data is shared and // persistent in Supabase instead of wiped with the browser context. const OWNER_EMAIL = 'nurfalah.e2etest.owner@gmail.com'; const OWNER_PASSWORD = 'TestPassword123!'; async function signInFreshFamily(page, BASE, familyLabel) { await page.goto(BASE, { waitUntil: 'networkidle' }); await page.locator('.field:has-text("Email") input').fill(OWNER_EMAIL); await page.locator('.field:has-text("Password") input').fill(OWNER_PASSWORD); await page.locator('button.btn-primary', { hasText: 'Sign in' }).click(); await page.waitForTimeout(1500); const familyName = `${familyLabel || 'E2E'} ${Date.now()}-${Math.floor(Math.random() * 1e6)}`; await page.locator('.field:has-text("Family name") input').fill(familyName); await page.locator('button.btn-primary', { hasText: 'Create family' }).click(); await page.waitForTimeout(1200); return familyName; } // Hub map mirroring App.svelte's HUBS config — the nav went from a single // flat 22-item strip to 5 bottom-nav hubs, each revealing its own sub-nav. // Reaching any given tab is now a two-step click (hub, then sub-tab) // instead of one, so every test goes through this helper rather than // hardcoding the old single-click selector. const HUB_OF_TAB = { 'Coverage': 'Home', 'Assets': 'Estate', 'Faraid': 'Estate', 'Insurance': 'Estate', 'Wassiyah': 'Estate', 'Hibah': 'Estate', 'Family Waqf': 'Estate', 'Nominate': 'Estate', 'Claims (H2)': 'Estate', 'Zakat': 'Giving', 'Sadaqah': 'Giving', 'Khairat': 'Giving', 'Support': 'Giving', 'Tree': 'Family', 'Trigger': 'Family', 'Mutawalli': 'Family', 'Manage': 'Family', 'Neighbourhood': 'Family', 'Prayer Times': 'Daily', 'Qibla': 'Daily', 'Quran': 'Daily', 'Locate': 'Daily' }; /** Navigates to a tab by its old flat label — clicks the owning hub first (if not already active), then the sub-tab. 'Settings' is a special case (a header icon, not a hub). */ async function gotoTab(page, label) { if (label === 'Settings') { await page.locator('button[aria-label="Settings"]').click(); return; } const hub = HUB_OF_TAB[label]; if (!hub) throw new Error(`gotoTab: unknown tab label "${label}"`); const hubBtn = page.locator(`.hub-tab[aria-label="${hub}"]`); const alreadyActive = await hubBtn.evaluate(el => el.classList.contains('active')).catch(() => false); if (!alreadyActive) { await hubBtn.click(); await page.waitForTimeout(200); } if (hub !== 'Home') { await page.locator(`.subnav .tab[aria-label="${label}"]`).click(); } } module.exports = { signInFreshFamily, OWNER_EMAIL, OWNER_PASSWORD, gotoTab };