diff options
Diffstat (limited to 'tests/file_json.rs')
-rw-r--r-- | tests/file_json.rs | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/tests/file_json.rs b/tests/file_json.rs index e660997..91cbc9b 100644 --- a/tests/file_json.rs +++ b/tests/file_json.rs @@ -111,3 +111,108 @@ fn test_json_vec() { assert_eq!(vi.next().unwrap().into_string().unwrap(), "example_dir2"); assert!(vi.next().is_none()); } + +#[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::Json)) + .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`") { + println!("triggered error {:?}", e); + 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::Json)) + .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::Json)) + .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::Json)) + .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()) + ); +} |