//! 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.filebrowser.invalid".to_string()]; let room = Principal { name: "board", display: "Board Room", addresses: &addresses, kind: UserType::Room, }; let alice_addresses = ["mailto:alice@filebrowser.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.filebrowser.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") ]) ); }