EN · DE · RU · FR · ES

#1864: CardDavXmlUtilsTest.kt

projectforge-carddav/src/test/kotlin/org/projectforge/carddav/CardDavXmlUtilsTest.kt Unit-Test — Paket org.projectforge.carddav, projectforge-carddav/src/test/kotlin/org/projectforge/carddav/CardDavXmlUtilsTest.kt 99 Zeilen · 70 Code · 22 Kommentare · 7 leer
Umfassende Testsuite für XML-Hilfsfunktionen in CardDavXmlUtils: Wurzelelement-Extraktion, Kontakt-ID-Parsing aus Multiget-Anfragen, XML-Elementnamen-/Wert-Extraktion mit Namespace-Unterstützung und XML-Entity-Escaping. Diese Hilfsfunktionen bilden das XML-Parsing-Rückgrat des CardDAV-Protokoll-Handlers.

Architektur

CardDavXmlUtils bietet leichtgewichtiges XML-Parsing ohne vollständigen DOM/SAX-Parser – mittels regex-basierter Extraktion für CardDAV-spezifische XML-Nutzlasten. Dieser Ansatz wurde gewählt, weil CardDAV-XML-Nutzlasten strukturell vorhersagbar (definiert durch RFCs 4918, 6352) und leistungskritisch sind.

Importe

Getestete Methoden

1. getRootElement(xml) — Wurzelelement-Extraktion

Extrahiert den XML-Wurzelelementnamen aus einem String und behandelt dabei optionale XML-Deklaration (<?xml ... ?>) und Namespace-präfixierte Elemente (d:multistatus). Die Tests decken ab:

Dies ist entscheidend für den PROPFIND/REPORT-Antwort-Handler, um basierend auf dem Wurzelelementtyp an den richtigen Antwort-Builder weiterzuleiten.

2. extractContactIds(xml) — Multiget-Kontakt-ID-Extraktion

Parst einen CardDAV addressbook-multiget REPORT-Anfragekörper, um ProjectForge-Kontakt-IDs aus <d:href>-Elementen zu extrahieren. Tests parsen eine realistische XML-Nutzlast mit drei <d:href>{Pfad}/ProjectForge-{ID}.vcf</d:href>-Einträgen und verifizieren die korrekte Extraktion der IDs 7833476, 7858940, 7859171.

Die Methode verwendet Regex-Abgleich auf das ProjectForge-{ID}.vcf-Dateinamenmuster innerhalb von href-Elementen. Das Ergebnis ist eine Sequence<Int> (faule Auswertung via .toList()).

3. getElementName(xml, name) — Namespace-bewusste Elementnamen-Auflösung

Findet ein benanntes Element in XML und gibt dessen qualifizierten Namen inklusive Namespace-Präfix zurück:

Dies wird verwendet, wenn der Server den genauen qualifizierten Namen für die Erzeugung von Antwortelementen kennen muss.

4. extractElementValue(xml, name) — Element-Inhalt-Extraktion

Extrahiert den Textinhalt eines benannten Elements aus XML und behandelt:

5. escapeXml(xml) — XML-Entity-Escaping

Escaped fünf XML-Sonderzeichen gemäß XML-1.0-Spezifikation:

Die Testeingabe <hurzel test="dkfsld"> & ' wird escaped zu &lt;hurzel test=&quot;dkfsld&quot;&gt; &amp; &apos;.

Der regex-basierte Ansatz ist schnell, aber zerbrechlich – er kann kein beliebiges XML mit CDATA-Abschnitten, Processing Instructions oder tief verschachtelten Strukturen verarbeiten. Er funktioniert nur korrekt für die vorhersagbaren CardDAV-XML-Schemata, die in den relevanten RFCs definiert sind.

Testdaten-Muster

Alle Tests verwenden Koltins let-Scope-Funktion mit rohen String-Literalen ("""...""") für XML-Testdaten. trimIndent() und trimMargin() werden verwendet, um mehrzeilige Testvorlagen zu bereinigen, während die XML-Struktur erhalten bleibt.

Git-Verlauf

868d6abb7 2025 -> 2026
63081666f Quelltext-Dateiköpfe: 2024 -> 2025.
5167dab99 WIP: Carddav
6c1daac93 WIP: Carddav
0d7a81f91 WIP: Carddav
dc3936193 WIP: Carddav (Thunderbird funktioniert, schreibgeschützt, inkl. Bilder usw.)
caee35750 WIP: Carddav
2ad0cfe66 WIP: Carddav