From bd35e25121e29e0fa96b2b55ed67445fd1bfaddb Mon Sep 17 00:00:00 2001 From: claude-dev Date: Sun, 2 Aug 2026 19:32:17 +0000 Subject: [PATCH] =?UTF-8?q?test(studio):=20Zugriffe=20auf=20nicht=20vorhan?= =?UTF-8?q?dene=20Elemente=20werden=20gepr=C3=BCft?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nachtrag aus der Endkontrolle nach dem Umbau der Bausteinspalte. Ein getElementById auf ein entferntes Element scheitert still, genau das wäre beim Entfernen der Artefakt-Karten leicht passiert. Die Strukturprüfung gleicht jetzt jede gesuchte ID gegen das Dokument ab, inklusive der zur Laufzeit erzeugten. Für studio.js sind alle 109 Zugriffe sauber. In app.js sind fünf Verweise ins Leere aufgefallen, alle aus der Domain-Sperrliste im Quellen-Modal und alle hinter einer Existenzprüfung, showBlockDomainDialog kehrt bei fehlendem Formular sofort zurück. Kein Absturzrisiko, aber toter Code. Sie stehen als bekannte Altlast in der Prüfung, werden gemeldet und zählen nicht als Fehler. Ein neuer Fall fällt weiterhin auf. Dazu ein Kommentar am Label der Netzwerkanalyse, das ohne zugehörige Karte stehen bleibt, damit später niemand rätselt. Co-Authored-By: Claude Opus 5 (1M context) --- src/static/js/studio.js | 3 +++ tests/test_studio_struktur.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/static/js/studio.js b/src/static/js/studio.js index 191bc6e..8df4a21 100644 --- a/src/static/js/studio.js +++ b/src/static/js/studio.js @@ -1841,6 +1841,9 @@ const Studio = { // Die Oberflaeche nutzt das nicht mehr, zeigt einen so gestarteten Lauf // aber korrekt an, denn er kann aus der klassischen Ansicht kommen. _CANCELLABLE: ['collect', 'full'], + // 'network' hat keine Karte mehr, das Label bleibt trotzdem stehen. Kaeme + // der Baustein im Server, meldete ein laufender Schritt sonst nur seinen + // technischen Schluessel. _STAGE_LABELS: { collect: 'Artikel holen', analyze: 'Lagebild schreiben', factcheck: 'Fakten prüfen', geoparse: 'Orte erkennen', diff --git a/tests/test_studio_struktur.py b/tests/test_studio_struktur.py index 6e1d785..154635b 100644 --- a/tests/test_studio_struktur.py +++ b/tests/test_studio_struktur.py @@ -76,6 +76,35 @@ pruefe("B4 Panel vorhanden", '
' in st pruefe("B5 activateTab kennt den Reiter", "if (key === 'settings') this.loadSettings();" in studio_js) +# Bekannte tote Verweise aus der Domain-Sperrliste im Quellen-Modal. Alle +# Zugriffe liegen hinter einer Existenzpruefung (showBlockDomainDialog kehrt +# bei fehlendem Formular sofort zurueck), es droht also kein Absturz. Sie +# werden gemeldet, zaehlen aber nicht als Fehler, damit die Pruefung nicht +# dauerhaft rot steht und niemand mehr hinsieht. +ALTLASTEN = { + "block-domain-input", "block-domain-notes", "source-overview-chevron", + "sources-block-form", "sources-hint", +} + +print("\nB2) Kein Zugriff auf Elemente, die es nicht gibt") +# Ein getElementById auf ein entferntes Element scheitert still. Beim Umbau +# der Bausteinspalte waere genau das leicht passiert. +for name, js_quelle, html_quelle in [("studio", studio_js, studio_html), + ("dashboard", app_js, dash_html)]: + vorhanden = set(re.findall(r'\bid="([^"]+)"', html_quelle)) + # Was das Skript selbst erzeugt, steht nicht im Dokument + vorhanden |= set(re.findall(r"\.id = '([^']+)'", js_quelle)) + vorhanden |= set(re.findall(r'id="([^"]+)"', js_quelle)) + vorhanden |= set(re.findall(r'\bid="([^"]+)"', comp_js)) + gesucht = set(re.findall(r"getElementById\('([^']+)'\)", js_quelle)) + fehlend = sorted(g for g in gesucht if g not in vorhanden) + neue = [g for g in fehlend if g not in ALTLASTEN] + pruefe(f"B2 {name}.js greift nur auf vorhandene Elemente zu " + f"({len(gesucht)} geprueft)", not neue, neue) + bekannt = [g for g in fehlend if g in ALTLASTEN] + if bekannt: + print(f" bekannte Altlast, abgesichert: {', '.join(bekannt)}") + print("\nC) Jedes onclick zeigt auf eine vorhandene Methode") for name, html, js, praefix in [ ("studio", studio_html, studio_js, "Studio"),