"""Fahrer-Matching (Plan §6.4).""" from oamc.matching.fahrer import ( fahrer_zusammenfuehren, finde_exakt, match_oder_neu, normalisiere, ) from tests import factories as f def test_normalisierung_akzente_und_bindestriche(): assert normalisiere("Gál-Szász") == "gal szasz" assert normalisiere("D'Angelo") == "d'angelo" assert normalisiere(" Müller ") == "muller" def test_exakter_match_ueber_normalisierten_namen(seed_2026): db = seed_2026 f.fahrer(db, "Gál-Szász", "Péter", 2015) treffer = finde_exakt(db, "Gal-Szasz", "Peter", 2015) assert treffer is not None assert treffer.nachname == "Gál-Szász" def test_kein_match_legt_neuen_fahrer_an_und_markiert_neu(seed_2026): db = seed_2026 erg = match_oder_neu(db, nachname="Neuling", vorname="Nora", geburtsjahr=2000, anlegen=True) assert erg.status.value == "neu" assert erg.neu_angelegt and erg.fahrer.id is not None def test_dry_run_legt_nichts_an(seed_2026): db = seed_2026 erg = match_oder_neu(db, nachname="Probe", vorname="Peter", anlegen=False) assert erg.status.value in {"neu", "unscharf"} assert erg.fahrer is None def test_familien_namensgleichheit_trennt_ueber_vorname(seed_2026): db = seed_2026 f.fahrer(db, "Bernius", "Meik", 1985) f.fahrer(db, "Bernius", "Jörg", 1960) assert finde_exakt(db, "Bernius", "Meik", 1985).vorname == "Meik" assert finde_exakt(db, "Bernius", "Jörg", 1960).vorname == "Jörg" def test_merge_haengt_starts_um_und_deaktiviert_quelle(seed_2026): db = seed_2026 t = f.turnier(db) k = f.klasse(db, "S 6") ziel = f.fahrer(db, "Krack", "Robin", 1995) dublette = f.fahrer(db, "Krack", "Robin", 1995) f.start(db, t, dublette, k, startnummer=5) anzahl = fahrer_zusammenfuehren(db, ziel.id, dublette.id) db.flush() assert anzahl == 1 assert dublette.aktiv is False assert ziel.starts[0].startnummer == 5