use aimux_core::AiMuxError;
use aimux_provider_utils::load_api_key;
use serial_test::serial;
const ENV_VAR: &str = "AIMUX_TEST_LOAD_API_KEY_VAR";
fn set_env(value: &str) {
unsafe { std::env::set_var(ENV_VAR, value) }
}
fn remove_env() {
unsafe { std::env::remove_var(ENV_VAR) }
}
fn cleanup() {
remove_env();
}
#[test]
#[serial]
fn returns_api_key_when_provided() {
cleanup();
let key = load_api_key(Some("explicit-key"), ENV_VAR, "Test").unwrap();
assert_eq!(key, "explicit-key");
}
#[test]
#[serial]
fn reads_api_key_from_environment_variable() {
cleanup();
set_env("env-key");
let key = load_api_key(None, ENV_VAR, "Test").unwrap();
assert_eq!(key, "env-key");
cleanup();
}
#[test]
#[serial]
fn returns_invalid_argument_when_neither_provided() {
cleanup();
remove_env();
let err = load_api_key(None, ENV_VAR, "Test API key").unwrap_err();
assert!(matches!(err, AiMuxError::InvalidArgument(_)));
}
#[test]
#[serial]
fn error_message_mentions_description_and_env_var() {
cleanup();
remove_env();
let err = load_api_key(None, ENV_VAR, "Test API key").unwrap_err();
let msg = match err {
AiMuxError::InvalidArgument(m) => m,
other => panic!("expected InvalidArgument error, got {other:?}"),
};
assert!(
msg.contains("Test API key"),
"message should mention description: {msg}"
);
assert!(
msg.contains(ENV_VAR),
"message should mention env var: {msg}"
);
}
#[test]
#[serial]
fn empty_string_api_key_falls_back_to_env_var() {
cleanup();
set_env("env-key");
let key = load_api_key(Some(""), ENV_VAR, "Test").unwrap();
assert_eq!(key, "env-key");
cleanup();
}
#[test]
#[serial]
fn empty_string_api_key_errors_when_env_var_also_unset() {
cleanup();
remove_env();
let err = load_api_key(Some(""), ENV_VAR, "Test").unwrap_err();
assert!(matches!(err, AiMuxError::InvalidArgument(_)));
}
#[test]
#[serial]
fn explicit_api_key_takes_precedence_over_env_var() {
cleanup();
set_env("env-key");
let key = load_api_key(Some("explicit-key"), ENV_VAR, "Test").unwrap();
assert_eq!(key, "explicit-key");
cleanup();
}
#[test]
#[serial]
fn whitespace_only_api_key_falls_back_to_env_var() {
cleanup();
set_env("env-key");
let key = load_api_key(Some(" "), ENV_VAR, "Test").unwrap();
assert_eq!(key, " ");
cleanup();
}