from pathlib import Path import pytest ROOT = Path(__file__).parents[2] @pytest.mark.parametrize("viewport", [(320, 568), (390, 844)]) def test_mobile_pull_reviewer_status_wraps_and_keeps_updated_review_reachable(viewport): playwright = pytest.importorskip("playwright.sync_api") html = (ROOT / "frontend" / "index.html").read_text() detail = { "state": "open", "draft": False, "mergeable": True, "merged": False, "ci_state": "success", "head_sha": "current-head", "reviewers": [ { "login": "casey-with-a-very-long-mobile-login", "status": "waiting", "head_sha": "current-head", "blocking": True, }, { "login": "sam", "status": "changes_requested", "head_sha": "current-head", "blocking": True, }, { "login": "lee", "status": "outdated", "head_sha": "old-head", "blocking": True, }, { "login": "pat", "status": "approved", "head_sha": "current-head", "blocking": False, }, ], } with playwright.sync_playwright() as runtime: try: browser = runtime.chromium.launch(headless=True) except Exception as error: pytest.skip(f"Chromium is not installed: {error}") page = browser.new_page(viewport={"width": viewport[0], "height": viewport[1]}) page.set_content(html, wait_until="domcontentloaded") page.add_style_tag(path=ROOT / "frontend" / "dashboard.css") page.add_script_tag(path=ROOT / "frontend" / "pull-sheet.js") page.evaluate( """detail => { document.querySelector('#pull-sheet').classList.add('open'); document.querySelector('#pull-review').open = true; createPullSheet.review(detail, null, document); }""", detail, ) metrics = page.evaluate( """() => ({ scrollWidth: document.documentElement.scrollWidth, clientWidth: document.documentElement.clientWidth, updatedReviewHeight: document.querySelector('#request-updated-pull-review') .getBoundingClientRect().height, updatedReviewVisible: !document.querySelector('#request-updated-pull-review').hidden, statuses: Array.from(document.querySelectorAll('.pull-reviewer-status span')) .map(node => node.textContent), })""" ) browser.close() assert metrics["scrollWidth"] <= metrics["clientWidth"] assert metrics["updatedReviewHeight"] >= 44 assert metrics["updatedReviewVisible"] is True assert metrics["statuses"] == [ "Waiting for review", "Changes requested", "Outdated after new commits", "Approved current head", ]