EN · DE · RU · FR · ES

#1864: CardDavXmlUtilsTest.kt

projectforge-carddav/src/test/kotlin/org/projectforge/carddav/CardDavXmlUtilsTest.kt Prueba unitaria — paquete org.projectforge.carddav, projectforge-carddav/src/test/kotlin/org/projectforge/carddav/CardDavXmlUtilsTest.kt 99 líneas · 70 código · 22 comentarios · 7 en blanco
Suite de pruebas exhaustiva para las funciones de utilidad XML en CardDavXmlUtils: extracción del elemento raíz, análisis de ID de contacto desde solicitudes multiget, extracción de nombre/valor de elementos XML con soporte de espacios de nombres y escape de entidades XML. Estas utilidades forman la columna vertebral del análisis XML del manejador del protocolo CardDAV.

Arquitectura

CardDavXmlUtils proporciona un análisis XML ligero sin un analizador DOM/SAX completo — utilizando extracción basada en expresiones regulares para cargas útiles XML específicas de CardDAV. Este enfoque se elige porque las cargas útiles XML de CardDAV son estructuralmente predecibles (definidas por los RFC 4918, 6352) y críticas para el rendimiento.

Importaciones

Métodos probados

1. getRootElement(xml) — Extracción del elemento raíz

Extrae el nombre del elemento raíz XML de una cadena, manejando la declaración XML opcional (<?xml ... ?>) y elementos con prefijo de espacio de nombres (d:multistatus). Las pruebas cubren:

Esto es crítico para que el manejador de respuesta PROPFIND/REPORT envíe al constructor de respuesta correcto según el tipo de elemento raíz.

2. extractContactIds(xml) — Extracción de ID de contacto Multiget

Analiza el cuerpo de una solicitud REPORT addressbook-multiget de CardDAV para extraer los ID de contacto de ProjectForge de los elementos <d:href>. Las pruebas analizan una carga útil XML realista con tres entradas <d:href>{ruta}/ProjectForge-{id}.vcf</d:href> y verifican la extracción correcta de los ID 7833476, 7858940, 7859171.

El método utiliza coincidencia de expresiones regulares en el patrón de nombre de archivo ProjectForge-{id}.vcf dentro de los elementos href. El resultado es un Sequence<Int> (evaluación perezosa vía .toList()).

3. getElementName(xml, name) — Resolución de nombre de elemento con espacio de nombres

Encuentra un elemento nombrado en XML y devuelve su nombre calificado incluyendo el prefijo del espacio de nombres:

Esto se utiliza cuando el servidor necesita conocer el nombre calificado exacto para la generación del elemento de respuesta.

4. extractElementValue(xml, name) — Extracción de contenido de elemento

Extrae el contenido de texto de un elemento nombrado desde XML, manejando:

5. escapeXml(xml) — Escape de entidades XML

Escapa cinco caracteres especiales XML según la especificación XML 1.0:

La entrada de prueba <hurzel test="dkfsld"> & ' se escapa a &lt;hurzel test=&quot;dkfsld&quot;&gt; &amp; &apos;.

El enfoque basado en expresiones regulares es rápido pero frágil — no puede manejar XML arbitrario con secciones CDATA, instrucciones de procesamiento o estructuras profundamente anidadas. Funciona correctamente solo para los esquemas XML predecibles de CardDAV definidos en los RFC relevantes.

Patrón de datos de prueba

Todas las pruebas utilizan la función de ámbito let de Kotlin con literales de cadena sin procesar ("""...""") para los datos de prueba XML. Se utilizan trimIndent() y trimMargin() para limpiar los fixtures de prueba multilínea mientras se preserva la estructura XML.

Historial Git

868d6abb7 2025 -> 2026
63081666f Encabezados de archivos fuente: 2024-> 2025.
5167dab99 WIP: Carddav
6c1daac93 WIP: Carddav
0d7a81f91 WIP: Carddav
dc3936193 WIP: Carddav (Thunderbird funciona, solo lectura, incluyendo imágenes etc.)
caee35750 WIP: Carddav
2ad0cfe66 WIP: Carddav