EN · DE · RU · FR · ES

#1866: PropFindRequestHandlerTest.kt

projectforge-carddav/src/test/kotlin/org/projectforge/carddav/PropFindRequestHandlerTest.kt Prueba unitaria — paquete org.projectforge.carddav, projectforge-carddav/src/test/kotlin/org/projectforge/carddav/PropFindRequestHandlerTest.kt 108 líneas · 83 código · 22 comentarios · 3 en blanco
Prueba PropFindRequestHandler.generatePropFindResponse() — el generador central de respuestas PROPFIND de WebDAV. Verifica respuestas XML multistatus correctas para dos escenarios: consultas de tipo de recurso/nombre mostrado y consultas de principal/privilegio. Utiliza mocks de Mockito para objetos servlet HTTP y una entidad PFUserDO real.

Arquitectura

PropFindRequestHandler es el manejador del lado del servidor que responde a solicitudes CardDAV PROPFIND según RFC 4918 (WebDAV). PROPFIND es el mecanismo principal mediante el cual los clientes CardDAV descubren capacidades del servidor, tipos de recursos e información del principal del usuario.

Importaciones

Escenarios de prueba

Escenario 1: RESOURCETYPE + DISPLAYNAME

Cuando un cliente solicita PROPFIND para las propiedades resourcetype y displayname en /carddav/users/kai/, el manejador debe responder con:

La respuesta es un documento XML multistatus completo con declaraciones de espacio de nombres DAV, CardDAV, CalDAV y personalizado.

Escenario 2: CURRENT_USER_PRINCIPAL + PRIVILEGE_SET + PRINCIPAL_URL

Cuando un cliente consulta propiedades de identidad de usuario:

Grafo de dependencias

ClaseRol
PropRepresenta una única propiedad DAV solicitada con un valor enum PropType
PropTypeEnum de propiedades DAV conocidas: RESOURCETYPE, DISPLAYNAME, CURRENT_USER_PRINCIPAL, CURRENT_USER_PRIVILEGE_SET, PRINCIPAL_URL, GETETAG, GETCTAG, SYNCTOKEN
RequestWrapperEnvuelve HttpServletRequest, extrae la URI de solicitud para generar el href de respuesta
WriterContextAgrupa el wrapper de solicitud, respuesta, usuario y propiedades solicitadas — el contexto completo que necesita el manejador
PropFindRequestHandlerMétodo estático generatePropFindResponse(WriterContext): String — función pura que genera la cadena XML

Estrategia de mocking

Declaraciones de espacios de nombres XML

Todas las respuestas incluyen estas declaraciones de espacios de nombres XML:

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

Estos corresponden a: núcleo DAV, CardDAV, extensiones de Apple CalendarServer y un espacio de nombres personalizado.

El manejador es una función pura (produce una cadena XML a partir del contexto) — sin efectos secundarios, sin acceso a base de datos. Este diseño lo hace altamente comprobable y sigue el patrón de núcleo funcional/cáscara imperativa.

Historial Git

CommitQué cambió en este archivo
868d6abb7Año de copyright 2025→2026. Sin cambio de lógica.
63081666fAño de copyright 2024→2025. Sin cambio de lógica.
f86cfa20aEliminado <card:addressbook/> del XML esperado. El tipo de recurso reporta solo <d:collection/> — ya no declara capacidad de libreta de direcciones CardDAV. Limpieza final después de que el elemento addressbook pasara por múltiples ciclos de agregar/eliminar.
139f9f316Agregado <card:addressbook/> al tipo de recurso. Parte del soporte para foto/avatar — el elemento se agregó brevemente para anunciar capacidad CardDAV, luego se eliminó nuevamente en f86cfa20a.
5167dab99Cambio mayor de API. (1) Prop.RESOURCETYPEProp(PropType.RESOURCETYPE): Prop pasó a basarse en constructor. (2) El nombre mostrado cambió de clave i18n "address.cardDAV..." al nombre de usuario real "kai". (3) <card:addressbook/> eliminado temporalmente.
6c1daac93Introducido WriterContext. La firma de generatePropFindResponse() cambió de (request, user, props) a un único objeto de contexto. Se agregó mock de HttpServletResponse. Extensibilidad más limpia.
0d7a81f91Agregado espacio de nombres xmlns:me. Se intercambió el orden de elementos: <collection/> antes que <addressbook/>. El elemento requerido por DAV ahora va primero.
b14376470cr:addressbookcard:addressbook. Prefijo de espacio de nombres estandarizado de cr (poco claro) a card (convencional).
744d238deCorrección de URI de espacio de nombres. Prefijo xmlns crcard, corregida la cadena URI del espacio de nombres CardDAV.
c4062ed97Agregados prefijos de espacio de nombres XML. Elementos simples (<multistatus>) → calificados con espacio de nombres (<d:multistatus>). Coincide con la salida del manejador después de que comenzara a emitir XML calificado.
40e554cbeCambiada URI de prueba de /carddav genérico a /carddav/users/kai/ específico de usuario. Coincide con la estructura real de URL por usuario.
2ad0cfe66Creación inicial. Prueba PROPFIND básica con literales XML en línea, mocks HTTP de Mockito. Verificadas propiedades RESOURCETYPE + DISPLAYNAME.