"""Shared fixtures for E2E Playwright tests. All tests in this directory require a running application server pointed to by the E2E_BASE_URL environment variable. Tests are automatically skipped when the variable is absent, making them safe to collect in any environment. """ from __future__ import annotations import os from collections.abc import Generator import pytest from playwright.sync_api import Browser, BrowserContext, Page, sync_playwright @pytest.fixture(scope="session") def base_url() -> str: url = os.getenv("E2E_BASE_URL", "").rstrip("/") if not url: pytest.skip("E2E_BASE_URL not set – start a server and export E2E_BASE_URL to run E2E tests") return url @pytest.fixture(scope="session") def _browser(base_url: str) -> Generator[Browser, None, None]: # noqa: ARG001 """Session-scoped Chromium instance (headless).""" with sync_playwright() as pw: browser = pw.chromium.launch(headless=True) yield browser browser.close() @pytest.fixture() def page(_browser: Browser) -> Generator[Page, None, None]: """Fresh browser context + page per test — no shared state between tests.""" ctx: BrowserContext = _browser.new_context() pg: Page = ctx.new_page() yield pg ctx.close()