88 lines
3.7 KiB
Python
88 lines
3.7 KiB
Python
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
|