138
crates/config/tests/loader/layering_test.rs
Normal file
138
crates/config/tests/loader/layering_test.rs
Normal file
@@ -0,0 +1,138 @@
|
||||
use figment::Jail;
|
||||
|
||||
use config::{MediaBackend, load};
|
||||
|
||||
const CONFIG_FILE: &str = "config.toml";
|
||||
|
||||
#[test]
|
||||
fn with_no_file_and_no_environment_every_default_stands() {
|
||||
Jail::expect_with(|_jail| {
|
||||
let loaded = load().unwrap();
|
||||
|
||||
assert_eq!(loaded.server.port, 3000);
|
||||
assert_eq!(loaded.server.host, "0.0.0.0");
|
||||
assert_eq!(loaded.storage.data_dir, "./data");
|
||||
assert!(loaded.auth.jwt_secret.is_none());
|
||||
Ok(())
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn a_file_overrides_the_defaults_it_names() {
|
||||
Jail::expect_with(|jail| {
|
||||
jail.create_file(CONFIG_FILE, "[server]\nport = 4321\n")?;
|
||||
|
||||
let loaded = load().unwrap();
|
||||
|
||||
assert_eq!(loaded.server.port, 4321);
|
||||
assert_eq!(loaded.server.host, "0.0.0.0");
|
||||
Ok(())
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn the_environment_overrides_the_file() {
|
||||
Jail::expect_with(|jail| {
|
||||
jail.create_file(CONFIG_FILE, "[server]\nport = 4321\nhost = \"127.0.0.1\"\n")?;
|
||||
jail.set_env("KMOOD_SERVER__PORT", "8080");
|
||||
|
||||
let loaded = load().unwrap();
|
||||
|
||||
assert_eq!(loaded.server.port, 8080);
|
||||
assert_eq!(loaded.server.host, "127.0.0.1");
|
||||
Ok(())
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn a_double_underscore_descends_a_section() {
|
||||
Jail::expect_with(|jail| {
|
||||
jail.set_env("KMOOD_SERVER__CORS__ALLOW_ANY_ORIGIN", "false");
|
||||
|
||||
let loaded = load().unwrap();
|
||||
|
||||
assert!(!loaded.server.cors.allow_any_origin);
|
||||
Ok(())
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn a_single_underscore_stays_inside_a_field_name() {
|
||||
Jail::expect_with(|jail| {
|
||||
jail.set_env("KMOOD_STORAGE__DATA_DIR", "/var/lib/kmood");
|
||||
jail.set_env("KMOOD_AUTH__JWT_SECRET", "from-the-environment");
|
||||
|
||||
let loaded = load().unwrap();
|
||||
|
||||
assert_eq!(loaded.storage.data_dir, "/var/lib/kmood");
|
||||
assert_eq!(
|
||||
loaded.auth.jwt_secret.as_deref(),
|
||||
Some("from-the-environment")
|
||||
);
|
||||
Ok(())
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn the_environment_can_switch_the_media_backend() {
|
||||
Jail::expect_with(|jail| {
|
||||
jail.set_env("KMOOD_STORAGE__MEDIA__BACKEND", "s3");
|
||||
jail.set_env("KMOOD_STORAGE__MEDIA__BUCKET", "moods");
|
||||
jail.set_env("KMOOD_STORAGE__MEDIA__REGION", "eu-central-1");
|
||||
|
||||
let loaded = load().unwrap();
|
||||
|
||||
match loaded.storage.media {
|
||||
MediaBackend::S3 { bucket, region, .. } => {
|
||||
assert_eq!(bucket, "moods");
|
||||
assert_eq!(region, "eu-central-1");
|
||||
}
|
||||
other => panic!("expected the s3 backend, got {other:?}"),
|
||||
}
|
||||
Ok(())
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn an_unrelated_variable_leaves_the_configuration_alone() {
|
||||
Jail::expect_with(|jail| {
|
||||
jail.set_env("PORT", "9999");
|
||||
jail.set_env("SERVER__PORT", "9999");
|
||||
|
||||
let loaded = load().unwrap();
|
||||
|
||||
assert_eq!(loaded.server.port, 3000);
|
||||
Ok(())
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn a_list_arrives_as_an_array() {
|
||||
Jail::expect_with(|jail| {
|
||||
jail.set_env(
|
||||
"KMOOD_SERVER__CORS__ALLOWED_ORIGINS",
|
||||
r#"["https://a.example","https://b.example"]"#,
|
||||
);
|
||||
|
||||
let loaded = load().unwrap();
|
||||
|
||||
assert_eq!(
|
||||
loaded.server.cors.allowed_origins,
|
||||
vec!["https://a.example", "https://b.example"]
|
||||
);
|
||||
Ok(())
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn the_file_to_read_can_be_named_by_the_environment() {
|
||||
Jail::expect_with(|jail| {
|
||||
jail.create_file("elsewhere.toml", "[server]\nport = 7777\n")?;
|
||||
jail.set_env("KMOOD_CONFIG_FILE", "elsewhere.toml");
|
||||
|
||||
let loaded = load().unwrap();
|
||||
|
||||
assert_eq!(loaded.server.port, 7777);
|
||||
Ok(())
|
||||
});
|
||||
}
|
||||
47
crates/config/tests/loader/rejection_test.rs
Normal file
47
crates/config/tests/loader/rejection_test.rs
Normal file
@@ -0,0 +1,47 @@
|
||||
use figment::Jail;
|
||||
|
||||
use config::load;
|
||||
|
||||
const CONFIG_FILE: &str = "config.toml";
|
||||
|
||||
#[test]
|
||||
fn a_malformed_file_is_refused_rather_than_ignored() {
|
||||
Jail::expect_with(|jail| {
|
||||
jail.create_file(CONFIG_FILE, "[server\nport = ")?;
|
||||
|
||||
assert!(load().is_err());
|
||||
Ok(())
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn a_value_of_the_wrong_type_is_refused() {
|
||||
Jail::expect_with(|jail| {
|
||||
jail.set_env("KMOOD_SERVER__PORT", "not-a-port");
|
||||
|
||||
assert!(load().is_err());
|
||||
Ok(())
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn a_refusal_names_the_key_at_fault() {
|
||||
Jail::expect_with(|jail| {
|
||||
jail.set_env("KMOOD_SERVER__PORT", "not-a-port");
|
||||
|
||||
let message = load().unwrap_err().to_string().to_lowercase();
|
||||
|
||||
assert!(message.contains("port"), "unhelpful message: {message}");
|
||||
Ok(())
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn a_named_file_that_is_missing_is_refused_rather_than_ignored() {
|
||||
Jail::expect_with(|jail| {
|
||||
jail.set_env("KMOOD_CONFIG_FILE", "nowhere.toml");
|
||||
|
||||
assert!(load().is_err());
|
||||
Ok(())
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user