diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 128df5d..30d2154 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -57,7 +57,7 @@ jobs: pip install -r requirements-e2e.txt python3 -m playwright install --with-deps chromium - name: Exercise packaged mobile work journeys - run: python3 -m pytest tests/e2e/test_mobile_offline_issue_release.py tests/e2e/test_mobile_search_preview_navigation.py tests/e2e/test_mobile_search_week_plan.py tests/e2e/test_mobile_find_work_release.py tests/e2e/test_mobile_home_bootstrap_release.py tests/e2e/test_mobile_sign_out_release.py tests/e2e/test_mobile_today_handoff_release.py tests/e2e/test_mobile_today_wrap_up_release.py tests/e2e/test_mobile_today_summary_release.py tests/e2e/test_mobile_tomorrow_conflict_release.py tests/e2e/test_mobile_week_ahead_release.py tests/e2e/test_mobile_today_week_reschedule_release.py tests/e2e/test_mobile_wrap_up_handoff_release.py tests/e2e/test_mobile_following_release.py tests/e2e/test_mobile_detail_watch_release.py -q + run: python3 -m pytest tests/e2e/test_mobile_offline_issue_release.py tests/e2e/test_mobile_search_preview_navigation.py tests/e2e/test_mobile_search_week_plan.py tests/e2e/test_mobile_find_work_release.py tests/e2e/test_mobile_home_bootstrap_release.py tests/e2e/test_mobile_sign_out_release.py tests/e2e/test_mobile_today_handoff_release.py tests/e2e/test_mobile_today_wrap_up_release.py tests/e2e/test_mobile_today_summary_release.py tests/e2e/test_mobile_tomorrow_conflict_release.py tests/e2e/test_mobile_week_ahead_release.py tests/e2e/test_mobile_today_week_reschedule_release.py tests/e2e/test_mobile_wrap_up_handoff_release.py tests/e2e/test_mobile_following_release.py tests/e2e/test_mobile_detail_watch_release.py tests/e2e/test_mobile_pull_reviewer_status_release.py -q release-candidate: runs-on: ubuntu-latest diff --git a/tests/e2e/test_mobile_pull_reviewer_status_release.py b/tests/e2e/test_mobile_pull_reviewer_status_release.py new file mode 100644 index 0000000..5f8a4c4 --- /dev/null +++ b/tests/e2e/test_mobile_pull_reviewer_status_release.py @@ -0,0 +1,87 @@ +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", + ] diff --git a/tests/test_ci_workflow.py b/tests/test_ci_workflow.py index a582f8d..5e62ece 100644 --- a/tests/test_ci_workflow.py +++ b/tests/test_ci_workflow.py @@ -73,7 +73,8 @@ def test_release_promotion_waits_for_packaged_mobile_journeys(): "tests/e2e/test_mobile_today_week_reschedule_release.py " "tests/e2e/test_mobile_wrap_up_handoff_release.py " "tests/e2e/test_mobile_following_release.py " - "tests/e2e/test_mobile_detail_watch_release.py -q" + "tests/e2e/test_mobile_detail_watch_release.py " + "tests/e2e/test_mobile_pull_reviewer_status_release.py -q" ) in browser assert "needs: [lint, build-release, browser-journey]" in release