161 lines
6.7 KiB
Python
161 lines
6.7 KiB
Python
|
|
"""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
|