"""AA-045-F4 Regression: alle Pipeline-Komponenten."""
import sys, json
sys.path.insert(0, "/opt/struktur/social-media-radar")
import sqlite3, urllib.request
conn = sqlite3.connect("/var/lib/sma-data/signals.db")
conn.row_factory = sqlite3.Row
checks = []
# Radar + Intakes: Collect laeuft (kleiner Smoke-Test der Konfiguration)
from intake.multi_intake import load_config
cfg = load_config()
checks.append(("Multi-Source-Konfiguration", True))
# Classifier laedt und klassifiziert
from classification.signal_classifier import score_signal
sd = score_signal("Schimmel im Schlafzimmer auf Mallorca", "de")
checks.append(("Classifier", sd["signal_category"] == "schimmel_risiko"))
# Director + Briefing laufen (bereits in F3 verdrahtet)
n_dir = conn.execute("SELECT COUNT(*) FROM signals WHERE director_action != ''").fetchone()[0]
checks.append(("Director-Daten", n_dir > 100))
# Briefing-Abdeckung
leer = conn.execute("""SELECT COUNT(*) FROM signals WHERE status NOT IN ('ignoriert','veroeffentlicht')
AND COALESCE(mallorca_relevance,0)>0 AND COALESCE(briefing_winkel,'')=''""").fetchone()[0]
checks.append(("Briefing-Abdeckung", leer == 0, f"unversorgt={leer}"))
# Caption-API
with urllib.request.urlopen("http://127.0.0.1:8652/api/caption/9a15eedd-6016-4e85-a97c-428e005b8be8", timeout=60) as r:
cap = json.loads(r.read())
checks.append(("Caption", cap["success"]))
# Visuals 1x1 + 4x5
for fmt in ("1x1", "4x5"):
with urllib.request.urlopen(f"http://127.0.0.1:8652/api/visual/9a15eedd-6016-4e85-a97c-428e005b8be8?fmt={fmt}", timeout=120) as r:
v = json.loads(r.read())
checks.append((f"Visual {fmt}", v.get("success")))
# Cockpit erreichbar
with urllib.request.urlopen("http://127.0.0.1:8652/cockpit", timeout=15) as r:
checks.append(("Cockpit", r.status == 200))
# Publishing unberuehrt
import subprocess
timer = subprocess.run(["systemctl","is-active","social-media-agent"], capture_output=True, text=True).stdout.strip()
checks.append(("Service aktiv", timer == "active"))
print("=== REGRESSION AA-045-F4 ===")
allok = True
for c in checks:
name, ok = c[0], c[1]
detail = c[2] if len(c) > 2 else ""
print(f"[{'OK ' if ok else 'FAIL'}] {name} {detail}")
allok = allok and ok
print("REGRESSION:", "BESTANDEN" if allok else "FEHLER")