from app import vcard BASE = { "full_name": "Dr. Anna Berg", "first_name": "Anna", "last_name": "Berg", "job_title": "Geschäftsführerin", "company": "Berg & Partner GmbH", "email": "a.berg@berg-partner.de", "phone": "+49 511 1234560", "mobile": "+49 170 1234567", "website": "berg-partner.de", "street": "Musterweg 3", "postal_code": "30159", "city": "Hannover", "country": "Deutschland", "notes": "Sucht ein neues CRM.", "captured_at": "2026-09-01T10:15:00+00:00", "place": "Hannover, Messegelände", "lat": 52.3216, "lon": 9.8078, } def test_enthaelt_die_pflichtzeilen(): output = vcard.build(BASE) assert output.startswith("BEGIN:VCARD\r\nVERSION:3.0\r\n") assert output.endswith("END:VCARD\r\n") assert "FN:Dr. Anna Berg" in output assert "N:Berg;Anna;;;" in output assert "TEL;TYPE=CELL:+49 170 1234567" in output def test_kommas_und_semikolons_werden_maskiert(): output = vcard.build({**BASE, "company": "Berg, Partner; Co"}) assert "ORG:Berg\\, Partner\\; Co" in output def test_notiz_traegt_zeit_und_ort(): note = [line for line in vcard.build(BASE).splitlines() if line.startswith("NOTE:")][0] assert "Sucht ein neues CRM." in note assert "01.09.2026" in note assert "Messegelände" in note def test_leere_karte_bekommt_trotzdem_einen_namen(): output = vcard.build({"notes": ""}) assert "FN:Unbenannt" in output def test_firma_ersetzt_den_namen_wenn_keiner_erkannt_wurde(): output = vcard.build({"company": "Berg & Partner GmbH"}) assert "FN:Berg & Partner GmbH" in output def test_dateiname_ist_dateisystemtauglich(): assert vcard.filename(BASE) == "Dr-Anna-Berg.vcf" assert vcard.filename({}) == "Unbenannt.vcf" assert vcard.filename({"full_name": "?!"}) == "kontakt.vcf"