gwoe-antragspruefer/tests
Dotty Dotter d54ce23e42 feat(#170): Aktuelle-Themen-Dashboard — News × Anträge × Pressemitteilungen
Vollständiges 4-Phasen-Feature:

**Phase 1 — News-Aggregator** (`app/news_aggregator.py`)
- Tagesschau-API (`/api2u/news?ressort=...`) für inland/ausland/wirtschaft/wissen
- Bundestag-RSS für aktuellethemen / pressemitteilungen / hib
- DB-Tabelle `news_articles` (URL-PK, idempotent)
- Embeddings via existierender qwen-v4-Pipeline
- Cron-Script `scripts/auto-fetch-news.sh`
- Bewusst NICHT: RND.de (robots.txt bannt explizit ClaudeBot, GPTBot,
  CCBot, ChatGPT-User, Google-Extended). Nur AI-erlaubende, öffentlich-
  rechtliche/parlamentarische Quellen
- Volltexte werden NICHT persistiert (nur Titel + erster Satz)

**Phase 2 — Themen × Anträge Matching** (`app/themen_matching.py`)
- News-Embedding × Assessment-summary_embedding via Cosine-Similarity
- `find_anträge_for_news`: pro News die Top-K passenden Anträge
- `find_news_for_antrag`: pro Antrag Top-K News mit Datums-Fenster (90d)
- `aggregate_top_themen`: primärer Dashboard-Endpoint
- `aggregate_themen_zeitreihe`: News-Volumen pro Tag × Source

**Phase 3 — Dashboard-View** (`/aktuelle-themen`)
- Neuer linker Nav-Eintrag „Aktuelle Themen"
- Stacked-Area-Chart News-Volumen pro Quelle (30d)
- Pro News-Card: Titel + Summary + Tags + Top-3-Antrags-Match-Liste
  mit GWÖ-Score-Pill, Drucksache-Link, PM-Vorschlag-Button
- Filter: Zeitfenster, Top-N, min_similarity
- Auth-protected (require_auth)

**Phase 4 — Pressemitteilungs-Generator** (`app/presse_generator.py`)
- LLM-Prompt-Template (200-250 Worte, GWÖ-Sicht, JSON-Output)
- Reuse von `QwenBewerter` aus app/adapters/qwen_bewerter.py
- DB-Tabelle `presse_drafts` (Persistenz)
- POST `/api/aktuelle-themen/generate-presse` rate-limited 5/min,
  auth-only (LLM-Kosten)
- GET `/api/aktuelle-themen/drafts` + `/drafts/{id}` für Liste/Detail
- Manueller Trigger via UI-Button, kein Auto-Versand
- Modal-Anzeige des generierten Texts

**Compliance:**
- robots.txt-respektierend (ClaudeBot-Bann von RND vermieden, AI-
  erlaubende Quellen verwendet)
- UI zeigt nur Titel+URL+Datum+erster Satz, keine Volltext-Reproduktion
- Pressemitteilungen sind explizit Drafts, nicht Auto-Versand
- LLM-Calls rate-limited, auth-only

**Tests:** 43 neue Tests (19 news_aggregator + 16 themen_matching +
8 presse_generator). Suite jetzt 1048 grün.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 12:39:36 +02:00
..
e2e test: 467 -> 574 Tests (+107) — DDD, abgeordnetenwatch, monitoring, v2, Bug-Regressions 2026-04-25 20:55:57 +02:00
integration Sub-B: NRW Sample 10/5376 — F.D.P.+CDU CO2-Minderungsprogramm 1990 2026-04-09 13:43:17 +02:00
__init__.py Add pytest suite + fix two regex bugs uncovered by it (#46) 2026-04-08 23:26:06 +02:00
conftest.py Add pytest suite + fix two regex bugs uncovered by it (#46) 2026-04-08 23:26:06 +02:00
test_abgeordnetenwatch.py test(#134): Coverage-Backfill drei Module 2026-04-28 10:50:26 +02:00
test_abonnement_repository.py test(#134): Coverage-Backfill auswertungen + Repositories 2026-04-28 10:54:28 +02:00
test_analyzer.py test(#134): analyzer Coverage 70.1% → 83.1% 2026-04-28 11:06:24 +02:00
test_antrag_repository.py test(#134): Coverage-Backfill auswertungen + Repositories 2026-04-28 10:54:28 +02:00
test_auswertungen_stimmverhalten.py feat(#168): Über-Zeit-Drift im Stimmverhalten-Tab 2026-04-29 23:03:53 +02:00
test_auswertungen.py test(#134): Coverage-Backfill auswertungen + Repositories 2026-04-28 10:54:28 +02:00
test_auth.py test(#134): auth.py Coverage 47.1% → 86% 2026-04-28 11:10:08 +02:00
test_bewertung_repository.py test(#134): Coverage-Backfill auswertungen + Repositories 2026-04-28 10:54:28 +02:00
test_bug_regressions.py test: 467 -> 574 Tests (+107) — DDD, abgeordnetenwatch, monitoring, v2, Bug-Regressions 2026-04-25 20:55:57 +02:00
test_bundeslaender.py Phase J: SN EDAS-XML-Adapter (#26/#38) — Sachsen aktiv via XML-Export 2026-04-09 14:39:03 +02:00
test_clustering.py test(#134): clustering.py Coverage 82.3% → 99.3% 2026-04-28 11:02:58 +02:00
test_database.py feat(#106): plenum_vote_results-Tabelle + Repository 2026-04-28 08:01:26 +02:00
test_domain_behavior.py test: 467 -> 574 Tests (+107) — DDD, abgeordnetenwatch, monitoring, v2, Bug-Regressions 2026-04-25 20:55:57 +02:00
test_drucksache_typen.py test(#134): drucksache_typen Coverage 72.5% → 100% 2026-04-28 11:04:31 +02:00
test_embeddings_v3_v4.py test: 467 -> 574 Tests (+107) — DDD, abgeordnetenwatch, monitoring, v2, Bug-Regressions 2026-04-25 20:55:57 +02:00
test_embeddings.py Hybrid-Zitate: verified/unverified statt drop + UI-Labels 2026-04-10 21:45:36 +02:00
test_endpoints_smoke.py Tests: 8 Endpoint-Smoke-Tests (queue, auth, programme, health) 2026-04-10 20:09:34 +02:00
test_feedback_endpoint.py feat(v2): Feedback-Widget mit Audit-Trail + Screenshot + direkter Gitea-Anbindung 2026-04-28 01:00:44 +02:00
test_ingest_votes.py test(#134): Coverage-Backfill drei Module 2026-04-28 10:50:26 +02:00
test_llm_bewerter.py test(#134): qwen_bewerter Coverage 86% → 94% 2026-04-28 10:56:56 +02:00
test_mail.py test(#134): mail.py Coverage 88.2% → 100% 2026-04-28 10:58:03 +02:00
test_main_validators.py Phase A: Audit-Restbefunde #57.3/4/7 (Roadmap #59) 2026-04-09 11:15:16 +02:00
test_monitoring.py test(#134): monitoring.py Coverage 83.2% → 99.3% 2026-04-28 11:01:19 +02:00
test_news_aggregator.py feat(#170): Aktuelle-Themen-Dashboard — News × Anträge × Pressemitteilungen 2026-05-03 12:39:36 +02:00
test_og_card.py test(#134): app/og_card.py Coverage 44% → 100% 2026-04-28 08:40:20 +02:00
test_parlamente.py fix(#142): SL HTTP 5xx als Fehler raisen statt return [] 2026-04-28 01:46:35 +02:00
test_parteien.py Phase B: Parteinamen-Mapper #55 (Roadmap #59) 2026-04-09 11:22:13 +02:00
test_presse_generator.py feat(#170): Aktuelle-Themen-Dashboard — News × Anträge × Pressemitteilungen 2026-05-03 12:39:36 +02:00
test_protokoll_parsers_bb.py feat(#149): BB-Parser produktiv — Brandenburger Plenarprotokolle (Status-Only) 2026-04-29 02:04:21 +02:00
test_protokoll_parsers_be.py feat(#150): BE-Parser produktiv — Berliner Abgeordnetenhaus-Plenarprotokolle 2026-04-29 00:37:47 +02:00
test_protokoll_parsers_bund.py feat(#148): BUND-Parser produktiv — Bundestags-XML-Plenarprotokolle 2026-04-28 23:21:39 +02:00
test_protokoll_parsers_hb.py feat(#153): HB-Parser produktiv — Bremer Beschlussprotokolle (Status-Only) 2026-04-29 01:41:40 +02:00
test_protokoll_parsers_hh.py test(#155): 19 Tests fuer HH-Parser 2026-04-29 01:05:33 +02:00
test_protokoll_parsers_nrw.py test(#134): NRW Protokoll-Parser Coverage 51.7% → 85.1% 2026-04-28 11:11:52 +02:00
test_protokoll_parsers_sh.py feat(#160): SH-Parser produktiv — Schleswig-Holsteiner Plenarprotokolle 2026-04-29 01:29:06 +02:00
test_protokoll_parsers_sl.py feat(#161): SL-Parser produktiv — Saarland HTML-Abstimmungsergebnisse 2026-04-29 01:53:51 +02:00
test_protokoll_parsers_stubs.py feat(#149): BB-Parser produktiv — Brandenburger Plenarprotokolle (Status-Only) 2026-04-29 02:04:21 +02:00
test_protokoll_parsers.py feat(#126): protokoll_parsers/-Sub-Package + Registry-Pattern + ADR 0009 2026-04-28 08:37:31 +02:00
test_queue.py test(#134): queue Coverage 26.6% → 43.4% 2026-04-28 11:08:04 +02:00
test_redline_parser.py test(#134): build_pdf_href Coverage 50% → 100% 2026-04-28 08:39:05 +02:00
test_report.py test(#134): report.py Coverage 44.3% → 52.7% 2026-04-28 11:13:20 +02:00
test_rss.py test(#134): test_rss.py — Atom-Feed-Validitaet, Filter, ETag, Limits 2026-04-28 02:01:01 +02:00
test_themen_matching.py feat(#170): Aktuelle-Themen-Dashboard — News × Anträge × Pressemitteilungen 2026-05-03 12:39:36 +02:00
test_wahlperioden.py test(#134): test_wahlperioden.py — Datum→WP-Mapping 2026-04-28 02:02:40 +02:00
test_wahlprogramm_check.py test: 467 -> 574 Tests (+107) — DDD, abgeordnetenwatch, monitoring, v2, Bug-Regressions 2026-04-25 20:55:57 +02:00
test_wahlprogramm_fetch.py test(#134): wahlprogramm_fetch Coverage 42.8% → 54.4% 2026-04-28 08:42:29 +02:00
test_wahlprogramme.py test(#134): Coverage-Backfill drei Module 2026-04-28 10:50:26 +02:00