use umbral::Settings;
use umbral_security::{SecurityConfig, test_support::validate_secret_key};
fn settings(json: serde_json::Value) -> Settings {
serde_json::from_value(json).expect("Settings deserialization failed")
}
fn csrf_signed_config() -> SecurityConfig {
SecurityConfig {
csrf: true,
signed_csrf: true,
..Default::default()
}
}
#[test]
fn empty_secret_key_prod_returns_err() {
let s = settings(serde_json::json!({
"secret_key": "",
"environment": "Prod"
}));
let result = validate_secret_key(&s, &csrf_signed_config());
assert!(
result.is_err(),
"expected Err for empty secret_key in Prod, got Ok"
);
let msg = result.unwrap_err().to_string();
assert!(
msg.contains("SECRET_KEY"),
"error message should mention SECRET_KEY, got: {msg}"
);
}
#[test]
fn whitespace_only_secret_key_prod_returns_err() {
let s = settings(serde_json::json!({
"secret_key": " ",
"environment": "Prod"
}));
let result = validate_secret_key(&s, &csrf_signed_config());
assert!(
result.is_err(),
"expected Err for whitespace-only secret_key in Prod, got Ok"
);
}
#[test]
fn empty_secret_key_dev_returns_ok() {
let s = settings(serde_json::json!({
"secret_key": "",
"environment": "Dev"
}));
let result = validate_secret_key(&s, &csrf_signed_config());
assert!(
result.is_ok(),
"expected Ok for empty secret_key in Dev, got: {:?}",
result.unwrap_err()
);
}
#[test]
fn empty_secret_key_test_env_returns_ok() {
let s = settings(serde_json::json!({
"secret_key": "",
"environment": "Test"
}));
let result = validate_secret_key(&s, &csrf_signed_config());
assert!(
result.is_ok(),
"expected Ok for empty secret_key in Test environment, got: {:?}",
result.unwrap_err()
);
}
#[test]
fn non_empty_secret_key_prod_returns_ok() {
let s = settings(serde_json::json!({
"secret_key": "a-real-secret-key-that-is-long-enough",
"environment": "Prod"
}));
let result = validate_secret_key(&s, &csrf_signed_config());
assert!(
result.is_ok(),
"expected Ok for non-empty secret_key in Prod, got: {:?}",
result.unwrap_err()
);
}
#[test]
fn non_empty_secret_key_dev_returns_ok() {
let s = settings(serde_json::json!({
"secret_key": "dev-secret",
"environment": "Dev"
}));
let result = validate_secret_key(&s, &csrf_signed_config());
assert!(result.is_ok());
}
#[test]
fn csrf_disabled_empty_secret_prod_returns_ok() {
let s = settings(serde_json::json!({
"secret_key": "",
"environment": "Prod"
}));
let config = SecurityConfig {
csrf: false,
signed_csrf: true,
..Default::default()
};
let result = validate_secret_key(&s, &config);
assert!(
result.is_ok(),
"expected Ok when csrf=false even with empty secret, got: {:?}",
result.unwrap_err()
);
}
#[test]
fn signed_csrf_disabled_empty_secret_prod_returns_ok() {
let s = settings(serde_json::json!({
"secret_key": "",
"environment": "Prod"
}));
let config = SecurityConfig {
csrf: true,
signed_csrf: false,
..Default::default()
};
let result = validate_secret_key(&s, &config);
assert!(
result.is_ok(),
"expected Ok when signed_csrf=false even with empty secret, got: {:?}",
result.unwrap_err()
);
}