//! Attendee search and the system address book's cards.
use pimdav::calcard::vcard::VCard;
use pimdav::principal::{Principal, UserType, card};
use pimdav::report::{Report, parse};
use pimdav::xml::{DAV, Name, Propfind};
fn search(body: &str) -> pimdav::principal::Search {
match parse(body.as_bytes()).unwrap() {
Report::PrincipalSearch(s) => s,
other => panic!("{other:?}"),
}
}
#[test]
fn property_search_and_calendarserver_search() {
let addresses = ["mailto:board@rooms.dovenest.invalid".to_string()];
let room = Principal {
name: "board",
display: "Board Room",
addresses: &addresses,
kind: UserType::Room,
};
let alice_addresses = ["mailto:alice@dovenest.invalid".to_string()];
let alice = Principal {
name: "alice",
display: "Alice",
addresses: &alice_addresses,
kind: UserType::Individual,
};
let s = search(
r#"
ROOM
room
"#,
);
assert!(s.matches(&room));
assert!(!s.matches(&alice));
assert_eq!(s.find, Propfind::Prop(vec![Name::new(DAV, "displayname")]));
let s = search(
r#"
alice@
"#,
);
assert!(s.matches(&alice));
assert!(!s.matches(&room));
let s = search(
r#"
boro
5
"#,
);
assert!(s.matches(&room));
assert!(!s.matches(&alice));
assert_eq!(s.limit, Some(5));
}
#[test]
fn directory_card_escapes_text() {
let p = Principal {
name: "ops",
display: "Ops; Night, Shift",
addresses: &[],
kind: UserType::Resource,
};
let text = card("urn:uuid:1", &p, "ops@resources.dovenest.invalid");
assert!(text.contains(r"FN:Ops\; Night\, Shift"), "{text}");
assert!(text.contains("KIND:device\r\n"));
assert!(VCard::parse(&text).is_ok());
}
#[test]
fn list_all_and_stray_properties() {
// What python-caldav sends: no property-search, properties beside an
// empty ``.
let s = search(
r#"
"#,
);
let p = Principal {
name: "x",
display: "X",
addresses: &[],
kind: UserType::Individual,
};
assert!(s.matches(&p));
assert_eq!(
s.find,
Propfind::Prop(vec![
Name::new(pimdav::xml::CALDAV, "calendar-home-set"),
Name::new(DAV, "displayname")
])
);
}