"""Tests for app.legislaturen — Wahlperioden + Regierungen.""" import pytest from app.legislaturen import ( LEGISLATUREN, REGIERUNGEN, legislatur_zum_zeitpunkt, regierung_zum_zeitpunkt, aktuelle_legislatur, aktuelle_regierung, regierungen_einer_wp, parteien_in_regierung_zum_zeitpunkt, alle_legislaturen, alle_regierungen, ) # ───────────────────────────────────────────────────────────────────────────── # Daten-Konsistenz # ───────────────────────────────────────────────────────────────────────────── class TestKonsistenz: def test_legislaturen_alle_17_bundeslaender_present(self): # 16 BL + BUND bls = {leg["bundesland"] for leg in LEGISLATUREN} assert bls == { "BW", "BY", "BE", "BB", "HB", "HH", "HE", "MV", "NI", "NRW", "RP", "SL", "SN", "LSA", "SH", "TH", "BUND", } def test_jede_legislatur_hat_pflichtfelder(self): for leg in LEGISLATUREN: assert "bundesland" in leg assert "wp" in leg assert "wahltermin" in leg assert "konstituierung" in leg assert "ende" in leg def test_jede_regierung_hat_pflichtfelder(self): for reg in REGIERUNGEN: for f in ("bundesland", "name", "wp", "parteien", "ministerpraesident", "von", "bis"): assert f in reg, f"{reg['name']}: feld {f} fehlt" def test_genau_eine_aktuelle_legislatur_pro_bl(self): from collections import Counter counts = Counter( leg["bundesland"] for leg in LEGISLATUREN if leg["ende"] is None ) for bl, n in counts.items(): assert n == 1, f"{bl} hat {n} aktuelle Legislaturen" # alle 17 BL/BUND müssen eine aktuelle haben assert len(counts) == 17 def test_genau_eine_aktuelle_regierung_pro_bl(self): from collections import Counter counts = Counter( reg["bundesland"] for reg in REGIERUNGEN if reg["bis"] is None ) assert len(counts) == 17 for bl, n in counts.items(): assert n == 1, f"{bl}: {n} aktuelle Regierungen" def test_regierungs_intervalle_pro_bl_zusammenhängend(self): """Pro BL: die Regierungen-Zeitleiste hat keine Lücken.""" from collections import defaultdict by_bl = defaultdict(list) for reg in REGIERUNGEN: by_bl[reg["bundesland"]].append(reg) for bl, regs in by_bl.items(): regs.sort(key=lambda r: r["von"]) for i in range(1, len(regs)): vorher = regs[i - 1] jetzt = regs[i] # Wenn vorher.bis gesetzt, sollte = jetzt.von sein if vorher.get("bis") is not None: assert vorher["bis"] == jetzt["von"], \ f"{bl}: Lücke zwischen {vorher['name']} ({vorher['bis']}) und {jetzt['name']} ({jetzt['von']})" # ───────────────────────────────────────────────────────────────────────────── # Helper-Korrektheit # ───────────────────────────────────────────────────────────────────────────── class TestHelpers: def test_aktuelle_regierung_bund(self): r = aktuelle_regierung("BUND") assert r["name"] == "Merz I" assert r["parteien"] == ["CDU", "CSU", "SPD"] def test_aktuelle_regierung_th_voigt_brombeer(self): r = aktuelle_regierung("TH") assert r["name"] == "Voigt I" assert "BSW" in r["parteien"] def test_aktuelle_legislatur_nrw(self): leg = aktuelle_legislatur("NRW") assert leg["wp"] == 18 def test_legislatur_zum_zeitpunkt_nrw_2018(self): leg = legislatur_zum_zeitpunkt("NRW", "2018-09-01") assert leg["wp"] == 17 def test_legislatur_zum_zeitpunkt_nrw_2011(self): leg = legislatur_zum_zeitpunkt("NRW", "2011-09-01") assert leg["wp"] == 15 def test_kemmerich_kabinett_TH_2020_02(self): """Das berühmte 28-Tage-Kabinett von Kemmerich in TH.""" r = regierung_zum_zeitpunkt("TH", "2020-02-15") assert r is not None assert r["name"] == "Kemmerich I" assert r["parteien"] == ["FDP"] def test_rp_uebergang_dreyer_zu_schweitzer(self): # Vor 2024-07-10: Dreyer III r1 = regierung_zum_zeitpunkt("RP", "2024-07-09") assert r1["name"] == "Dreyer III" # Ab 2024-07-10: Schweitzer I r2 = regierung_zum_zeitpunkt("RP", "2024-07-10") assert r2["name"] == "Schweitzer I" # Beide in WP18 assert r1["wp"] == 18 and r2["wp"] == 18 def test_bund_scholz_to_merz(self): # Scholz I Ampel r1 = regierung_zum_zeitpunkt("BUND", "2023-06-01") assert r1["name"] == "Scholz I" assert "FDP" in r1["parteien"] # nach FDP-Ausstieg (2024-11-06) r2 = regierung_zum_zeitpunkt("BUND", "2024-12-01") assert "Scholz" in r2["name"] assert "FDP" not in r2["parteien"] # Merz seit 2025-05-06 r3 = regierung_zum_zeitpunkt("BUND", "2025-06-01") assert r3["name"] == "Merz I" def test_parteien_in_regierung_zum_zeitpunkt(self): parteien = parteien_in_regierung_zum_zeitpunkt("BUND", "2025-06-01") assert set(parteien) == {"CDU", "CSU", "SPD"} def test_regierungen_einer_wp_rp18(self): # In RP WP18 gibt es 2 Regierungen (Dreyer III + Schweitzer I) regs = regierungen_einer_wp("RP", 18) assert len(regs) == 2 assert [r["name"] for r in regs] == ["Dreyer III", "Schweitzer I"] def test_alle_legislaturen_nrw(self): legs = alle_legislaturen("NRW") assert [l["wp"] for l in legs] == [15, 16, 17, 18] def test_alle_regierungen_bund(self): regs = alle_regierungen("BUND") # Mind. 5: Merkel III, IV, Scholz I, Scholz I (gf), Merz I assert len(regs) >= 5 class TestEdgecases: def test_unbekannte_bl_returns_none(self): assert legislatur_zum_zeitpunkt("XX", "2025-01-01") is None assert regierung_zum_zeitpunkt("XX", "2025-01-01") is None assert aktuelle_regierung("XX") is None def test_zeitpunkt_vor_aller_dokumentation(self): # In NRW reicht das Schema bis WP15 (ab 2010-06-09) zurück assert legislatur_zum_zeitpunkt("NRW", "2005-01-01") is None