"""Dublettenerkennung. Auf Messen trifft man Leute wieder.""" import uuid import pytest from app import db, duplicates def _card(**felder): columns = { "id": uuid.uuid4().hex, "created_at": "2026-09-01T10:00:00+00:00", "extract_status": "ok", **felder, } names = ", ".join(columns) db.execute( f"INSERT INTO cards ({names}) VALUES ({', '.join('?' for _ in columns)})", list(columns.values()), ) return db.query_one("SELECT * FROM cards WHERE id = ?", (columns["id"],)) @pytest.fixture(autouse=True) def leere_tabelle(): db.execute("DELETE FROM cards") yield db.execute("DELETE FROM cards") def test_gleiche_email_wird_gefunden(): _card(first_name="Anna", last_name="Berg", email="A.Berg@Firma.de") neu = _card(first_name="A.", last_name="Berg", email="a.berg@firma.de") treffer = duplicates.find(neu) assert [t["reason"] for t in treffer] == ["gleiche E-Mail"] def test_telefonnummer_in_anderer_schreibweise(): _card(first_name="Anna", last_name="Berg", phone="+49 511 1234560") neu = _card(first_name="Anna", last_name="B.", mobile="0511/1234560") treffer = duplicates.find(neu) assert [t["reason"] for t in treffer] == ["gleiche Telefonnummer"] def test_name_und_firma_zusammen(): _card(last_name="Berg", company="Berg & Partner GmbH") neu = _card(last_name="berg", company="berg & partner gmbh") assert [t["reason"] for t in duplicates.find(neu)] == ["gleicher Name und dieselbe Firma"] def test_gleicher_nachname_allein_reicht_nicht(): _card(last_name="Berg", company="Andere GmbH") neu = _card(last_name="Berg", company="Berg & Partner GmbH") assert duplicates.find(neu) == [] def test_kurze_nummern_werden_nicht_verglichen(): # Eine dreistellige Durchwahl darf keine Dublette erzeugen. _card(first_name="Anna", last_name="Berg", phone="123") neu = _card(first_name="Bea", last_name="Kurz", phone="123") assert duplicates.find(neu) == [] def test_leere_felder_erzeugen_keine_treffer(): _card(first_name="Anna", last_name="Berg") neu = _card(first_name="Bea", last_name="Kurz") assert duplicates.find(neu) == [] def test_die_karte_selbst_ist_keine_dublette(): karte = _card(first_name="Anna", last_name="Berg", email="a@b.de") assert duplicates.find(karte) == [] def test_noch_nicht_gelesene_karten_bleiben_aussen_vor(): _card(first_name="Anna", last_name="Berg", email="a@b.de", extract_status="offen") neu = _card(first_name="Anna", last_name="Berg", email="a@b.de") assert duplicates.find(neu) == []