use std::sync::Mutex;
use persona_wire_core::infrastructure::storage::default_db_path;
static ENV_GUARD: Mutex<()> = Mutex::new(());
struct EnvSnapshot {
xdg: Option<std::ffi::OsString>,
home: Option<std::ffi::OsString>,
}
impl EnvSnapshot {
fn capture() -> Self {
Self {
xdg: std::env::var_os("XDG_DATA_HOME"),
home: std::env::var_os("HOME"),
}
}
}
impl Drop for EnvSnapshot {
fn drop(&mut self) {
match &self.xdg {
Some(v) => std::env::set_var("XDG_DATA_HOME", v),
None => std::env::remove_var("XDG_DATA_HOME"),
}
match &self.home {
Some(v) => std::env::set_var("HOME", v),
None => std::env::remove_var("HOME"),
}
}
}
#[test]
fn fallback_uses_xdg_data_home_when_set() {
let _guard = ENV_GUARD.lock().unwrap_or_else(|e| e.into_inner());
let _snap = EnvSnapshot::capture();
std::env::set_var("XDG_DATA_HOME", "/tmp/test-xdg-data");
std::env::remove_var("HOME");
let p = default_db_path().expect("resolve");
assert_eq!(
p.to_str().unwrap(),
"/tmp/test-xdg-data/persona-wire/store.db"
);
}
#[test]
fn fallback_uses_home_dotfile_when_xdg_unset() {
let _guard = ENV_GUARD.lock().unwrap_or_else(|e| e.into_inner());
let _snap = EnvSnapshot::capture();
std::env::remove_var("XDG_DATA_HOME");
std::env::set_var("HOME", "/tmp/test-home");
let p = default_db_path().expect("resolve");
assert_eq!(p.to_str().unwrap(), "/tmp/test-home/.persona-wire/store.db");
}
#[test]
fn fallback_errors_when_neither_xdg_nor_home_is_set() {
let _guard = ENV_GUARD.lock().unwrap_or_else(|e| e.into_inner());
let _snap = EnvSnapshot::capture();
std::env::remove_var("XDG_DATA_HOME");
std::env::remove_var("HOME");
let err = default_db_path().expect_err("expected error when HOME unset");
let msg = err.to_string();
assert!(
msg.contains("HOME"),
"expected error message to mention HOME, got: {msg}"
);
}