use std::sync::OnceLock;
pub fn is_test_mode() -> bool {
static TEST_MODE: OnceLock<bool> = OnceLock::new();
*TEST_MODE.get_or_init(|| std::env::var("FERRISUP_TEST_MODE").is_ok())
}
pub fn test_mode_or<F, T>(default: T, f: F) -> anyhow::Result<T>
where
F: FnOnce() -> anyhow::Result<T>,
T: Clone,
{
if is_test_mode() {
Ok(default)
} else {
f()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_is_test_mode() {
std::env::set_var("FERRISUP_TEST_MODE", "1");
assert!(is_test_mode());
std::env::remove_var("FERRISUP_TEST_MODE");
}
#[test]
fn test_test_mode_or() {
std::env::set_var("FERRISUP_TEST_MODE", "1");
let result = test_mode_or("default".to_string(), || {
Ok("interactive".to_string())
});
assert_eq!(result.unwrap(), "default");
std::env::remove_var("FERRISUP_TEST_MODE");
}
}