From 3630ef2de00dfcdf2d7464df5ad3d1da39ffce6f Mon Sep 17 00:00:00 2001 From: Charlie Date: Mon, 5 Jun 2023 10:33:44 -0500 Subject: [PATCH] update for PR feedback --- components/support/nimbus-fml/src/error.rs | 2 +- components/support/nimbus-fml/src/fml.udl | 2 +- .../src/intermediate_representation.rs | 48 +++++++++++++++++++ components/support/nimbus-fml/src/parser.rs | 2 +- 4 files changed, 51 insertions(+), 3 deletions(-) diff --git a/components/support/nimbus-fml/src/error.rs b/components/support/nimbus-fml/src/error.rs index c951735886..5feb656c42 100644 --- a/components/support/nimbus-fml/src/error.rs +++ b/components/support/nimbus-fml/src/error.rs @@ -49,7 +49,7 @@ pub enum FMLError { #[error("Feature `{0}` not found on manifest")] InvalidFeatureError(String), #[error("Property `{0}` not found on feature `{1}`")] - InvalidPropError(String, String), + InvalidPropertyError(String, String), } #[cfg(feature = "client-lib")] diff --git a/components/support/nimbus-fml/src/fml.udl b/components/support/nimbus-fml/src/fml.udl index 9679c810dc..e151008fbe 100644 --- a/components/support/nimbus-fml/src/fml.udl +++ b/components/support/nimbus-fml/src/fml.udl @@ -5,7 +5,7 @@ enum FMLError { "IOError", "JSONError", "YAMLError", "UrlError", "FetchError", "InvalidPath", "TemplateProblem", "Fatal", "InternalError", "ValidationError", "TypeParsingError", "InvalidChannelError", "FMLModuleError", "CliError", "ClientError", "InvalidFeatureError", - "InvalidPropError" + "InvalidPropertyError" }; dictionary MergedJsonWithErrors { diff --git a/components/support/nimbus-fml/src/intermediate_representation.rs b/components/support/nimbus-fml/src/intermediate_representation.rs index 2febb2ce4c..d187262844 100644 --- a/components/support/nimbus-fml/src/intermediate_representation.rs +++ b/components/support/nimbus-fml/src/intermediate_representation.rs @@ -1978,4 +1978,52 @@ pub mod unit_tests { Ok(()) } + + #[test] + fn test_validate_feature_config_errors_on_invalid_object_prop() -> Result<()> { + let obj_defs = vec![ObjectDef { + name: "SampleObj".into(), + props: vec![PropDef { + name: "string".into(), + typ: TypeRef::String, + doc: "".into(), + default: json!("a string"), + }], + ..Default::default() + }]; + let fm = get_feature_manifest( + obj_defs, + vec![], + vec![FeatureDef { + name: "feature".into(), + props: vec![PropDef { + name: "prop_1".into(), + typ: TypeRef::Object("SampleObj".into()), + default: json!({ + "string": "a value" + }), + doc: "".into(), + }], + ..Default::default() + }], + HashMap::new(), + ); + + let result = fm.validate_feature_config( + "feature", + json!({ + "prop_1": { + "invalid-prop": "invalid-prop value" + } + }), + ); + + assert!(result.is_err()); + assert_eq!( + result.err().unwrap().to_string(), + "Validation Error at features/feature.prop_1#SampleObj: Default includes key invalid-prop that doesn't exist in SampleObj's object definition" + ); + + Ok(()) + } } diff --git a/components/support/nimbus-fml/src/parser.rs b/components/support/nimbus-fml/src/parser.rs index 9fdf10a76b..9eda192eaf 100644 --- a/components/support/nimbus-fml/src/parser.rs +++ b/components/support/nimbus-fml/src/parser.rs @@ -569,7 +569,7 @@ impl<'object> DefaultsMerger<'object> { res.default = v.clone(); Ok(res) } else { - Err(FMLError::InvalidPropError(k.clone(), res.name.clone())) + Err(FMLError::InvalidPropertyError(k.clone(), res.name.clone())) } }) .collect::>>()?;