- 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>
57 Zeilen
1.9 KiB
Python
57 Zeilen
1.9 KiB
Python
"""Tests fuer src/source_meta.py - Single Source of Truth fuer Kategorien/Typen."""
|
|
from source_meta import (
|
|
SOURCE_CATEGORIES, SOURCE_TYPES,
|
|
get_meta, category_label, type_label,
|
|
)
|
|
|
|
|
|
def test_categories_have_unique_keys():
|
|
keys = [c["key"] for c in SOURCE_CATEGORIES]
|
|
assert len(keys) == len(set(keys))
|
|
|
|
|
|
def test_types_have_unique_keys():
|
|
keys = [t["key"] for t in SOURCE_TYPES]
|
|
assert len(keys) == len(set(keys))
|
|
|
|
|
|
def test_categories_and_types_have_label():
|
|
for c in SOURCE_CATEGORIES:
|
|
assert "key" in c and "label" in c
|
|
assert isinstance(c["label"], str) and c["label"]
|
|
for t in SOURCE_TYPES:
|
|
assert "key" in t and "label" in t
|
|
|
|
|
|
def test_get_meta_shape():
|
|
meta = get_meta()
|
|
assert set(meta.keys()) == {"categories", "types"}
|
|
assert meta["categories"] == SOURCE_CATEGORIES
|
|
assert meta["types"] == SOURCE_TYPES
|
|
|
|
|
|
def test_category_label_lookup():
|
|
assert category_label("nachrichtenagentur") == "Nachrichtenagentur"
|
|
assert category_label("oeffentlich-rechtlich") == "Öffentlich-Rechtlich"
|
|
# Unbekannter key -> Fallback auf key selbst
|
|
assert category_label("does-not-exist") == "does-not-exist"
|
|
|
|
|
|
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_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 "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
|