diff --git a/Cargo.lock b/Cargo.lock index a65c1b4..3be0338 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3374,6 +3374,7 @@ dependencies = [ "insta", "percent-encoding", "quick-xml", + "rstest", "rustical_dav", "rustical_dav_push", "rustical_ical", diff --git a/crates/carddav/Cargo.toml b/crates/carddav/Cargo.toml index 8359a12..e081e1f 100644 --- a/crates/carddav/Cargo.toml +++ b/crates/carddav/Cargo.toml @@ -35,6 +35,7 @@ percent-encoding.workspace = true ical.workspace = true strum.workspace = true strum_macros.workspace = true +rstest.workspace = true [dev-dependencies] insta.workspace = true diff --git a/crates/carddav/src/addressbook/methods/report/addressbook_query/mod.rs b/crates/carddav/src/addressbook/methods/report/addressbook_query/mod.rs index 6e15800..1e463fe 100644 --- a/crates/carddav/src/addressbook/methods/report/addressbook_query/mod.rs +++ b/crates/carddav/src/addressbook/methods/report/addressbook_query/mod.rs @@ -7,6 +7,9 @@ pub use prop_filter::{PropFilterElement, PropFilterable}; use rustical_ical::AddressObject; use rustical_store::AddressbookStore; +#[cfg(test)] +mod tests; + pub async fn get_objects_addressbook_query( addr_query: &AddressbookQueryRequest, principal: &str, diff --git a/crates/carddav/src/addressbook/methods/report/addressbook_query/tests.rs b/crates/carddav/src/addressbook/methods/report/addressbook_query/tests.rs new file mode 100644 index 0000000..5c84224 --- /dev/null +++ b/crates/carddav/src/addressbook/methods/report/addressbook_query/tests.rs @@ -0,0 +1,70 @@ +use super::FilterElement; +use rstest::rstest; +use rustical_ical::AddressObject; +use rustical_xml::XmlDocument; + +const VCF_1: &str = r"BEGIN:VCARD +VERSION:4.0 +FN:Simon Perreault +N:Perreault;Simon;;;ing. jr,M.Sc. +BDAY:--0203 +GENDER:M +EMAIL;TYPE=work:simon.perreault@viagenie.ca +END:VCARD"; + +const VCF_2: &str = r"BEGIN:VCARD +VERSION:4.0 +N:Gump;Forrest;;Mr.; +FN:Forrest Gump +ORG:Bubba Gump Shrimp Co. +TITLE:Shrimp Man +PHOTO;MEDIATYPE=image/gif:http://www.example.com/dir_photos/my_photo.gif +TEL;TYPE=work,voice;VALUE=uri:tel:+1-111-555-1212 +TEL;TYPE=home,voice;VALUE=uri:tel:+1-404-555-1212 +ADR;TYPE=WORK;PREF=1;LABEL=100 Waters Edge\\nBaytown\\, LA 30314\\nUnited S + tates of America:;;100 Waters Edge;Baytown;LA;30314;United States of Ameri + ca +ADR;TYPE=HOME;LABEL=42 Plantation St.\\nBaytown\\, LA 30314\\nUnited States + of America:;;42 Plantation St.;Baytown;LA;30314;United States of America +EMAIL:forrestgump@example.com +REV:20080424T195243Z +x-qq:21588891 +UID:890a9da4-bb6d-4afb-9f32-b5eff6494a53 +END:VCARD +"; + +const FILTER_1: &str = r#" + + + + simon.perreault@viagenie.ca + + WORK + + + +"#; + +const FILTER_2: &str = r#" + + + + forrestgump@example.com + + WORK + + + +"#; + +#[rstest] +#[case(VCF_1, FILTER_1, true)] +#[case(VCF_2, FILTER_1, false)] +#[case(VCF_1, FILTER_2, true)] +#[case(VCF_2, FILTER_2, true)] +fn test_filter(#[case] vcf: &str, #[case] filter: &str, #[case] matches: bool) { + dbg!(vcf); + let obj = AddressObject::from_vcf(String::new(), vcf.to_owned()).unwrap(); + let filter = FilterElement::parse_str(filter).unwrap(); + assert_eq!(matches, filter.matches(&obj)); +}