feat: load pull review feedback on demand (Closes #1342)
CI / lint (pull_request) Successful in 3m25s
CI / build-release (pull_request) Successful in 7s
CI / browser-journey (pull_request) Successful in 5m34s
CI / release-candidate (pull_request) Has been skipped

This commit is contained in:
timmy committed 2026-08-24 09:16:30 +00:00
1 parent 50817bed9a
commit 611e79fc1e
7 files changed
+364 -28

No files matched your search

@@ -90,3 +90,83 @@ def test_mobile_received_review_feedback_opens_matching_change(viewport):
assert metrics["focused"] is True
assert "Reviewed head old-head" in metrics["reviewedHead"]
assert metrics["updatedReviewVisible"] is True
@pytest.mark.parametrize("viewport", [(320, 568), (390, 844)])
def test_mobile_pull_review_retries_inline_feedback_without_losing_core_review(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": "abc1234",
"reviewers": [{
"login": "sam", "review_id": 8, "status": "changes_requested",
"head_sha": "abc1234", "blocking": True,
"summary": "Please handle the empty state.",
}],
"files": [],
}
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 => {
window.lazyFeedbackDetail = detail;
window.lazyFeedbackItem = {repository:'stackchain/api', number:7, key:'stackchain/api#7'};
let attempts = 0;
const controller = createPullSheet({
storage:null,
fetchJson:() => {
attempts += 1;
if (attempts === 1) return Promise.reject(new Error('feedback unavailable'));
return Promise.resolve({
review_id:8, head_sha:'abc1234', reviewed_head_sha:'abc1234',
comments:[{id:99, path:'src/api.py', body:'Return before parsing.', line:12}],
});
},
});
createPullSheet.bindFeedbackControls(
document, controller, () => window.lazyFeedbackItem,
() => window.lazyFeedbackDetail, () => 'timmy'
);
document.querySelector('#pull-sheet').classList.add('open');
document.querySelector('#pull-review').open = true;
const eligibility = createPullSheet.review(detail, null, document);
document.querySelector('#pull-merge-state').textContent = eligibility.reason;
}""",
detail,
)
page.locator(".pull-review-feedback summary").click()
load = page.get_by_role("button", name="Load inline feedback")
load.click()
retry = page.get_by_role("button", name="Retry feedback")
retry.wait_for()
retry.click()
page.get_by_text("Return before parsing.").wait_for()
metrics = page.evaluate(
"""() => {
const details = document.querySelector('.pull-review-feedback');
const address = document.querySelector('[data-address-review-feedback]');
return {
scrollWidth: document.documentElement.scrollWidth,
clientWidth: document.documentElement.clientWidth,
blocker: document.querySelector('#pull-merge-state').textContent,
feedback: details.textContent,
addressHeight: address.getBoundingClientRect().height,
};
}"""
)
browser.close()
assert metrics["scrollWidth"] <= metrics["clientWidth"]
assert "requested changes" in metrics["blocker"]
assert "Return before parsing." in metrics["feedback"]
assert metrics["addressHeight"] >= 44