test calendar-multiget

This commit is contained in:
Quentin 2024-05-23 09:24:06 +02:00
parent a859fe38b1
commit 7687065bfc
Signed by: quentin
GPG key ID: E9602264D639FF68

View file

@ -581,16 +581,60 @@ fn rfc4791_webdav_caldav() {
.header("If-None-Match", "*") .header("If-None-Match", "*")
.body(ICAL_RFC4) .body(ICAL_RFC4)
.send()?; .send()?;
let obj4_etag = resp.headers().get("etag").expect("etag must be set"); let _obj4_etag = resp.headers().get("etag").expect("etag must be set");
assert_eq!(resp.status(), 201); assert_eq!(resp.status(), 201);
let resp = http let resp = http
.put("http://localhost:8087/alice/calendar/Personal/rfc5.ics") .put("http://localhost:8087/alice/calendar/Personal/rfc5.ics")
.header("If-None-Match", "*") .header("If-None-Match", "*")
.body(ICAL_RFC5) .body(ICAL_RFC5)
.send()?; .send()?;
let obj5_etag = resp.headers().get("etag").expect("etag must be set"); let _obj5_etag = resp.headers().get("etag").expect("etag must be set");
assert_eq!(resp.status(), 201); assert_eq!(resp.status(), 201);
// A generic function to check a <calendar-data/> query result
let check_full_cal =
|multistatus: &dav::Multistatus<All>,
(ref_path, ref_etag, ref_ical): (&str, &str, &[u8])| {
let obj_stats = multistatus
.responses
.iter()
.find_map(|v| match &v.status_or_propstat {
dav::StatusOrPropstat::PropStat(dav::Href(p), x)
if p.as_str() == ref_path =>
{
Some(x)
}
_ => None,
})
.expect("propstats must exist");
let obj_success = obj_stats
.iter()
.find(|p| p.status.0.as_u16() == 200)
.expect("some propstats must be 200");
let etag = obj_success
.prop
.0
.iter()
.find_map(|p| match p {
dav::AnyProperty::Value(dav::Property::GetEtag(x)) => Some(x),
_ => None,
})
.expect("etag is return in propstats");
assert_eq!(etag.as_str(), ref_etag);
let calendar_data = obj_success
.prop
.0
.iter()
.find_map(|p| match p {
dav::AnyProperty::Value(dav::Property::Extension(
realization::Property::Cal(cal::Property::CalendarData(x)),
)) => Some(x),
_ => None,
})
.expect("calendar data is returned in propstats");
assert_eq!(calendar_data.payload.as_bytes(), ref_ical);
};
// --- AUTODISCOVERY --- // --- AUTODISCOVERY ---
// Check calendar discovery from principal // Check calendar discovery from principal
let propfind_req = r#"<?xml version="1.0" encoding="utf-8" ?> let propfind_req = r#"<?xml version="1.0" encoding="utf-8" ?>
@ -635,7 +679,7 @@ fn rfc4791_webdav_caldav() {
assert_eq!(calendar_home_set, "/alice/calendar/"); assert_eq!(calendar_home_set, "/alice/calendar/");
// Check calendar access support // Check calendar access support
let resp = http let _resp = http
.request( .request(
reqwest::Method::from_bytes(b"OPTIONS")?, reqwest::Method::from_bytes(b"OPTIONS")?,
"http://localhost:8087/alice/calendar/", "http://localhost:8087/alice/calendar/",
@ -643,10 +687,8 @@ fn rfc4791_webdav_caldav() {
.send()?; .send()?;
//@FIXME not yet supported. returns DAV: 1 ; expects DAV: 1 calendar-access //@FIXME not yet supported. returns DAV: 1 ; expects DAV: 1 calendar-access
//@FIXME missing support for calendar-data...
//println!("{:?}", resp);
// --- REPORT calendar-query --- // --- REPORT calendar-query ---
//@FIXME missing support for calendar-data...
// 7.8.8. Example: Retrieval of Events Only // 7.8.8. Example: Retrieval of Events Only
let cal_query = r#"<?xml version="1.0" encoding="utf-8" ?> let cal_query = r#"<?xml version="1.0" encoding="utf-8" ?>
<C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav"> <C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
@ -678,47 +720,50 @@ fn rfc4791_webdav_caldav() {
] ]
.iter() .iter()
.for_each(|(ref_path, ref_etag, ref_ical)| { .for_each(|(ref_path, ref_etag, ref_ical)| {
let obj_stats = multistatus check_full_cal(
.responses &multistatus,
.iter() (
.find_map(|v| match &v.status_or_propstat { ref_path,
dav::StatusOrPropstat::PropStat(dav::Href(p), x) if p.as_str() == *ref_path => { ref_etag.to_str().expect("etag header convertible to str"),
Some(x) ref_ical,
} ),
_ => None, )
}) });
.expect("propstats must exist");
let obj_success = obj_stats // --- REPORT calendar-multiget ---
.iter() let cal_query = r#"<?xml version="1.0" encoding="utf-8" ?>
.find(|p| p.status.0.as_u16() == 200) <C:calendar-multiget xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
.expect("some propstats must be 200"); <D:prop>
let etag = obj_success <D:getetag/>
.prop <C:calendar-data/>
.0 </D:prop>
.iter() <D:href>/alice/calendar/Personal/rfc1.ics</D:href>
.find_map(|p| match p { <D:href>/alice/calendar/Personal/rfc3.ics</D:href>
dav::AnyProperty::Value(dav::Property::GetEtag(x)) => Some(x), </C:calendar-multiget>"#;
_ => None, let resp = http
}) .request(
.expect("etag is return in propstats"); reqwest::Method::from_bytes(b"REPORT")?,
assert_eq!( "http://localhost:8087/alice/calendar/Personal/",
etag.as_str(), )
ref_etag .body(cal_query)
.to_str() .send()?;
.expect("header value is convertible to string") assert_eq!(resp.status(), 207);
); let multistatus = dav_deserialize::<dav::Multistatus<All>>(&resp.text()?);
let calendar_data = obj_success assert_eq!(multistatus.responses.len(), 2);
.prop [
.0 ("/alice/calendar/Personal/rfc1.ics", obj1_etag, ICAL_RFC1),
.iter() ("/alice/calendar/Personal/rfc3.ics", obj3_etag, ICAL_RFC3),
.find_map(|p| match p { ]
dav::AnyProperty::Value(dav::Property::Extension( .iter()
realization::Property::Cal(cal::Property::CalendarData(x)), .for_each(|(ref_path, ref_etag, ref_ical)| {
)) => Some(x), check_full_cal(
_ => None, &multistatus,
}) (
.expect("calendar data is returned in propstats"); ref_path,
assert_eq!(calendar_data.payload.as_bytes(), *ref_ical); ref_etag.to_str().expect("etag header convertible to str"),
ref_ical,
),
)
}); });
Ok(()) Ok(())