gwoe-antragspruefer/tests/test_legislaturen.py

161 lines
6.7 KiB
Python
Raw Normal View History

"""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