from pathlib import Path import pytest ROOT = Path(__file__).parents[2] @pytest.mark.parametrize("viewport", [(320, 568), (390, 844)]) def test_mobile_author_publishes_draft_and_continues_to_reviewer_picker(viewport): playwright = pytest.importorskip("playwright.sync_api") html = (ROOT / "frontend" / "index.html").read_text() detail = { "number": 7, "title": "WIP: Ship mobile flow", "author": "timmy", "state": "open", "draft": True, "merged": False, "head_sha": "abc1234", } 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.on("dialog", lambda dialog: dialog.accept()) 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 => { window.publishDetail = detail; window.publishItem = {repository:'stackchain/api', number:7, key:'stackchain/api#7'}; const controller = createPullSheet({ storage:null, fetchJson:(path, options) => { if (!path.endsWith('/ready') || options.method !== 'PATCH') { return Promise.reject(new Error('unexpected request')); } const payload = JSON.parse(options.body); if (payload.expected_head_sha !== detail.head_sha) { return Promise.reject(new Error('wrong head')); } return Promise.resolve({ repository:'stackchain/api', number:7, title:'Ship mobile flow', head_sha:detail.head_sha, state:'open', draft:false, }); }, }); createPullSheet.bindOwnershipControls( document, controller, () => window.publishItem, async () => false, () => window.publishDetail, () => 'timmy' ); document.querySelector('#pull-sheet').classList.add('open'); controller.setReviewDetail(detail); }""", detail, ) ready = page.get_by_role("button", name="Ready for review") before = ready.evaluate("button => ({height:button.getBoundingClientRect().height, hidden:button.hidden})") ready.click() page.get_by_text("Published and ready for review.").wait_for() metrics = page.evaluate( """() => ({ scrollWidth:document.documentElement.scrollWidth, clientWidth:document.documentElement.clientWidth, readyHidden:document.querySelector('#publish-draft-pull').hidden, requestOpen:document.querySelector('#pull-review-request').open, reviewerFocused:document.activeElement === document.querySelector('#load-pull-reviewers'), title:window.publishDetail.title, draft:window.publishDetail.draft, })""" ) browser.close() assert before["hidden"] is False assert before["height"] >= 44 assert metrics["scrollWidth"] <= metrics["clientWidth"] assert metrics["readyHidden"] is True assert metrics["requestOpen"] is True assert metrics["reviewerFocused"] is True assert metrics["title"] == "Ship mobile flow" assert metrics["draft"] is False