Skip to main content

api_testing_core/
auth_env.rs

1use 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}