main
py 110 lines 4.18 KB
Raw
1 import json
2 from pathlib import Path
3 import re
4 import subprocess
5 import sys
6
7
8 ROOT = Path(__file__).resolve().parents[1]
9
10
11 def read(path: str) -> str:
12 return (ROOT / path).read_text(encoding="utf-8")
13
14
15 def test_ui_controls_have_independent_mobile_and_desktop_visibility() -> None:
16 preferences = read("webui/components/sidebar/bottom/preferences/preferences-store.js")
17 settings_store = read("webui/components/settings/settings-store.js")
18 settings = read("webui/components/settings/agent/agent-settings.html")
19 interface = read("webui/components/settings/agent/interface.html")
20 chat_top = read("webui/components/chat/top-section/chat-top.html")
21 canvas = read("webui/components/canvas/right-canvas.html")
22 context_usage = read(
23 "plugins/_context_window/extensions/webui/model-context-strip-end/context-window.html"
24 )
25 context_settings = read(
26 "plugins/_context_window/extensions/webui/interface-controls-end/context-window.html"
27 )
28 context_store = read("plugins/_context_window/webui/context-window-store.js")
29 index = read("webui/index.html")
30 ui_server = read("helpers/ui_server.py")
31
32 for control in ("projectSelector", "time", "connectionStatus", "rightCanvasRail"):
33 assert control in preferences
34 assert control in settings_store
35
36 assert "registerUiControlVisibility" in preferences
37 assert "contextWindowUsage" in context_store
38 assert "contextWindowUsage" in context_settings
39 assert 'id="interface-controls-end"' in interface
40
41 assert "section-interface" in settings_store
42 assert 'settings/agent/interface.html' in settings
43 assert "smartphone" in interface
44 assert "desktop_windows" in interface
45 assert 'globalThis.addEventListener("resize"' in preferences
46 assert "uiControlVisibility" in index
47 assert "user_ui_control_visibility" in ui_server
48 assert "ui_control_visibility" in settings_store
49 assert "Shown everywhere" in settings_store
50 assert "Mobile only" in settings_store
51 assert "Desktop only" in settings_store
52 assert "Hidden everywhere" in settings_store
53 assert "isUiControlVisible('time')" in chat_top
54 assert "isUiControlVisible('connectionStatus')" in chat_top
55 assert "isUiControlVisible('projectSelector')" in chat_top
56 assert "isUiControlVisible('contextWindowUsage')" in context_usage
57 assert "isUiControlVisible('rightCanvasRail')" in canvas
58
59
60 def test_mobile_canvas_rail_respects_visibility_preference() -> None:
61 canvas = read("webui/components/canvas/right-canvas.html")
62 canvas_css = read("webui/components/canvas/right-canvas.css")
63 mobile_rail_rule = re.search(
64 r"body\.right-canvas-mobile-mode \.right-canvas-rail \{([^}]*)\}",
65 canvas_css,
66 re.S,
67 )
68
69 assert 'x-show="$store.preferences.isUiControlVisible(\'rightCanvasRail\')"' in canvas
70 assert mobile_rail_rule is not None
71 assert re.search(r"^\s*display:\s*flex;\s*$", mobile_rail_rule.group(1), re.M)
72 assert "!important" not in mobile_rail_rule.group(1)
73
74
75 def test_ui_control_visibility_settings_are_normalized() -> None:
76 result = subprocess.run(
77 [
78 sys.executable,
79 "-c",
80 """
81 import json
82 from helpers import settings
83
84 defaults = settings.get_default_settings()["ui_control_visibility"]
85 normalized = settings.normalize_settings({
86 **settings.get_default_settings(),
87 "ui_control_visibility": {
88 "time": {"mobile": True, "desktop": False},
89 "contextWindowUsage": {"mobile": False, "desktop": True},
90 "projectSelector": "invalid",
91 "unknown": {"mobile": False},
92 },
93 })["ui_control_visibility"]
94 print(json.dumps({"defaults": defaults, "normalized": normalized}))
95 """,
96 ],
97 cwd=ROOT,
98 check=True,
99 capture_output=True,
100 text=True,
101 )
102 data = json.loads(result.stdout)
103 defaults = data["defaults"]
104 normalized = data["normalized"]
105
106 assert defaults["time"] == {"mobile": False, "desktop": True}
107 assert normalized["time"] == {"mobile": True, "desktop": False}
108 assert normalized["contextWindowUsage"] == {"mobile": False, "desktop": True}
109 assert normalized["projectSelector"] == {"mobile": True, "desktop": True}
110 assert "unknown" not in normalized