EN · DE · RU · FR · ES

#1866: PropFindRequestHandlerTest.kt

projectforge-carddav/src/test/kotlin/org/projectforge/carddav/PropFindRequestHandlerTest.kt Модульный тест — пакет org.projectforge.carddav, projectforge-carddav/src/test/kotlin/org/projectforge/carddav/PropFindRequestHandlerTest.kt 108 строк · 83 кода · 22 комментария · 3 пустых
Тестирует PropFindRequestHandler.generatePropFindResponse() — основной генератор ответов WebDAV PROPFIND. Проверяет корректные XML-ответы multistatus для двух сценариев: запросы типа ресурса/отображаемого имени и запросы участника/привилегий. Использует моки Mockito для HTTP-сервлетных объектов и реальную сущность PFUserDO.

Архитектура

PropFindRequestHandler — это серверный обработчик, отвечающий на запросы CardDAV PROPFIND в соответствии с RFC 4918 (WebDAV). PROPFIND — основной механизм, с помощью которого CardDAV-клиенты обнаруживают возможности сервера, типы ресурсов и информацию об участнике.

Импорты

Сценарии тестирования

Сценарий 1: RESOURCETYPE + DISPLAYNAME

Когда клиент отправляет PROPFIND для свойств resourcetype и displayname на /carddav/users/kai/, обработчик должен ответить:

Ответ представляет собой полный XML-документ multistatus с объявлениями пространств имён DAV, CardDAV, CalDAV и пользовательского.

Сценарий 2: CURRENT_USER_PRINCIPAL + PRIVILEGE_SET + PRINCIPAL_URL

Когда клиент запрашивает свойства идентификации пользователя:

Граф зависимостей

КлассРоль
PropПредставляет одно запрошенное свойство DAV со значением перечисления PropType
PropTypeПеречисление известных свойств DAV: RESOURCETYPE, DISPLAYNAME, CURRENT_USER_PRINCIPAL, CURRENT_USER_PRIVILEGE_SET, PRINCIPAL_URL, GETETAG, GETCTAG, SYNCTOKEN
RequestWrapperОборачивает HttpServletRequest, извлекает URI запроса для генерации href в ответе
WriterContextОбъединяет обёртку запроса, ответ, пользователя и запрошенные свойства — полный контекст, необходимый обработчику
PropFindRequestHandlerСтатический метод generatePropFindResponse(WriterContext): String — чистая функция, генерирующая XML-строку

Стратегия мокирования

Объявления пространств имён XML

Все ответы включают следующие объявления пространств имён XML:

xmlns:d="DAV:"
xmlns:card="urn:ietf:params:xml:ns:carddav"
xmlns:cs="http://calendarserver.org/ns/"
xmlns:me="http://me.com/_namespace/"

Они соответствуют: ядру DAV, CardDAV, расширениям Apple CalendarServer и пользовательскому пространству имён.

Обработчик — чистая функция (создаёт XML-строку из контекста) — без побочных эффектов, без доступа к базе данных. Такая архитектура делает его легко тестируемым и следует шаблону «функциональное ядро / императивная оболочка».

История Git

КоммитЧто изменилось в этом файле
868d6abb7Год авторского права 2025→2026. Без изменения логики.
63081666fГод авторского права 2024→2025. Без изменения логики.
f86cfa20aУдалён <card:addressbook/> из ожидаемого XML. Тип ресурса сообщает только <d:collection/> — больше не заявляет о поддержке адресной книги CardDAV. Финальная очистка после нескольких циклов добавления/удаления элемента addressbook.
139f9f316Добавлен <card:addressbook/> в тип ресурса. Часть поддержки фото/аватаров — элемент был ненадолго добавлен для анонсирования возможностей CardDAV, затем снова удалён в f86cfa20a.
5167dab99Крупное изменение API. (1) Prop.RESOURCETYPEProp(PropType.RESOURCETYPE): Prop стал конструкторным. (2) Отображаемое имя изменено с i18n-ключа "address.cardDAV..." на фактическое имя пользователя "kai". (3) <card:addressbook/> временно удалён.
6c1daac93Введён WriterContext. Сигнатура generatePropFindResponse() изменена с (request, user, props) на один объект контекста. Добавлен мок HttpServletResponse. Более чистая расширяемость.
0d7a81f91Добавлено пространство имён xmlns:me. Изменён порядок элементов: <collection/> перед <addressbook/>. Требуемый DAV элемент теперь идёт первым.
b14376470cr:addressbookcard:addressbook. Префикс пространства имён стандартизирован с неясного cr на общепринятый card.
744d238deИсправление URI пространства имён. Префикс xmlns crcard, исправлена строка URI пространства имён CardDAV.
c4062ed97Добавлены префиксы пространств имён XML. Голые элементы (<multistatus>) → с квалификацией пространства имён (<d:multistatus>). Согласовано с выводом обработчика после того, как он начал генерировать квалифицированный XML.
40e554cbeИзменён тестовый URI с общего /carddav на пользовательский /carddav/users/kai/. Согласовано с фактической структурой URL для каждого пользователя.
2ad0cfe66Первоначальное создание. Базовый тест PROPFIND с встроенными XML-литералами, моками HTTP Mockito. Проверены свойства RESOURCETYPE + DISPLAYNAME.