fix(sources): Meta-Reparatur (telegram/x/x_account/pdf_document) + toten Code entfernt
- source_meta.py kennt jetzt den echten Bestand: Kategorien telegram (107 Quellen) und x (40), Typen x_account und pdf_document. Die 10 nie belegten Lagen-Kategorien und der ungenutzte Typ excluded sind raus. - Pydantic-Pattern source_type um x_account ergaenzt, excluded raus. Behebt 422 beim Speichern von 40 X-Account-Quellen. - Modal-Selects (Typ, Kategorie, PDF-Kategorie) werden aus /api/sources/meta befuellt statt hartkodiert. Submit sendet category/source_type nur noch, wenn nicht leer. Behebt stilles Loeschen der Kategorie bei Telegram-Quellen. - source_suggester: Import auf shared.agents.claude_client angepasst (war im Portal seit jeher kaputt, Konvention wie source_classifier). - Toter Code raus: POST /health/run-stream (147 Z. SSE-Duplikat), runHealthCheck() im Frontend, excluded_counts-CTE + Sperren-Spalte (immer 0), Trend-Delta (braucht 2 Runs, es gibt 1), Alignment-Chips (source_alignments ist leer), doppeltes formatDateTime, redundanter setupHealthTab-Listener, toter healthContent-Zugriff. - Tests: Kategorien-/Typen-Sets neu gepinnt, Smoke-Karteileichen entfernt. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Dieser Commit ist enthalten in:
@@ -49,17 +49,25 @@ def test_meta_types_have_required_fields(authed_client):
|
||||
assert "label" in t
|
||||
|
||||
|
||||
def test_meta_includes_specialized_categories(authed_client):
|
||||
"""Phase 3b - die spezielleren Lagen-Themen muessen als Kategorien existieren."""
|
||||
def test_meta_categories_exact_set(authed_client):
|
||||
"""Bereinigte Kategorienliste - exakt gepinnt gegen stilles Driften.
|
||||
|
||||
telegram und x muessen drin sein (147 Quellen im Bestand), die frueher
|
||||
definierten, aber nie belegten Lagen-Kategorien sind bewusst entfernt.
|
||||
"""
|
||||
r = authed_client.get("/api/sources/meta")
|
||||
keys = {c["key"] for c in r.json()["categories"]}
|
||||
assert "cybercrime" in keys
|
||||
assert "ukraine-russland-krieg" in keys
|
||||
assert "russische-staatspropaganda" in keys
|
||||
assert keys == {
|
||||
"nachrichtenagentur", "oeffentlich-rechtlich", "qualitaetszeitung",
|
||||
"behoerde", "fachmedien", "think-tank", "international", "regional",
|
||||
"boulevard", "telegram", "x", "sonstige",
|
||||
}
|
||||
assert "cybercrime" not in keys
|
||||
assert "stimmungsbild" not in keys
|
||||
|
||||
|
||||
def test_meta_includes_all_source_types(authed_client):
|
||||
"""Alle 5 Source-Types muessen rauskommen."""
|
||||
"""Alle 6 Source-Types muessen rauskommen (excluded ist bewusst entfernt)."""
|
||||
r = authed_client.get("/api/sources/meta")
|
||||
keys = {t["key"] for t in r.json()["types"]}
|
||||
assert keys == {"rss_feed", "web_source", "telegram_channel", "podcast_feed", "excluded"}
|
||||
assert keys == {"rss_feed", "web_source", "telegram_channel", "podcast_feed", "x_account", "pdf_document"}
|
||||
|
||||
@@ -53,8 +53,6 @@ AUTH_PROTECTED = [
|
||||
("GET", "/api/sources/health"),
|
||||
("GET", "/api/sources/suggestions"),
|
||||
("PUT", "/api/sources/suggestions/1"),
|
||||
("POST", "/api/sources/health/run"),
|
||||
("POST", "/api/sources/health/run-stream"),
|
||||
("POST", "/api/sources/health/search-fix/1"),
|
||||
("GET", "/api/statistik"),
|
||||
("GET", "/api/token-usage/overview"),
|
||||
|
||||
@@ -40,12 +40,17 @@ def test_category_label_lookup():
|
||||
def test_type_label_lookup():
|
||||
assert type_label("rss_feed") == "RSS-Feed"
|
||||
assert type_label("telegram_channel") == "Telegram-Kanal"
|
||||
assert type_label("x_account") == "X-Konto"
|
||||
assert type_label("pdf_document") == "PDF-Dokument"
|
||||
assert type_label("does-not-exist") == "does-not-exist"
|
||||
|
||||
|
||||
def test_category_includes_aktuelle_themen():
|
||||
"""Phase 3b: Lagen-spezifische Kategorien (cybercrime etc.) müssen drin sein."""
|
||||
def test_category_covers_bestand():
|
||||
"""telegram und x muessen als Kategorien existieren (belegter Bestand),
|
||||
die nie belegten Lagen-Kategorien sind bewusst entfernt."""
|
||||
keys = {c["key"] for c in SOURCE_CATEGORIES}
|
||||
assert "cybercrime" in keys
|
||||
assert "ukraine-russland-krieg" in keys
|
||||
assert "russische-staatspropaganda" in keys
|
||||
assert "telegram" in keys
|
||||
assert "x" in keys
|
||||
assert "cybercrime" not in keys
|
||||
assert "ukraine-russland-krieg" not in keys
|
||||
assert "russische-staatspropaganda" not in keys
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren