EN · DE · RU · FR · ES

#1864: CardDavXmlUtilsTest.kt

projectforge-carddav/src/test/kotlin/org/projectforge/carddav/CardDavXmlUtilsTest.kt Модульный тест — пакет org.projectforge.carddav, projectforge-carddav/src/test/kotlin/org/projectforge/carddav/CardDavXmlUtilsTest.kt 99 строк · 70 кода · 22 комментария · 7 пустых
Комплексный набор тестов для XML-утилит в CardDavXmlUtils: извлечение корневого элемента, парсинг идентификаторов контактов из multiget-запросов, извлечение имени/значения XML-элемента с поддержкой пространств имён и экранирование XML-сущностей. Эти утилиты образуют основу парсинга XML для обработчика протокола CardDAV.

Архитектура

CardDavXmlUtils предоставляет лёгкий парсинг XML без полноценного DOM/SAX-парсера — используя извлечение на основе регулярных выражений для специфических XML-нагрузок CardDAV. Такой подход выбран, поскольку XML-нагрузки CardDAV структурно предсказуемы (определены RFC 4918, 6352) и критичны к производительности.

Импорты

Тестируемые методы

1. getRootElement(xml) — Извлечение корневого элемента

Извлекает имя корневого XML-элемента из строки, обрабатывая опциональное XML-объявление (<?xml ... ?>) и элементы с префиксом пространства имён (d:multistatus). Тесты покрывают:

Это критически важно для обработчика ответов PROPFIND/REPORT, чтобы направлять запрос к правильному построителю ответов на основе типа корневого элемента.

2. extractContactIds(xml) — Извлечение ID контактов из multiget

Парсит тело запроса CardDAV addressbook-multiget REPORT для извлечения ID контактов ProjectForge из элементов <d:href>. Тесты парсят реалистичную XML-нагрузку с тремя записями <d:href>{путь}/ProjectForge-{id}.vcf</d:href> и проверяют корректное извлечение ID 7833476, 7858940, 7859171.

Метод использует сопоставление с регулярным выражением для шаблона имени файла ProjectForge-{id}.vcf внутри элементов href. Результат — Sequence<Int> (ленивое вычисление через .toList()).

3. getElementName(xml, name) — Разрешение имени элемента с учётом пространства имён

Находит именованный элемент в XML и возвращает его квалифицированное имя, включая префикс пространства имён:

Используется, когда серверу необходимо знать точное квалифицированное имя для генерации элемента ответа.

4. extractElementValue(xml, name) — Извлечение содержимого элемента

Извлекает текстовое содержимое именованного элемента из XML, обрабатывая:

5. escapeXml(xml) — Экранирование XML-сущностей

Экранирует пять специальных XML-символов в соответствии со спецификацией XML 1.0:

Тестовый ввод <hurzel test="dkfsld"> & ' экранируется в &lt;hurzel test=&quot;dkfsld&quot;&gt; &amp; &apos;.

Подход на основе регулярных выражений быстр, но хрупок — он не может обрабатывать произвольный XML с секциями CDATA, инструкциями по обработке или глубоко вложенными структурами. Он корректно работает только для предсказуемых XML-схем CardDAV, определённых в соответствующих RFC.

Шаблон тестовых данных

Все тесты используют функцию области видимости Kotlin let с сырыми строковыми литералами ("""...""") для XML-тестовых данных. trimIndent() и trimMargin() используются для очистки многострочных тестовых фикстур с сохранением структуры XML.

История Git

868d6abb7 2025 -> 2026
63081666f Заголовки исходных файлов: 2024-> 2025.
5167dab99 WIP: Carddav
6c1daac93 WIP: Carddav
0d7a81f91 WIP: Carddav
dc3936193 WIP: Carddav (Thunderbird работает, только чтение, включая изображения и т.д.)
caee35750 WIP: Carddav
2ad0cfe66 WIP: Carddav