import { expect, type Page } from "@playwright/test"; /** Open the app and wait for the authenticated shell (the nav rail) to be ready. */ export async function openApp(page: Page, path = "/"): Promise { await page.goto(path); await expect(page.getByTestId("nav-feed")).toBeVisible(); } /** Click a top-level module in the nav rail and confirm it becomes the active page. */ export async function gotoPage(page: Page, id: string): Promise { await page.getByTestId(`nav-${id}`).click(); await expect(page.getByTestId(`nav-${id}`)).toHaveAttribute("aria-current", "page"); } /** * Click a channel link that is currently WITHIN the viewport — what a real user does. Never use * `.first()` for this after scrolling: the first rendered card lives in the virtualizer's overscan * ABOVE the viewport, so Playwright would scroll it into view to click it, moving the scroll * position — fatal to any test that then asserts on where the feed was. Returns false if none found. */ export async function clickVisibleChannelLink(page: Page): Promise { const links = page.getByTestId("video-card-channel").filter({ visible: true }); const viewport = page.viewportSize(); const height = viewport?.height ?? 800; const count = await links.count(); for (let i = 0; i < count; i++) { const box = await links.nth(i).boundingBox(); if (box && box.y >= 0 && box.y + box.height <= height) { await links.nth(i).click(); return true; } } return false; } /** Open the in-app player from the first feed card (clicks its thumbnail link). */ export async function openFirstVideo(page: Page): Promise { await expect(page.getByTestId("video-card").first()).toBeVisible(); await page.getByTestId("video-card").first().getByRole("link").first().click(); await expect(page.getByTestId("player-modal")).toBeVisible(); }