tests/: conftest.py - minimale Env-Vars + sys.path-Setup test_auth.py - Magic-Token + JWT Round-Trip (4 Tests) test_audit.py - diff() + _to_json() Helper (8 Tests) test_models.py - Pydantic-Validierung (7 Tests) test_source_meta.py - Single Source of Truth Konsistenz (7 Tests) test_imports.py - alle Backend-Module importierbar (4 Tests) requirements-dev.txt: pytest, ftfy, pyflakes Tests sind reine Unit-Tests (kein DB-Zugriff, kein HTTP-Server), laufen in <0.5s, geben sofortiges Catch-Net fuer Syntax/Import-Bugs. Aufruf: PYTHONPATH=src ./venv/bin/python -m pytest tests/ -v CLAUDE.md erweitert um: - Sektion Tests (Framework, Pfad, Ausfuehrung) - Sektion Phasen-Historie (alle 12 Phasen der Aufraeum-Aktion 2026-05-09 mit kurzer Erklaerung)
52 Zeilen
1.7 KiB
Python
52 Zeilen
1.7 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("does-not-exist") == "does-not-exist"
|
|
|
|
|
|
def test_category_includes_aktuelle_themen():
|
|
"""Phase 3b: Lagen-spezifische Kategorien (cybercrime etc.) müssen drin sein."""
|
|
keys = {c["key"] for c in SOURCE_CATEGORIES}
|
|
assert "cybercrime" in keys
|
|
assert "ukraine-russland-krieg" in keys
|
|
assert "russische-staatspropaganda" in keys
|