// tests/e2e/04-career-explorer.core.spec.mjs // @ts-check import { test, expect } from '@playwright/test'; import { loadTestUser } from '../utils/testUser.js'; test.describe('@p0 Career Explorer core', () => { // Enough headroom for cold suggestion builds, but still bounded. test.setTimeout(40000); test('suggestions visible (or reload) → open modal → add to comparison (+event bridge)', async ({ page }) => { const user = loadTestUser(); const TIME = { overlayAppear: 2000, // overlay should show quickly if it appears cache: 60000, // wait for cache to populate after reload tile: 8000, // find a tile quickly once cache exists confirm: 7000, // modal/button appearances tableRow: 20000, // time for table update after Save }; // Accept alerts: inventory prompt and possible "already in comparison" duplicate let sawInventoryAlert = false; let sawDuplicateAlert = false; page.on('dialog', async d => { const msg = d.message(); if (/Interest Inventory/i.test(msg)) sawInventoryAlert = true; if (/already in comparison/i.test(msg)) sawDuplicateAlert = true; await d.accept(); }); // Helper: close any blocking overlay (priorities / meaning) by saving neutral defaults. async function closeAnyOverlay() { const overlay = page.locator('div.fixed.inset-0'); if (!(await overlay.isVisible({ timeout: 500 }).catch(() => false))) return; const dialog = overlay.locator('div[role="dialog"], div.bg-white').first(); // Select first non-empty option in each