From bdd2f854c806c46ba6e63dc8c8c5fd340f008334 Mon Sep 17 00:00:00 2001 From: supermaxiste Date: Fri, 19 Jul 2024 11:10:16 +0200 Subject: [PATCH] test(rules): rstest framework (#39) --- Cargo.lock | 92 ++++++++++---------- Cargo.toml | 2 +- src/rules.rs | 233 +++++++++++++++------------------------------------ 3 files changed, 115 insertions(+), 212 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 51dca00..b6874eb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -80,15 +80,15 @@ checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "blake3" -version = "1.5.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" +checksum = "e9ec96fe9a81b5e365f9db71fe00edc4fe4ca2cc7dcb7861f0603012a7caa210" dependencies = [ "arrayref", "arrayvec", @@ -99,9 +99,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.101" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac367972e516d45567c7eafc73d24e1c193dcf200a8d94e9db7b3d38b349572d" +checksum = "324c74f2155653c90b04f25b2a47a8a631360cb908f92a772695f430c7e31052" [[package]] name = "cfg-if" @@ -111,9 +111,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.5.7" +version = "4.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5db83dced34638ad474f39f250d7fea9598bdd239eaced1bdf45d597da0f433f" +checksum = "64acc1846d54c1fe936a78dc189c34e28d3f5afc348403f28ecf53660b9b8462" dependencies = [ "clap_builder", "clap_derive", @@ -121,9 +121,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.7" +version = "4.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7e204572485eb3fbf28f871612191521df159bc3e15a9f5064c66dba3a8c05f" +checksum = "6fb8393d67ba2e7bfaf28a23458e4e2b543cc73a99595511eb207fdb8aede942" dependencies = [ "anstream", "anstyle", @@ -133,9 +133,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.5" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c780290ccf4fb26629baa7a1081e68ced113f1d3ec302fa5948f1c381ebf06c6" +checksum = "2bac35c6dafb060fd4d275d9a4ffae97917c13a6327903a8be2153cd964f7085" dependencies = [ "heck", "proc-macro2", @@ -441,9 +441,9 @@ checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "log" -version = "0.4.21" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "memchr" @@ -507,9 +507,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.85" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] @@ -658,18 +658,18 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.203" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.203" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" dependencies = [ "proc-macro2", "quote", @@ -678,9 +678,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.117" +version = "1.0.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" +checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" dependencies = [ "itoa", "ryu", @@ -752,9 +752,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" -version = "2.0.66" +version = "2.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" +checksum = "b146dcf730474b4bcd16c311627b31ede9ab149045db4d6088b3becaea046462" dependencies = [ "proc-macro2", "quote", @@ -792,18 +792,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.61" +version = "1.0.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +checksum = "f2675633b1499176c2dff06b0856a27976a8f9d436737b4cf4f312d4d91d8bbb" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.61" +version = "1.0.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +checksum = "d20468752b09f49e909e55a5d338caa8bedf615594e9d80bc4c565d30faf798c" dependencies = [ "proc-macro2", "quote", @@ -938,9 +938,9 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -954,51 +954,51 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" diff --git a/Cargo.toml b/Cargo.toml index 9e0e6cf..e26b032 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ io-enum = '1.1.3' rio_api = '0.8.4' rio_turtle = '0.8.4' - rstest = '0.21.0' + rstest = "0.21.0" serde_yml = '0.0.10' slog = '2.7.0' slog-async = '2.8.0' diff --git a/src/rules.rs b/src/rules.rs index 0cf55e7..a3ffdca 100644 --- a/src/rules.rs +++ b/src/rules.rs @@ -111,6 +111,7 @@ pub fn match_subject_predicate_rule( #[cfg(test)] mod tests { use super::*; + use rstest::rstest; fn set_type_rule(t: &str) -> Rules { let mut rules = Rules::default(); @@ -146,193 +147,95 @@ mod tests { return rules; } - #[test] - // Test the type rule for a subject that is in the rules & type map - fn is_subject_set() { - let subject = Subject::NamedNode(NamedNode { - iri: "http://example.org/Alice".to_string(), - }); - let rules = set_type_rule("Person"); - let mut type_map = HashMap::new(); - type_map.insert("http://example.org/Alice".to_string(), "Person".to_string()); - let mut mask = TripleMask::default(); - mask = match_type_rule_subject(&subject, mask, &type_map, &rules); - assert!(mask.is_set(&TripleMask::SUBJECT)); - assert!(!mask.is_set(&TripleMask::OBJECT)); - } - #[test] - // Test the type rule for a subject that is not in the rules but in the type map - fn subject_not_in_rules() { - let subject = Subject::NamedNode(NamedNode { - iri: "http://example.org/Alice".to_string(), - }); - let rules = set_type_rule("Bank"); - let mut type_map = HashMap::new(); - type_map.insert("http://example.org/Alice".to_string(), "Person".to_string()); - let mut mask = TripleMask::default(); - - mask = match_type_rule_subject(&subject, mask, &type_map, &rules); - - assert!(!mask.is_set(&TripleMask::SUBJECT)); - assert!(!mask.is_set(&TripleMask::OBJECT)); - } - - #[test] - // Test the type rule for a subject neither in the rules nor in the type map - fn subject_not_in_types() { - let subject = Subject::NamedNode(NamedNode { - iri: "http://example.org/Alice".to_string(), - }); - let rules = set_type_rule("Bank"); - let mut type_map = HashMap::new(); - type_map.insert("http://example.org/Bank".to_string(), "Bank".to_string()); - let mut mask = TripleMask::default(); - - mask = match_type_rule_subject(&subject, mask, &type_map, &rules); - - assert!(!mask.is_set(&TripleMask::SUBJECT)); - assert!(!mask.is_set(&TripleMask::OBJECT)); - } - #[test] - // Test the type rule for an object that is in the rules & type map - fn is_object_set() { - let object = Term::NamedNode(NamedNode { - iri: "http://example.org/Alice".to_string(), - }); - let rules = set_type_rule("Person"); - let mut type_map = HashMap::new(); - type_map.insert("http://example.org/Alice".to_string(), "Person".to_string()); + #[rstest] + // Subject is in the rules & type index + #[case(true, "Alice", "Alice", "Person", "Person", true, false)] + // Subject is in the type index, not in the rules + #[case(true, "Alice", "Alice", "Person", "Bank", false, false)] + // Subject is not in the type index + #[case(true, "Alice", "BankName", "Bank", "Bank", false, false)] + // Object is in the rules & type index + #[case(false, "Alice", "Alice", "Person", "Person", false, true)] + fn type_rule( + #[case] is_subject: bool, + #[case] node_iri: &str, + #[case] index_subject: &str, + #[case] index_object: &str, + #[case] rule_type: &str, + #[case] expected_s: bool, + #[case] expected_o: bool, + ) { + let rules = set_type_rule(rule_type); + let mut type_index = HashMap::new(); + type_index.insert(index_subject.to_string(), index_object.to_string()); let mut mask = TripleMask::default(); - - mask = match_type_rule_object(&object, mask, &type_map, &rules); - - assert!(mask.is_set(&TripleMask::OBJECT)); - assert!(!mask.is_set(&TripleMask::SUBJECT)); - } - - #[test] - fn predicate_in_config() { - let predicate = NamedNode { - iri: "http://example.org/hasName".to_string(), + mask = if is_subject { + let node = Subject::NamedNode(NamedNode { + iri: node_iri.to_string(), + }); + match_type_rule_subject(&node, mask, &type_index, &rules) + } else { + let node = Term::NamedNode(NamedNode { + iri: node_iri.to_string(), + }); + match_type_rule_object(&node, mask, &type_index, &rules) }; - let rules = set_predicate_rule("http://example.org/hasName"); - let mut mask = TripleMask::default(); - - mask = match_predicate_rule(&predicate, mask, &rules); - - assert!(mask.is_set(&TripleMask::OBJECT)); - assert!(!mask.is_set(&TripleMask::SUBJECT)); + assert_eq!(mask.is_set(&TripleMask::SUBJECT), expected_s); + assert_eq!(mask.is_set(&TripleMask::OBJECT), expected_o); } - #[test] - fn predicate_not_in_config() { + #[rstest] + // Predicate is in the rules + #[case("hasName", "hasName", true)] + // Predicate is not in the rules + #[case("hasName", "hasAge", false)] + fn predicate_rule(#[case] node_iri: &str, #[case] rule_type: &str, #[case] expected_o: bool) { let predicate = NamedNode { - iri: "http://example.org/hasName".to_string(), + iri: node_iri.to_string(), }; - let rules = set_predicate_rule("http://example.org/hasAge"); + let rules = set_predicate_rule(rule_type); let mut mask = TripleMask::default(); mask = match_predicate_rule(&predicate, mask, &rules); - assert!(!mask.is_set(&TripleMask::OBJECT)); - assert!(!mask.is_set(&TripleMask::SUBJECT)); - } - - #[test] - fn subject_predicate_in_config() { - let alice_iri = "http://example.org/Alice"; - let person_iri = "http://example.org/Person"; - let pred_hn = "http://example.org/hasName"; - - let subject = Subject::NamedNode(NamedNode { - iri: alice_iri.to_string(), - }); - let predicate = NamedNode { - iri: pred_hn.to_string(), - }; - - let rules = - set_subject_predicate_rule("http://example.org/Person", "http://example.org/hasName"); - - let mut mask = TripleMask::default(); - let mut type_map = HashMap::new(); - type_map.insert(alice_iri.to_string(), person_iri.to_string()); - - mask = match_subject_predicate_rule(&subject, &predicate, mask, &type_map, &rules); - - assert!(mask.is_set(&TripleMask::OBJECT)); - assert!(!mask.is_set(&TripleMask::SUBJECT)); - } - - #[test] - fn subject_in_config_predicate_not_() { - let subject = Subject::NamedNode(NamedNode { - iri: "http://example.org/Alice".to_string(), - }); - let predicate = NamedNode { - iri: "http://example.org/hasName".to_string(), - }; - let rules = - set_subject_predicate_rule("http://example.org/Alice", "http://example.org/hasAge"); - let mut mask = TripleMask::default(); - let mut type_map = HashMap::new(); - type_map.insert( - "http://example.org/Alice".to_string(), - "http://example.org/Person".to_string(), - ); - - mask = match_subject_predicate_rule(&subject, &predicate, mask, &type_map, &rules); - - assert!(!mask.is_set(&TripleMask::OBJECT)); assert!(!mask.is_set(&TripleMask::SUBJECT)); - } - - #[test] - fn subject_predicate_not_in_config() { + assert_eq!(mask.is_set(&TripleMask::OBJECT), expected_o); + } + + #[rstest] + // Subject predicate in config + #[case("Alice", "hasName", "Person", "hasName", "Alice", "Person", true)] + // Subject in config, predicate not + #[case("Alice", "hasName", "Person", "hasAge", "Alice", "Person", false)] + // Subject predicate not in config + #[case("Alice", "hasName", "Bob", "hasAge", "Alice", "Person", false)] + // Subject not in type index + #[case("Alice", "hasName", "Bob", "hasAge", "Bob", "Person", false)] + fn subject_predicate_rule( + #[case] subject_iri: &str, + #[case] predicate_iri: &str, + #[case] rule_subject: &str, + #[case] rule_predicate: &str, + #[case] index_subject: &str, + #[case] index_object: &str, + #[case] expected_o: bool, + ) { let subject = Subject::NamedNode(NamedNode { - iri: "http://example.org/Alice".to_string(), + iri: subject_iri.to_string(), }); let predicate = NamedNode { - iri: "http://example.org/hasName".to_string(), + iri: predicate_iri.to_string(), }; - let rules = - set_subject_predicate_rule("http://example.org/Bob", "http://example.org/hasAge"); - let mut mask = TripleMask::default(); - let mut type_map = HashMap::new(); - type_map.insert( - "http://example.org/Alice".to_string(), - "http://example.org/Person".to_string(), - ); - mask = match_subject_predicate_rule(&subject, &predicate, mask, &type_map, &rules); - - assert!(!mask.is_set(&TripleMask::OBJECT)); - assert!(!mask.is_set(&TripleMask::SUBJECT)); - } - - #[test] - // Rule subject predicate where subject is not in type list - fn subject_predicate_not_in_types() { - let subject = Subject::NamedNode(NamedNode { - iri: "http://example.org/Alice".to_string(), - }); - let predicate = NamedNode { - iri: "http://example.org/hasName".to_string(), - }; - let rules = - set_subject_predicate_rule("http://example.org/Bob", "http://example.org/hasAge"); + let rules = set_subject_predicate_rule(rule_subject, rule_predicate); let mut mask = TripleMask::default(); let mut type_map = HashMap::new(); - - type_map.insert( - "http://example.org/Bob".to_string(), - "http://example.org/Person".to_string(), - ); + type_map.insert(index_subject.to_string(), index_object.to_string()); mask = match_subject_predicate_rule(&subject, &predicate, mask, &type_map, &rules); - assert!(!mask.is_set(&TripleMask::OBJECT)); assert!(!mask.is_set(&TripleMask::SUBJECT)); + assert_eq!(mask.is_set(&TripleMask::OBJECT), expected_o); } }