diff options
Diffstat (limited to 'tests/file_json5.rs')
-rw-r--r-- | tests/file_json5.rs | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/tests/file_json5.rs b/tests/file_json5.rs index a1cb733..bdeb3ea 100644 --- a/tests/file_json5.rs +++ b/tests/file_json5.rs @@ -89,3 +89,107 @@ fn test_error_parse() { ) ); } + +#[derive(Debug, Deserialize, PartialEq)] +enum EnumSettings { + Bar(String), +} + +#[derive(Debug, Deserialize, PartialEq)] +struct StructSettings { + foo: String, + bar: String, +} +#[derive(Debug, Deserialize, PartialEq)] +#[allow(non_snake_case)] +struct CapSettings { + FOO: String, +} + +#[test] +fn test_override_uppercase_value_for_struct() { + std::env::set_var("APP_FOO", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + + let cfg = Config::builder() + .add_source(File::new("tests/Settings", FileFormat::Json5)) + .add_source(config::Environment::with_prefix("APP").separator("_")) + .build() + .unwrap(); + + let cap_settings = cfg.clone().try_deserialize::<CapSettings>(); + let lower_settings = cfg.try_deserialize::<StructSettings>().unwrap(); + + match cap_settings { + Ok(v) => { + // this assertion will ensure that the map has only lowercase keys + assert_ne!(v.FOO, "FOO should be overridden"); + assert_eq!( + lower_settings.foo, + "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE".to_string() + ); + } + Err(e) => { + if e.to_string().contains("missing field `FOO`") { + assert_eq!( + lower_settings.foo, + "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE".to_string() + ); + } else { + panic!("{}", e); + } + } + } +} + +#[test] +fn test_override_lowercase_value_for_struct() { + std::env::set_var("config_foo", "I have been overridden_with_lower_case"); + + let cfg = Config::builder() + .add_source(File::new("tests/Settings", FileFormat::Json5)) + .add_source(config::Environment::with_prefix("config").separator("_")) + .build() + .unwrap(); + + let values: StructSettings = cfg.try_deserialize().unwrap(); + assert_eq!( + values.foo, + "I have been overridden_with_lower_case".to_string() + ); + assert_ne!(values.foo, "I am bar".to_string()); +} + +#[test] +fn test_override_uppercase_value_for_enums() { + std::env::set_var("APPS_BAR", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + + let cfg = Config::builder() + .add_source(File::new("tests/Settings-enum-test", FileFormat::Json5)) + .add_source(config::Environment::with_prefix("APPS").separator("_")) + .build() + .unwrap(); + let val: EnumSettings = cfg.try_deserialize().unwrap(); + + assert_eq!( + val, + EnumSettings::Bar("I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE".to_string()) + ); +} + +#[test] +fn test_override_lowercase_value_for_enums() { + std::env::set_var("test_bar", "I have been overridden_with_lower_case"); + + let cfg = Config::builder() + .add_source(File::new("tests/Settings-enum-test", FileFormat::Json5)) + .add_source(config::Environment::with_prefix("test").separator("_")) + .build() + .unwrap(); + + let param: EnumSettings = cfg.try_deserialize().unwrap(); + + assert_eq!( + param, + EnumSettings::Bar("I have been overridden_with_lower_case".to_string()) + ); +} |