"""Tests for bundeslaender.py — sanity over 16-state registry. Includes the #48 classification regression: TH must be ParlDok, HB must be StarWeb, SN must be Eigensystem (not ParlDok). """ from app.bundeslaender import BUNDESLAENDER, get, aktive_bundeslaender, alle_bundeslaender class TestRegistryStructure: def test_sixteen_bundeslaender(self): assert len(BUNDESLAENDER) == 16 def test_codes_are_uppercase(self): for code in BUNDESLAENDER: assert code.isupper(), f"{code} is not uppercase" def test_each_entry_has_naechste_wahl_or_none(self): for code, bl in BUNDESLAENDER.items(): assert bl.naechste_wahl is None or len(bl.naechste_wahl) == 10 def test_wahlperiode_is_positive_integer(self): for bl in BUNDESLAENDER.values(): assert isinstance(bl.wahlperiode, int) and bl.wahlperiode > 0 class TestActiveBundeslaender: def test_four_active_bundeslaender(self): active = aktive_bundeslaender() codes = {bl.code for bl in active} assert codes == {"NRW", "LSA", "MV", "BE"} def test_alle_bundeslaender_returns_all_sixteen(self): assert len(alle_bundeslaender()) == 16 def test_alle_bundeslaender_active_first(self): out = alle_bundeslaender() active_codes = {bl.code for bl in aktive_bundeslaender()} # The first len(active) entries must all be active for bl in out[: len(active_codes)]: assert bl.code in active_codes class TestGetHelper: def test_returns_bundesland_for_known_code(self): bl = get("NRW") assert bl is not None assert bl.name == "Nordrhein-Westfalen" def test_returns_none_for_unknown_code(self): assert get("XX") is None class TestClassificationFix48: """Regression: #48 corrected three doku_system entries that the follow-up adapter issues depend on.""" def test_th_is_parldok_not_starweb(self): assert BUNDESLAENDER["TH"].doku_system == "ParlDok" def test_hb_is_starweb_not_paris(self): """PARiS is just a StarWeb skin — must be classified as StarWeb.""" assert BUNDESLAENDER["HB"].doku_system == "StarWeb" def test_sn_is_eigensystem_not_parldok(self): """EDAS is ASP.NET-Webforms, NOT ParlDok-compatible with MV.""" assert BUNDESLAENDER["SN"].doku_system == "Eigensystem" class TestWahltermineSane: """All upcoming elections must be in chronological order and in the near future (sanity check that someone has not pasted a 1990 date).""" def test_no_election_before_2026(self): for bl in BUNDESLAENDER.values(): if bl.naechste_wahl: assert bl.naechste_wahl >= "2026-01-01" def test_no_election_after_2035(self): for bl in BUNDESLAENDER.values(): if bl.naechste_wahl: assert bl.naechste_wahl < "2035-01-01"