38 lines
1.6 KiB
Python
38 lines
1.6 KiB
Python
"""Regression coverage for #3040 item 4: visible-but-unfocused stream reattach."""
|
|
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
|
|
REPO_ROOT = Path(__file__).resolve().parents[1]
|
|
MESSAGES_JS = (REPO_ROOT / "static" / "messages.js").read_text(encoding="utf-8")
|
|
|
|
|
|
def _chat_error_handler() -> str:
|
|
return MESSAGES_JS.split("source.addEventListener('error',async e=>{", 1)[1].split(
|
|
"source.addEventListener('cancel'", 1
|
|
)[0]
|
|
|
|
|
|
def test_visible_unfocused_current_session_still_attempts_sse_reconnect():
|
|
"""The immediate chat SSE error path should only require current-pane ownership.
|
|
|
|
`_isSessionActivelyViewed()` also gates on document focus/visibility. Hidden tabs
|
|
are already deferred by `_deferStreamErrorIfPageHidden(source)`, so the direct
|
|
reconnect branch must not skip a visible-but-unfocused current session.
|
|
"""
|
|
handler = _chat_error_handler()
|
|
assert "if(!_isSessionCurrentPane(activeSid)) return;" in handler
|
|
assert "if(!_isSessionActivelyViewed(activeSid)) return;" not in handler
|
|
assert handler.index("if(!_isSessionCurrentPane(activeSid)) return;") < handler.index(
|
|
"if(!_reconnectAttempted && streamId)"
|
|
)
|
|
|
|
|
|
def test_reconnect_gate_comment_matches_current_pane_contract():
|
|
handler = _chat_error_handler()
|
|
guard_idx = handler.index("if(!_isSessionCurrentPane(activeSid)) return;")
|
|
comment_window = handler[max(0, guard_idx - 260):guard_idx]
|
|
assert "different session" in comment_window
|
|
assert "visible" not in comment_window.lower()
|
|
assert "focused" not in comment_window.lower()
|