1 parent
d1e1c4eeec
commit
d21c97205e
3 files changed
+69
-5
No files matched your search
@@ -0,0 +1,62 @@
|
||||
"""Regression tests for #1360: streaming must not re-pin user scroll."""
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
REPO = Path(__file__).parent.parent
|
||||
UI_JS = (REPO / "static" / "ui.js").read_text(encoding="utf-8")
|
||||
STYLE_CSS = (REPO / "static" / "style.css").read_text(encoding="utf-8")
|
||||
|
||||
|
||||
def _extract_function(src: str, name: str) -> str:
|
||||
marker = f"function {name}("
|
||||
idx = src.find(marker)
|
||||
assert idx != -1, f"{name} not found"
|
||||
depth = 0
|
||||
for i, ch in enumerate(src[idx:], idx):
|
||||
if ch == "{":
|
||||
depth += 1
|
||||
elif ch == "}":
|
||||
depth -= 1
|
||||
if depth == 0:
|
||||
return src[idx:i + 1]
|
||||
raise AssertionError(f"Could not extract {name}")
|
||||
|
||||
|
||||
def test_messages_scroller_disables_browser_scroll_anchoring():
|
||||
assert "overflow-anchor:none" in STYLE_CSS, (
|
||||
"#messages must disable browser scroll anchoring so tool/card inserts "
|
||||
"cannot yank the transcript while the user reads earlier content."
|
||||
)
|
||||
|
||||
|
||||
def test_scroll_repin_dead_zone_is_wider_for_mac_app_windows():
|
||||
assert "clientHeight<250" in UI_JS, (
|
||||
"The near-bottom re-pin threshold should be at least 250px so small "
|
||||
"macOS app windows and trackpad momentum do not re-pin too eagerly."
|
||||
)
|
||||
|
||||
|
||||
def test_queue_card_measurement_does_not_force_repin_during_streaming():
|
||||
fn = _extract_function(UI_JS, "_renderQueueChips")
|
||||
measurement_idx = fn.find("setTimeout(()=>")
|
||||
assert measurement_idx != -1, "queue card measurement timeout not found"
|
||||
measurement_block = fn[measurement_idx:measurement_idx + 500]
|
||||
|
||||
assert "S.activeStreamId" in measurement_block
|
||||
assert "scrollIfPinned()" in measurement_block
|
||||
assert "!S.activeStreamId" in measurement_block
|
||||
assert "scrollToBottom()" in measurement_block
|
||||
assert measurement_block.find("scrollIfPinned()") < measurement_block.find("scrollToBottom()")
|
||||
|
||||
|
||||
def test_queue_pill_click_does_not_force_repin_during_streaming():
|
||||
fn = _extract_function(UI_JS, "_updateQueuePill")
|
||||
click_idx = fn.find("pill.onclick=()=>")
|
||||
assert click_idx != -1, "queue pill click handler not found"
|
||||
click_block = fn[click_idx:click_idx + 700]
|
||||
|
||||
assert "S.activeStreamId" in click_block
|
||||
assert "scrollIfPinned()" in click_block
|
||||
assert "!S.activeStreamId" in click_block
|
||||
assert "scrollToBottom()" in click_block
|
||||
assert click_block.find("scrollIfPinned()") < click_block.find("scrollToBottom()")
|
||||
Reference in new issue
Block a user