79 lines
3.1 KiB
Python
79 lines
3.1 KiB
Python
from __future__ import annotations
|
|
|
|
import unittest
|
|
|
|
from govoplan_addresses.backend.db.models import Contact, ContactEmail, ContactPhone, ContactPostalAddress
|
|
from govoplan_addresses.backend.vcard import contact_to_vcard, parse_vcards_with_issues
|
|
|
|
|
|
class VCardTests(unittest.TestCase):
|
|
def test_parse_vcard_preserves_folded_and_escaped_text(self) -> None:
|
|
result = parse_vcards_with_issues(
|
|
"BEGIN:VCARD\r\n"
|
|
"VERSION:4.0\r\n"
|
|
"UID:contact-1\r\n"
|
|
"FN:Ada \r\n"
|
|
" Lovelace\r\n"
|
|
"N:Lovelace;Ada;;;\r\n"
|
|
"NOTE:Line one\\nLine two\r\n"
|
|
"CATEGORIES:science\\,history,engineering\r\n"
|
|
"EMAIL;TYPE=work;PREF=1:ada@example.local\r\n"
|
|
"ADR;TYPE=work:;;Main Street 1;Berlin;BE;10115;Germany\r\n"
|
|
"URL:https://example.local/ada\r\n"
|
|
"END:VCARD\r\n"
|
|
)
|
|
|
|
self.assertEqual([], result.issues)
|
|
self.assertEqual(1, len(result.cards))
|
|
payload = result.cards[0].payload
|
|
self.assertEqual("Ada Lovelace", payload.display_name)
|
|
self.assertEqual("Line one\nLine two", payload.note)
|
|
self.assertEqual(["science,history", "engineering"], payload.tags)
|
|
self.assertEqual("work", payload.emails[0].label)
|
|
self.assertTrue(payload.emails[0].is_primary)
|
|
self.assertEqual("Berlin", payload.postal_addresses[0].locality)
|
|
self.assertEqual(["https://example.local/ada"], payload.provenance["vcard"]["urls"])
|
|
|
|
def test_contact_to_vcard_escapes_text_and_filters_urls(self) -> None:
|
|
contact = Contact(
|
|
address_book_id="book-1",
|
|
display_name="Ada Lovelace",
|
|
given_name="Ada",
|
|
family_name="Lovelace",
|
|
organization="Analytical Engine Office",
|
|
role_title="Mathematician",
|
|
note="Line one\nLine two",
|
|
tags=["science,history", "engineering"],
|
|
source_ref="contact-1",
|
|
source_revision="rev-1",
|
|
provenance={"vcard": {"urls": [" https://example.local/ada ", "", 42]}},
|
|
)
|
|
contact.emails = [ContactEmail(label="work", email="ada@example.local", is_primary=True, order_index=0)]
|
|
contact.phones = [ContactPhone(label="work", phone="+49 30 123", is_primary=True, order_index=0)]
|
|
contact.postal_addresses = [
|
|
ContactPostalAddress(
|
|
label="work",
|
|
street="Main Street 1",
|
|
locality="Berlin",
|
|
region="BE",
|
|
postal_code="10115",
|
|
country="Germany",
|
|
is_primary=True,
|
|
order_index=0,
|
|
)
|
|
]
|
|
|
|
content = contact_to_vcard(contact)
|
|
|
|
self.assertIn("UID:contact-1\r\n", content)
|
|
self.assertIn("REV:rev-1\r\n", content)
|
|
self.assertIn("NOTE:Line one\\nLine two\r\n", content)
|
|
self.assertIn("CATEGORIES:science\\,history,engineering\r\n", content)
|
|
self.assertIn("EMAIL;TYPE=work:ada@example.local\r\n", content)
|
|
self.assertIn("URL:https://example.local/ada\r\n", content)
|
|
self.assertNotIn("URL:42", content)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|