HERMES-GIELIE/tests/test_issue4325_virtualization_toggle.py
nesquena-hermes 810414b438 feat(#4325): opt-out toggle to disable transcript virtualization
Adds a Preferences setting 'Virtualize long transcripts' (default ON, opt-out).
When disabled, _currentMessageVirtualWindow returns a full non-virtualized window
so the entire transcript renders at once (also short-circuits the virtual
re-measure loop). Server-persisted (virtualize_transcript bool, default True),
hot-applies via renderMessages on toggle. i18n in all 13 locales.

Pairs with @rodboev's #4328 stream-end anchor scroll fix (cherry-picked into
this branch) to fully resolve #4325.
2026-06-17 01:52:06 +00:00

63 lines
2.9 KiB
Python

"""Regression coverage for #4325: opt-out toggle for transcript virtualization.
The stream-end freeze/jump fix (#4328, semantic viewport anchoring) is covered by
test_issue500_message_list_virtualization.py. This file covers the new Preferences
toggle that lets a user disable virtualization entirely (opt-out, default ON).
"""
from pathlib import Path
REPO_ROOT = Path(__file__).resolve().parent.parent
INDEX = REPO_ROOT / "static" / "index.html"
PANELS = REPO_ROOT / "static" / "panels.js"
BOOT = REPO_ROOT / "static" / "boot.js"
UI = REPO_ROOT / "static" / "ui.js"
I18N = REPO_ROOT / "static" / "i18n.js"
CONFIG = REPO_ROOT / "api" / "config.py"
def test_virtualize_transcript_setting_is_default_on_and_allowed():
"""Opt-out model: default True (virtualization on), and whitelisted as a bool key."""
src = CONFIG.read_text(encoding="utf-8")
assert '"virtualize_transcript": True' in src, "must default ON (opt-out)"
assert '"virtualize_transcript",' in src, "must be in _SETTINGS_BOOL_KEYS"
def test_settings_preferences_expose_virtualize_toggle():
html = INDEX.read_text(encoding="utf-8")
assert 'id="settingsVirtualizeTranscript"' in html
assert 'data-i18n="settings_label_virtualize_transcript"' in html
assert 'data-i18n="settings_desc_virtualize_transcript"' in html
# Checkbox renders checked by default (opt-out): the rendered default reflects ON.
assert 'id="settingsVirtualizeTranscript"' in html and "checked" in html
def test_boot_applies_saved_virtualize_preference_default_on():
js = BOOT.read_text(encoding="utf-8")
# Default-on semantics: !==false (undefined/older configs treated as enabled).
assert "window._virtualizeTranscript=s.virtualize_transcript!==false" in js
# Settings-load-failed fallback also defaults ON.
assert "window._virtualizeTranscript=true" in js
def test_ui_gate_forces_full_render_when_opted_out():
js = UI.read_text(encoding="utf-8")
start = js.index("function _currentMessageVirtualWindow(")
body = js[start:start + 900]
assert "_virtualizeTranscript===false" in body
assert "virtualized:false" in body
def test_panels_round_trip_and_hot_apply_virtualize_toggle():
js = PANELS.read_text(encoding="utf-8")
assert "const virtualizeTranscriptCb=$('settingsVirtualizeTranscript');" in js
assert "payload.virtualize_transcript=virtualizeTranscriptCb.checked;" in js
assert "virtualizeTranscriptCb.checked=settings.virtualize_transcript!==false;" in js
assert "window._virtualizeTranscript=virtualizeTranscriptCb.checked;" in js
# Hot-apply: toggling re-renders the open transcript immediately.
assert "renderMessages({preserveScroll:true})" in js
def test_virtualize_toggle_i18n_all_locales():
js = I18N.read_text(encoding="utf-8")
assert js.count("settings_label_virtualize_transcript:") == 13
assert js.count("settings_desc_virtualize_transcript:") == 13