various fixes

This commit is contained in:
2026-08-28 09:42:19 -04:00
parent 5d679f5184
commit 03bead092c
19 changed files with 983 additions and 1443 deletions
+126
View File
@@ -0,0 +1,126 @@
"""Unit: the navbar steering toggle is gone (owner request, 2026-08-28).
The "Tuning" steering toggle (``#steering-toggle``) used to sit in
every page's shared header — shipped hidden (phase 40), revealed for
the admin, removed from the DOM for anonymous. The owner asked for the
button to go away entirely: note management now lives on the
standalone Tuning page (``/tuning.html``, phase 27). This file pins the
removal at source level — the toggle + count badge are ABSENT from all
six pages, the ``#steering-panel`` section still ships hidden (kept
fresh by the chat page's per-bubble Tune form through header.js), the
shared module owns no toggle wiring anymore, and the admin-only
``#nav-tuning`` link — the surviving path to the notes — still ships
hidden.
"""
from __future__ import annotations
import re
from pathlib import Path
FRONTEND = Path(__file__).resolve().parents[2] / "frontend"
ASSETS = FRONTEND / "assets"
HEADER_JS = ASSETS / "header.js"
#: All six pages carry the shared header block (phase 34's five pages +
#: phase 35's git-sources page).
PAGES = (
FRONTEND / "index.html",
FRONTEND / "sources.html",
FRONTEND / "document.html",
FRONTEND / "git-sources.html",
FRONTEND / "login.html",
FRONTEND / "tuning.html",
)
def _text(path: Path) -> str:
assert path.is_file(), f"missing frontend file: {path}"
return path.read_text(encoding="utf-8")
def _init_body(js: str) -> str:
"""The source of initSharedHeader in header.js."""
fn = js.find("function initSharedHeader")
assert fn != -1, "initSharedHeader must be defined"
return js[fn : js.find("\n}", fn)]
# ---------- the removal: absent from every page's navbar ----------
def test_steering_toggle_removed_from_all_six_pages() -> None:
"""The #steering-toggle button (and its #steering-count badge) is
gone from the navbar of EVERY page — absent, not hidden."""
for html in PAGES:
text = _text(html)
assert 'id="steering-toggle"' not in text, (
f"{html.name}: #steering-toggle must be removed from the navbar"
)
assert 'class="steering-toggle"' not in text, (
f"{html.name}: the .steering-toggle button must be removed"
)
assert 'id="steering-count"' not in text, (
f"{html.name}: the #steering-count badge lived inside the toggle"
)
def test_steering_panel_still_ships_hidden_on_all_six_pages() -> None:
"""The #steering-panel section survives the toggle removal (the chat
page's per-bubble Tune form keeps it fresh through header.js) and
still ships hidden, with its list / empty state / announcer."""
for html in PAGES:
text = _text(html)
tag = re.search(r'<section[^>]*id="steering-panel"[^>]*>', text)
assert tag, f"{html.name}: missing the #steering-panel section"
assert re.search(r"\bhidden\b", tag.group(0)), "the panel ships hidden"
assert 'id="steering-list"' in text, f"{html.name}: missing #steering-list"
assert 'id="steering-empty"' in text, f"{html.name}: missing #steering-empty"
assert re.search(r'<p[^>]*id="steering-announcer"[^>]*role="status"[^>]*>', text), (
f"{html.name}: missing the #steering-announcer live region"
)
# ---------- header.js: no toggle wiring left, panel contract intact ----------
def test_header_js_carries_no_toggle_wiring() -> None:
"""header.js owns no #steering-toggle reference anymore: no element
lookup, no admin unhide, no anonymous removal, no click binding, no
open/close helper, no count badge."""
js = _text(HEADER_JS)
assert 'querySelector("#steering-toggle")' not in js
assert "steeringToggle" not in js
assert "setSteeringPanel" not in js
assert 'querySelector("#steering-count")' not in js
assert "steeringCount" not in js
def test_header_js_keeps_the_panel_contract() -> None:
"""What survives: inside initSharedHeader the admin branch still
refreshes the panel list (fire-and-forget) and the anonymous branch
still REMOVES the panel from the DOM (phase-16 "absent, not hidden")
so /api/steering is never fetched for anonymous visitors."""
body = _init_body(_text(HEADER_JS))
admin = body.find("if (admin)")
refresh = body.find("if (steeringPanel) refreshSteering();")
assert admin != -1 and refresh != -1, "the admin refresh is missing"
assert admin < refresh, "the refresh must live in the admin branch"
assert "steeringPanel?.remove();" in body, (
"the anonymous remove-from-DOM path must stay intact"
)
# ---------- the surviving path to the notes ----------
def test_nav_tuning_still_ships_hidden_on_all_six_pages() -> None:
"""The admin-only Tuning NAV LINK (#nav-tuning) — the surviving path
to the steering notes now that the navbar toggle is gone — still
ships hidden on every page (the phase-19/29/35 contract)."""
for html in PAGES:
tag = re.search(r'<a[^>]*id="nav-tuning"[^>]*>', _text(html))
assert tag, f"{html.name}: missing the #nav-tuning nav link"
assert re.search(r"\bhidden\b", tag.group(0)), (
f"{html.name}: #nav-tuning must ship hidden"
)