* feat: add option to hide new-chat welcome panel * Release: add preference to hide new-chat welcome panel (#6183, @vaidu-ai) --------- Co-authored-by: vaidu-ai <im@vaidu.net> Co-authored-by: nesquena-hermes <agent@nesquena-hermes>
129 lines
5.5 KiB
Python
129 lines
5.5 KiB
Python
"""Regression coverage for #6160: optional hiding of the full new-chat welcome panel."""
|
|
from pathlib import Path
|
|
import json
|
|
import shutil
|
|
import subprocess
|
|
|
|
REPO_ROOT = Path(__file__).resolve().parent.parent
|
|
INDEX = REPO_ROOT / "static" / "index.html"
|
|
STYLE = REPO_ROOT / "static" / "style.css"
|
|
PANELS = REPO_ROOT / "static" / "panels.js"
|
|
BOOT = REPO_ROOT / "static" / "boot.js"
|
|
I18N = REPO_ROOT / "static" / "i18n.js"
|
|
CONFIG = REPO_ROOT / "api" / "config.py"
|
|
|
|
|
|
def test_hide_welcome_panel_setting_is_default_off_and_boolean():
|
|
src = CONFIG.read_text(encoding="utf-8")
|
|
assert '"hide_empty_state_panel": False' in src
|
|
assert '"hide_empty_state_panel",' in src
|
|
|
|
|
|
def test_hide_welcome_panel_setting_persists_and_coerces_boolean(monkeypatch, tmp_path):
|
|
import api.config as config
|
|
|
|
settings_path = tmp_path / "settings.json"
|
|
monkeypatch.setattr(config, "SETTINGS_FILE", settings_path)
|
|
|
|
assert config.load_settings()["hide_empty_state_panel"] is False
|
|
|
|
saved = config.save_settings({"hide_empty_state_panel": True})
|
|
assert saved["hide_empty_state_panel"] is True
|
|
assert json.loads(settings_path.read_text(encoding="utf-8"))["hide_empty_state_panel"] is True
|
|
|
|
saved = config.save_settings({"hide_empty_state_panel": 0})
|
|
assert saved["hide_empty_state_panel"] is False
|
|
assert config.load_settings()["hide_empty_state_panel"] is False
|
|
|
|
|
|
def test_preferences_expose_hide_welcome_panel_toggle():
|
|
html = INDEX.read_text(encoding="utf-8")
|
|
assert 'id="settingsHideEmptyStatePanel"' in html
|
|
assert 'data-i18n="settings_label_hide_empty_state_panel"' in html
|
|
assert 'data-i18n="settings_desc_hide_empty_state_panel"' in html
|
|
|
|
|
|
def test_empty_state_has_non_important_full_panel_hide_hook():
|
|
css = STYLE.read_text(encoding="utf-8")
|
|
assert ".empty-state.no-welcome{display:none}" in css
|
|
assert ".empty-state.no-welcome{display:none!important}" not in css
|
|
|
|
|
|
def _boot_function(boot: str, name: str) -> str:
|
|
start = boot.index(f"function {name}()")
|
|
end = boot.index("\n}\n", start) + 2
|
|
return boot[start:end]
|
|
|
|
|
|
def test_boot_preference_hides_and_restores_the_panel_observably():
|
|
node = shutil.which("node")
|
|
assert node is not None, "node is required for the frontend behavior harness"
|
|
|
|
boot = BOOT.read_text(encoding="utf-8")
|
|
function_src = _boot_function(boot, "applyEmptyStatePanelPref")
|
|
harness = f"""
|
|
const vm=require('vm');
|
|
const classes=new Set();
|
|
const emptyState={{classList:{{
|
|
toggle(name, enabled){{ if(enabled) classes.add(name); else classes.delete(name); }},
|
|
contains(name){{ return classes.has(name); }}
|
|
}}}};
|
|
const sandbox={{window:{{_hideEmptyStatePanel:false}}, $:(id)=>id==='emptyState'?emptyState:null}};
|
|
vm.createContext(sandbox);
|
|
vm.runInContext({json.dumps(function_src)},sandbox);
|
|
sandbox.applyEmptyStatePanelPref();
|
|
if(emptyState.classList.contains('no-welcome')) throw new Error('default-off hid the panel');
|
|
sandbox.window._hideEmptyStatePanel=true;
|
|
sandbox.applyEmptyStatePanelPref();
|
|
if(!emptyState.classList.contains('no-welcome')) throw new Error('enabled preference did not hide the panel');
|
|
sandbox.window._hideEmptyStatePanel=false;
|
|
sandbox.applyEmptyStatePanelPref();
|
|
if(emptyState.classList.contains('no-welcome')) throw new Error('disabling preference did not restore the panel');
|
|
"""
|
|
subprocess.run([node, "-e", harness], check=True, capture_output=True, text=True)
|
|
|
|
assert "window._hideEmptyStatePanel=s.hide_empty_state_panel===true" in boot
|
|
assert "window._hideEmptyStatePanel=false" in boot
|
|
|
|
|
|
def test_restoring_panel_preserves_independent_hide_suggestions_preference():
|
|
node = shutil.which("node")
|
|
assert node is not None, "node is required for the frontend behavior harness"
|
|
|
|
boot = BOOT.read_text(encoding="utf-8")
|
|
functions = "\n".join(
|
|
_boot_function(boot, name)
|
|
for name in ("applyEmptyStateSuggestionPref", "applyEmptyStatePanelPref")
|
|
)
|
|
harness = f"""
|
|
const vm=require('vm');
|
|
const classes=new Set();
|
|
const emptyState={{classList:{{toggle(name,enabled){{if(enabled)classes.add(name);else classes.delete(name);}}}}}};
|
|
const sandbox={{window:{{_hideEmptyStateSuggestions:true,_hideEmptyStatePanel:true}},$:(id)=>id==='emptyState'?emptyState:null}};
|
|
vm.createContext(sandbox);
|
|
vm.runInContext({json.dumps(functions)},sandbox);
|
|
sandbox.applyEmptyStateSuggestionPref();
|
|
sandbox.applyEmptyStatePanelPref();
|
|
if(!classes.has('no-suggestions')||!classes.has('no-welcome')) throw new Error('combined state was not applied');
|
|
sandbox.window._hideEmptyStatePanel=false;
|
|
sandbox.applyEmptyStatePanelPref();
|
|
if(classes.has('no-welcome')) throw new Error('panel was not restored');
|
|
if(!classes.has('no-suggestions')) throw new Error('restoring panel lost the suggestions preference');
|
|
"""
|
|
subprocess.run([node, "-e", harness], check=True, capture_output=True, text=True)
|
|
|
|
|
|
def test_panels_round_trip_and_hot_apply_hide_welcome_panel():
|
|
js = PANELS.read_text(encoding="utf-8")
|
|
assert "payload.hide_empty_state_panel=hideEmptyStatePanelCb.checked;" in js
|
|
assert "hideEmptyStatePanelCb.checked=settings.hide_empty_state_panel===true;" in js
|
|
assert "window._hideEmptyStatePanel=hideEmptyStatePanelCb.checked;" in js
|
|
assert "if(typeof applyEmptyStatePanelPref==='function') applyEmptyStatePanelPref();" in js
|
|
|
|
|
|
def test_hide_welcome_panel_copy_covers_every_locale():
|
|
js = I18N.read_text(encoding="utf-8")
|
|
assert js.count("settings_label_hide_empty_state_panel:") == 15
|
|
assert js.count("settings_desc_hide_empty_state_panel:") == 15
|
|
assert "settings_label_hide_empty_state_panel: 'Ukryj panel powitalny nowej konwersacji'" in js
|