88 lines
3.7 KiB
Python
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
|