88 lines
3.4 KiB
Python
88 lines
3.4 KiB
Python
|
|
"""Tests fuer app/wahlperioden.py — Datum→WP-Mapping fuer Aggregations-Sicht (#58).
|
||
|
|
|
||
|
|
Backfill aus #134.
|
||
|
|
"""
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import pytest
|
||
|
|
|
||
|
|
from app.wahlperioden import wahlperiode_for, all_wahlperioden
|
||
|
|
from app.bundeslaender import BUNDESLAENDER
|
||
|
|
|
||
|
|
|
||
|
|
class TestWahlperiodeFor:
|
||
|
|
def test_returns_current_wp_for_date_after_start(self):
|
||
|
|
bl = BUNDESLAENDER["NRW"]
|
||
|
|
# ein Tag nach Wahlperiode-Start → aktuelle WP
|
||
|
|
# (lexikographische ISO-Vergleich-Grenze)
|
||
|
|
date_after = bl.wahlperiode_start
|
||
|
|
assert wahlperiode_for(date_after, "NRW") == f"NRW-WP{bl.wahlperiode}"
|
||
|
|
|
||
|
|
def test_returns_previous_wp_for_date_before_start(self):
|
||
|
|
bl = BUNDESLAENDER["NRW"]
|
||
|
|
# ein Datum klar vor dem WP-Start
|
||
|
|
assert wahlperiode_for("2010-01-01", "NRW") == f"NRW-WP{bl.wahlperiode - 1}"
|
||
|
|
|
||
|
|
def test_returns_none_for_unknown_bundesland(self):
|
||
|
|
assert wahlperiode_for("2026-03-18", "XX") is None
|
||
|
|
|
||
|
|
def test_empty_datum_falls_back_to_current_wp(self):
|
||
|
|
bl = BUNDESLAENDER["NRW"]
|
||
|
|
assert wahlperiode_for("", "NRW") == f"NRW-WP{bl.wahlperiode}"
|
||
|
|
|
||
|
|
def test_none_datum_falls_back_to_current_wp(self):
|
||
|
|
bl = BUNDESLAENDER["NRW"]
|
||
|
|
# Aufrufer schickt None; der Code prueft `if not datum`
|
||
|
|
assert wahlperiode_for(None, "NRW") == f"NRW-WP{bl.wahlperiode}"
|
||
|
|
|
||
|
|
def test_boundary_date_equals_wp_start(self):
|
||
|
|
"""An der WP-Start-Grenze gehoert der Tag zur neuen WP (>=)."""
|
||
|
|
bl = BUNDESLAENDER["MV"]
|
||
|
|
assert wahlperiode_for(bl.wahlperiode_start, "MV") == f"MV-WP{bl.wahlperiode}"
|
||
|
|
|
||
|
|
def test_doctest_examples(self):
|
||
|
|
"""Die Docstring-Examples muessen halten."""
|
||
|
|
# 2026-03-18 ist nach MV WP8-Start (2021-09-26)
|
||
|
|
assert wahlperiode_for("2026-03-18", "MV") == "MV-WP8"
|
||
|
|
# 2020-01-01 ist davor → WP7
|
||
|
|
assert wahlperiode_for("2020-01-01", "MV") == "MV-WP7"
|
||
|
|
|
||
|
|
def test_lexicographic_iso_date_works(self):
|
||
|
|
"""ISO-Format YYYY-MM-DD vergleicht lexikographisch korrekt."""
|
||
|
|
bl = BUNDESLAENDER["NRW"]
|
||
|
|
start = bl.wahlperiode_start # z.B. "2022-06-01"
|
||
|
|
# Ein Tag davor (gleiches Jahr) gehoert zur Vorgaenger-WP
|
||
|
|
if start[5:7] != "01" or start[8:10] != "01":
|
||
|
|
# nicht 1. Januar — Day-1 Test einfach moeglich
|
||
|
|
year, month, day = int(start[:4]), int(start[5:7]), int(start[8:10])
|
||
|
|
if day > 1:
|
||
|
|
day_before = f"{year:04d}-{month:02d}-{day-1:02d}"
|
||
|
|
else:
|
||
|
|
day_before = f"{year:04d}-{month-1:02d}-28"
|
||
|
|
assert wahlperiode_for(day_before, "NRW") == f"NRW-WP{bl.wahlperiode - 1}"
|
||
|
|
|
||
|
|
|
||
|
|
class TestAllWahlperioden:
|
||
|
|
def test_includes_each_bundesland(self):
|
||
|
|
all_wp = all_wahlperioden()
|
||
|
|
# pro BL zwei Eintraege (current + previous)
|
||
|
|
assert len(all_wp) == len(BUNDESLAENDER) * 2
|
||
|
|
|
||
|
|
def test_format_is_BL_WPn(self):
|
||
|
|
for entry in all_wahlperioden():
|
||
|
|
parts = entry.split("-WP")
|
||
|
|
assert len(parts) == 2, entry
|
||
|
|
bl_code, wp_num = parts
|
||
|
|
assert bl_code in BUNDESLAENDER, bl_code
|
||
|
|
assert wp_num.isdigit(), wp_num
|
||
|
|
|
||
|
|
def test_no_duplicates(self):
|
||
|
|
all_wp = all_wahlperioden()
|
||
|
|
assert len(all_wp) == len(set(all_wp))
|
||
|
|
|
||
|
|
def test_contains_known_examples(self):
|
||
|
|
all_wp = all_wahlperioden()
|
||
|
|
# NRW WP18 + 17 muessen drin sein
|
||
|
|
assert "NRW-WP18" in all_wp
|
||
|
|
assert "NRW-WP17" in all_wp
|