api_testing_core/
auth_env.rs1use crate::cli_util;
2
3pub fn resolve_env_fallback(keys: &[&str]) -> Option<(String, String)> {
4 for &key in keys {
5 let Ok(value) = std::env::var(key) else {
6 continue;
7 };
8 if let Some(token) = cli_util::trim_non_empty(&value) {
9 return Some((token, key.to_string()));
10 }
11 }
12 None
13}
14
15#[cfg(test)]
16mod tests {
17 use super::*;
18 use nils_test_support::{EnvGuard, GlobalStateLock};
19
20 #[test]
21 fn resolve_env_fallback_prefers_order() {
22 let lock = GlobalStateLock::new();
23 let _access = EnvGuard::set(&lock, "ACCESS_TOKEN", "access");
24 let _service = EnvGuard::set(&lock, "SERVICE_TOKEN", "service");
25
26 assert_eq!(
27 resolve_env_fallback(&["ACCESS_TOKEN", "SERVICE_TOKEN"]),
28 Some(("access".to_string(), "ACCESS_TOKEN".to_string()))
29 );
30 }
31
32 #[test]
33 fn resolve_env_fallback_skips_empty_and_whitespace() {
34 let lock = GlobalStateLock::new();
35 let _access = EnvGuard::set(&lock, "ACCESS_TOKEN", " ");
36 let _service = EnvGuard::set(&lock, "SERVICE_TOKEN", "service");
37
38 assert_eq!(
39 resolve_env_fallback(&["ACCESS_TOKEN", "SERVICE_TOKEN"]),
40 Some(("service".to_string(), "SERVICE_TOKEN".to_string()))
41 );
42 }
43
44 #[test]
45 fn resolve_env_fallback_returns_none_when_missing() {
46 let lock = GlobalStateLock::new();
47 let _access = EnvGuard::remove(&lock, "ACCESS_TOKEN");
48 let _service = EnvGuard::remove(&lock, "SERVICE_TOKEN");
49
50 assert_eq!(
51 resolve_env_fallback(&["ACCESS_TOKEN", "SERVICE_TOKEN"]),
52 None
53 );
54 }
55}