bifroest/tests/test_help.py
2026-10-27 08:34:17 +01:00

88 lines
3.7 KiB
Python

"""Online-Hilfe: Seiten, Suche, Links und der Knopf in der oberen Leiste."""
import re
import pytest
from app.help import service as help_pages
def test_hilfe_knopf_und_uebersicht(browser, people, db):
ben = browser("ben")
page = ben.get("/workspaces").text
assert 'class="btn btn-ghost btn-sm aiw-help-link" href="/hilfe"' in page and "<span>Hilfe</span>" in page
index = ben.get("/hilfe").text
for p in help_pages.PAGES:
assert f'href="/hilfe/{p.slug}"' in index
# ben ist nur Mitglied: Nutzer-Anleitung hervorgehoben, Admin-Seiten nicht
assert re.search(r'aiw-help-mine" href="/hilfe/nutzer"', index)
assert not re.search(r'aiw-help-mine" href="/hilfe/plattform-admin"', index)
from app.identity.models import User
with db.session() as session:
session.get(User, people["anna"]).is_admin = True
assert re.search(r'aiw-help-mine" href="/hilfe/plattform-admin"', browser("anna").get("/hilfe").text)
def test_hilfe_nur_angemeldet(app):
from fastapi.testclient import TestClient
with TestClient(app) as client:
assert "/hilfe" not in client.get("/login").text
for url in ("/hilfe", "/hilfe/faq"):
assert client.get(url, follow_redirects=False).status_code in (302, 303)
@pytest.mark.parametrize("slug", [p.slug for p in help_pages.PAGES])
def test_alle_seiten_mit_inhalt_und_ankern(browser, people, slug):
text = browser("ben").get(f"/hilfe/{slug}").text
rendered = help_pages.render(slug)
assert rendered.toc and "<h1 id=" in text
for heading in rendered.toc:
assert f'id="{heading.anchor}"' in text
assert "<script" not in str(rendered.html)
def test_interne_links_fuehren_zu_vorhandenen_ankern():
anchors = {p.slug: {h.anchor for h in help_pages.render(p.slug).toc} for p in help_pages.PAGES}
for p in help_pages.PAGES:
source = (help_pages.PAGES_DIR / f"{p.slug}.md").read_text()
for page, anchor in re.findall(r"\(/hilfe/([a-z-]+)(?:#([a-z0-9-]+))?\)", source):
assert page in anchors and (not anchor or anchor in anchors[page]), (p.slug, page, anchor)
for anchor in re.findall(r"\(#([a-z0-9-]+)\)", source):
assert anchor in anchors[p.slug], (p.slug, anchor)
for _, target in help_pages.CONTEXT + help_pages.WORKSPACE_CONTEXT:
page, _, anchor = target.partition("#")
assert page in anchors and (not anchor or anchor in anchors[page]), target
@pytest.mark.parametrize("path, expected", [
("/chats/5", "/hilfe/nutzer#chatten"),
("/approvals/3", "/hilfe/freigeben"),
("/admin/tools", "/hilfe/plattform-admin#tools-einstufen"),
("/admin/audit", "/hilfe/plattform-admin"),
("/workspaces/2/settings", "/hilfe/workspace-admin"),
("/workspaces/2/data", "/hilfe/nutzer#dateien-analysieren"),
("/workspaces/2", "/hilfe/nutzer"),
("/workspaces", "/hilfe"),
])
def test_hilfe_zur_aktuellen_seite(path, expected):
assert help_pages.link_for(path) == expected
def test_suche(browser, people):
ben = browser("ben")
page = ben.get("/hilfe", params={"q": "Vier Augen"}).text
assert "Suche: Vier Augen" in page and 'href="/hilfe/freigeben#wer-entscheidet"' in page
assert "Keine Treffer" in ben.get("/hilfe", params={"q": "xyzunbekannt"}).text
assert help_pages.search("a") == [] # zu kurz
def test_unbekannte_seite(browser, people):
assert browser("ben").get("/hilfe/gibtsnicht").status_code == 404
def test_tool_liste_der_hilfe_ist_vollstaendig():
"""Neue eingebaute Tools sollen in der Plattform-Admin-Hilfe auftauchen."""
from app.tools.registry import load
text = (help_pages.PAGES_DIR / "plattform-admin.md").read_text()
missing = [name for name in load() if name != "demo_write" and f"`{name}`" not in text]
assert not missing, missing