"""AA-045-F3 Test E: End-to-End reales Signal.
Radar-Collect (echter YouTube-Intake) -> Briefing -> Caption -> Visuals."""
import sys, json
sys.path.insert(0, "/opt/struktur/social-media-radar")
# 1. Radar-Collect: echter Produktionspfad (YouTube-Suche + RSS + Wetter)
from radar import collect_signals
total = collect_signals()
print("Neue Signale aus Radar-Lauf:", total)
import sqlite3
conn = sqlite3.connect("/var/lib/sma-data/signals.db")
conn.row_factory = sqlite3.Row
# 2. Ein reales neues YouTube-Signal waehlen
sig = conn.execute("""
SELECT signal_id, topic, briefing_winkel FROM signals
WHERE source_type='youtube' AND status='neu'
ORDER BY created_at DESC LIMIT 1""").fetchone()
if not sig:
sig = conn.execute("""
SELECT signal_id, topic, briefing_winkel FROM signals
WHERE status='neu' AND COALESCE(mallorca_relevance,0)>0
ORDER BY created_at DESC LIMIT 1""").fetchone()
SID = sig["signal_id"]
had_briefing_before = bool(sig["briefing_winkel"])
print(f"Testsignal: {SID[:12]} | {(sig['topic'] or '')[:55]} | Briefing vorher vorhanden: {had_briefing_before}")
# 3. Director + Briefing (wie in run_radar.sh verdrahtet)
from content_director import run as run_director
run_director(limit=500, min_radar_score=30.0)
from content_briefing import run as run_briefing
run_briefing(limit=500)
r = dict(conn.execute("SELECT briefing_winkel, briefing_nutzen, briefing_error FROM signals WHERE signal_id=?", (SID,)).fetchone())
assert r["briefing_winkel"], "Briefing fehlt nach Lauf!"
print("Briefing:", r["briefing_winkel"][:50], "|", r["briefing_nutzen"][:40], "| error:", repr(r["briefing_error"]))
# 4. Caption + beide Visuals ueber die echten API-Endpoints
import urllib.request
def api(path):
with urllib.request.urlopen(f"http://127.0.0.1:8652{path}", timeout=120) as resp:
return json.loads(resp.read())
cap = api(f"/api/visual/{SID}?fmt=1x1") # Warmup (Playwright)
v1 = api(f"/api/visual/{SID}?fmt=1x1")
v4 = api(f"/api/visual/{SID}?fmt=4x5")
caption = api(f"/api/caption/{SID}")
print("Visual 1x1:", "OK" if v1.get("success") else v1.get("reason","")[:60])
print("Visual 4x5:", "OK" if v4.get("success") else v4.get("reason","")[:60])
print("Caption:", "OK" if caption.get("success") else caption.get("reason","")[:80])
e2e = (r["briefing_winkel"] and v1.get("success") and v4.get("success"))
print("\nTEST E:", "BESTANDEN" if e2e else "TEILWEISE (Caption ggf. durch fachliche Freigabe blockiert)")