aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQuentin Dufour <quentin@deuxfleurs.fr>2024-05-23 09:24:06 +0200
committerQuentin Dufour <quentin@deuxfleurs.fr>2024-05-23 09:24:06 +0200
commit7687065bfc824127fda657363894a30268e95385 (patch)
treee18f255693552d998764b9aa9d8aad7ac1a3638e
parenta859fe38b1044c576f042254a0f9677054b417a0 (diff)
downloadaerogramme-7687065bfc824127fda657363894a30268e95385.tar.gz
aerogramme-7687065bfc824127fda657363894a30268e95385.zip
test calendar-multiget
-rw-r--r--aerogramme/tests/behavior.rs139
1 files changed, 92 insertions, 47 deletions
diff --git a/aerogramme/tests/behavior.rs b/aerogramme/tests/behavior.rs
index 975dae9..a83f1a7 100644
--- a/aerogramme/tests/behavior.rs
+++ b/aerogramme/tests/behavior.rs
@@ -581,16 +581,60 @@ fn rfc4791_webdav_caldav() {
.header("If-None-Match", "*")
.body(ICAL_RFC4)
.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);
let resp = http
.put("http://localhost:8087/alice/calendar/Personal/rfc5.ics")
.header("If-None-Match", "*")
.body(ICAL_RFC5)
.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);
+ // 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 ---
// Check calendar discovery from principal
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/");
// Check calendar access support
- let resp = http
+ let _resp = http
.request(
reqwest::Method::from_bytes(b"OPTIONS")?,
"http://localhost:8087/alice/calendar/",
@@ -643,10 +687,8 @@ fn rfc4791_webdav_caldav() {
.send()?;
//@FIXME not yet supported. returns DAV: 1 ; expects DAV: 1 calendar-access
- //@FIXME missing support for calendar-data...
- //println!("{:?}", resp);
-
// --- REPORT calendar-query ---
+ //@FIXME missing support for calendar-data...
// 7.8.8. Example: Retrieval of Events Only
let cal_query = r#"<?xml version="1.0" encoding="utf-8" ?>
<C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
@@ -678,47 +720,50 @@ fn rfc4791_webdav_caldav() {
]
.iter()
.for_each(|(ref_path, ref_etag, ref_ical)| {
- 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
- .to_str()
- .expect("header value is convertible to string")
- );
- 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);
+ check_full_cal(
+ &multistatus,
+ (
+ ref_path,
+ ref_etag.to_str().expect("etag header convertible to str"),
+ ref_ical,
+ ),
+ )
+ });
+
+ // --- REPORT calendar-multiget ---
+ let cal_query = r#"<?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-multiget xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <D:getetag/>
+ <C:calendar-data/>
+ </D:prop>
+ <D:href>/alice/calendar/Personal/rfc1.ics</D:href>
+ <D:href>/alice/calendar/Personal/rfc3.ics</D:href>
+ </C:calendar-multiget>"#;
+ let resp = http
+ .request(
+ reqwest::Method::from_bytes(b"REPORT")?,
+ "http://localhost:8087/alice/calendar/Personal/",
+ )
+ .body(cal_query)
+ .send()?;
+ assert_eq!(resp.status(), 207);
+ let multistatus = dav_deserialize::<dav::Multistatus<All>>(&resp.text()?);
+ assert_eq!(multistatus.responses.len(), 2);
+ [
+ ("/alice/calendar/Personal/rfc1.ics", obj1_etag, ICAL_RFC1),
+ ("/alice/calendar/Personal/rfc3.ics", obj3_etag, ICAL_RFC3),
+ ]
+ .iter()
+ .for_each(|(ref_path, ref_etag, ref_ical)| {
+ check_full_cal(
+ &multistatus,
+ (
+ ref_path,
+ ref_etag.to_str().expect("etag header convertible to str"),
+ ref_ical,
+ ),
+ )
});
Ok(())