use super::*; use crate::rules::eval_context::eval_context_tests::BasicQueryTesting; use crate::rules::exprs::AccessQuery; use crate::rules::path_value::*; use crate::rules::EvalContext; use std::convert::TryFrom; use std::rc::Rc; #[test] fn test_count_function() -> crate::rules::Result<()> { let value_str = r#"Resources: {}"#; let value = PathAwareValue::try_from(serde_yaml::from_str::(value_str)?)?; let mut eval = BasicQueryTesting { root: Rc::new(value), recorder: None, }; let query = AccessQuery::try_from(r#"Resources"#)?; let results = eval.query(&query.query)?; match count(&results) { PathAwareValue::Int((_, cnt)) => assert_eq!(cnt, 1), _ => unreachable!(), } let value_str = r#"{}"#; let value = PathAwareValue::try_from(serde_yaml::from_str::(value_str)?)?; let mut eval = BasicQueryTesting { root: Rc::new(value), recorder: None, }; let query = AccessQuery::try_from(r#"Resources"#)?; let results = eval.query(&query.query)?; match count(&results) { PathAwareValue::Int((_, cnt)) => assert_eq!(cnt, 0), _ => unreachable!(), } let value_str = r#" Resources: s3: Type: AWS::S3::Bucket s32: Type: AWS::S3::Bucket "#; let value = PathAwareValue::try_from(serde_yaml::from_str::(value_str)?)?; let mut eval = BasicQueryTesting { root: Rc::new(value), recorder: None, }; let query = AccessQuery::try_from(r#"Resources[ Type == 'AWS::S3::Bucket' ]"#)?; let results = eval.query(&query.query)?; match count(&results) { PathAwareValue::Int((_, cnt)) => assert_eq!(cnt, 2), _ => unreachable!(), } let query = AccessQuery::try_from(r#"Resources[ Type == 'AWS::EC2::Instance' ]"#)?; let results = eval.query(&query.query)?; match count(&results) { PathAwareValue::Int((_, cnt)) => assert_eq!(cnt, 0), _ => unreachable!(), } Ok(()) }