import json import subprocess from pathlib import Path FRONTEND = Path(__file__).resolve().parents[1] / "frontend" CONTROLLER = FRONTEND / "mobile-issue-detail-nav.js" def test_pull_navigation_prepares_review_before_scrolling_and_focuses_reply(): script = f""" const createNavigation = require({json.dumps(str(CONTROLLER))}); class FakeElement {{ constructor(name) {{ this.name=name; this.listeners={{}}; this.attributes={{}}; this.open=false; this.focuses=0; this.scrolls=[]; }} addEventListener(name, callback) {{ this.listeners[name]=callback; }} removeEventListener(name) {{ delete this.listeners[name]; }} setAttribute(name, value) {{ this.attributes[name]=value; }} removeAttribute(name) {{ delete this.attributes[name]; }} focus() {{ this.focuses += 1; }} scrollIntoView(options) {{ this.scrolls.push({{...options, openWhenScrolled:this.open}}); }} }} const buttons = Object.fromEntries(['overview','conversation','reply','review'].map(name => [name,new FakeElement(name)])); const targets = Object.fromEntries(['overview','conversation','reply','review'].map(name => [name,new FakeElement(name)])); let prepared = []; const navigation = createNavigation({{ buttons, targets, beforeNavigate:{{review(target) {{ prepared.push('review'); target.open=true; }}}}, prefersReducedMotion:() => true, }}); navigation.start(); navigation.navigate('reply'); navigation.navigate('review'); process.stdout.write(JSON.stringify({{ replyFocuses:targets.reply.focuses, reviewScrolls:targets.review.scrolls, prepared, current:Object.fromEntries(Object.entries(buttons).map(([name,button]) => [name,button.attributes['aria-current'] || null])), }})); """ result = subprocess.run(["node", "-e", script], capture_output=True, text=True) assert result.returncode == 0, result.stderr assert json.loads(result.stdout) == { "replyFocuses": 1, "reviewScrolls": [{"block": "start", "behavior": "auto", "openWhenScrolled": True}], "prepared": ["review"], "current": { "overview": None, "conversation": None, "reply": None, "review": "location", }, } def test_pull_sheet_wires_four_workspace_destinations_to_existing_lazy_review(): html = (FRONTEND / "index.html").read_text() dashboard_js = (FRONTEND / "dashboard.js").read_text() assert '