EN · DE · RU · FR · ES

#1866: PropFindRequestHandlerTest.kt

projectforge-carddav/src/test/kotlin/org/projectforge/carddav/PropFindRequestHandlerTest.kt Unit-Test — Paket org.projectforge.carddav, projectforge-carddav/src/test/kotlin/org/projectforge/carddav/PropFindRequestHandlerTest.kt 108 Zeilen · 83 Code · 22 Kommentare · 3 leer
Testet PropFindRequestHandler.generatePropFindResponse() — den zentralen WebDAV-PROPFIND-Antwortgenerator. Überprüft korrekte XML-multistatus-Antworten für zwei Szenarien: Ressourcentyp/Anzeigename-Abfragen und Principal/Privileg-Abfragen. Verwendet Mockito-Mocks für HTTP-Servlet-Objekte und eine echte PFUserDO-Entität.

Architektur

PropFindRequestHandler ist der serverseitige Handler, der auf CardDAV-PROPFIND-Anfragen gemäß RFC 4918 (WebDAV) antwortet. PROPFIND ist der primäre Mechanismus, mit dem CardDAV-Clients Serverfähigkeiten, Ressourcentypen und Benutzer-Prinzipal-Informationen ermitteln.

Importe

Testszenarien

Szenario 1: RESOURCETYPE + DISPLAYNAME

Wenn ein Client PROPFIND für die Eigenschaften resourcetype und displayname unter /carddav/users/kai/ durchführt, muss der Handler antworten mit:

Die Antwort ist ein vollständiges XML-multistatus-Dokument mit DAV-, CardDAV-, CalDAV- und benutzerdefinierten Namespace-Deklarationen.

Szenario 2: CURRENT_USER_PRINCIPAL + PRIVILEGE_SET + PRINCIPAL_URL

Wenn ein Client Benutzeridentitätseigenschaften abfragt:

Abhängigkeitsgraph

KlasseRolle
PropRepräsentiert eine einzelne angeforderte DAV-Eigenschaft mit einem PropType-Enum-Wert
PropTypeEnum der bekannten DAV-Eigenschaften: RESOURCETYPE, DISPLAYNAME, CURRENT_USER_PRINCIPAL, CURRENT_USER_PRIVILEGE_SET, PRINCIPAL_URL, GETETAG, GETCTAG, SYNCTOKEN
RequestWrapperUmschließt HttpServletRequest, extrahiert die Anfrage-URI zur Generierung der Antwort-Href
WriterContextBündelt Request-Wrapper, Antwort, Benutzer und angeforderte Eigenschaften — den vollständigen Kontext, den der Handler benötigt
PropFindRequestHandlerStatische Methode generatePropFindResponse(WriterContext): String — reine Funktion, die einen XML-String erzeugt

Mocking-Strategie

XML-Namespace-Deklarationen

Alle Antworten enthalten diese XML-Namespace-Deklarationen:

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

Diese entsprechen: DAV-Kern, CardDAV, Apple CalendarServer-Erweiterungen und einem benutzerdefinierten Namespace.

Der Handler ist eine reine Funktion (erzeugt XML-String aus dem Kontext) — keine Seiteneffekte, kein Datenbankzugriff. Dieses Design macht ihn hochgradig testbar und folgt dem Muster funktionaler Kern/imperative Hülle.

Git-Verlauf

CommitWas hat sich in dieser Datei geändert
868d6abb7Copyright-Jahr 2025→2026. Keine Logikänderung.
63081666fCopyright-Jahr 2024→2025. Keine Logikänderung.
f86cfa20a<card:addressbook/> entfernt aus dem erwarteten XML. Der Ressourcentyp meldet nur <d:collection/> — beansprucht keine CardDAV-Adressbuchfähigkeit mehr. Endgültige Bereinigung, nachdem das addressbook-Element mehrere Hinzufügungs-/Entfernungszyklen durchlaufen hatte.
139f9f316<card:addressbook/> hinzugefügt zum Ressourcentyp. Teil der Foto/Avatar-Unterstützung — das Element wurde kurzzeitig hinzugefügt, um CardDAV-Fähigkeit zu bewerben, dann in f86cfa20a wieder entfernt.
5167dab99Große API-Änderung. (1) Prop.RESOURCETYPEProp(PropType.RESOURCETYPE): Prop wurde konstruktorbasiert. (2) Anzeigename geändert von i18n-Schlüssel "address.cardDAV..." zum tatsächlichen Benutzernamen "kai". (3) <card:addressbook/> vorübergehend entfernt.
6c1daac93WriterContext eingeführt. Signatur von generatePropFindResponse() geändert von (request, user, props) zu einem einzelnen Kontextobjekt. HttpServletResponse-Mock hinzugefügt. Sauberere Erweiterbarkeit.
0d7a81f91xmlns:me-Namespace hinzugefügt. Elementreihenfolge getauscht: <collection/> vor <addressbook/>. DAV-erforderliches Element kommt jetzt zuerst.
b14376470cr:addressbookcard:addressbook. Namespace-Präfix von obskurem cr zu konventionellem card standardisiert.
744d238deNamespace-URI-Korrektur. xmlns-Präfix crcard, korrigierte die CardDAV-Namespace-URI-Zeichenfolge.
c4062ed97XML-Namespace-Präfixe hinzugefügt. Bloße Elemente (<multistatus>) → namespace-qualifiziert (<d:multistatus>). Entspricht der Handler-Ausgabe, nachdem dieser qualifiziertes XML ausgab.
40e554cbeTest-URI geändert von generischem /carddav zu benutzerspezifischem /carddav/users/kai/. Entspricht der tatsächlichen Pro-Benutzer-URL-Struktur.
2ad0cfe66Ersterstellung. Grundlegender PROPFIND-Test mit Inline-XML-Literalen, Mockito-HTTP-Mocks. Überprüft RESOURCETYPE + DISPLAYNAME-Eigenschaften.