use nzb_web::{StartupConfig, startup};
#[tokio::test]
async fn initialize_creates_custom_directories() {
let tmp = tempfile::tempdir().unwrap();
let config_path = tmp.path().join("config.toml");
let data_dir = tmp.path().join("custom-data");
let incomplete_dir = tmp.path().join("custom-incomplete");
let complete_dir = tmp.path().join("custom-complete");
let mut startup_cfg = StartupConfig {
config_path,
listen_addr: None,
port: None,
data_dir: Some(data_dir.clone()),
log_level: None,
};
let mut config = nzb_web::nzb_core::config::AppConfig::default();
config.general.data_dir = data_dir.clone();
config.general.incomplete_dir = incomplete_dir.clone();
config.general.complete_dir = complete_dir.clone();
config.save(&startup_cfg.config_path).unwrap();
startup_cfg.data_dir = None;
let result = startup::initialize(startup_cfg, None).await;
assert!(
result.is_ok(),
"expected initialize to succeed, got: {:?}",
result.err().map(|e| format!("{e:?}"))
);
assert!(data_dir.is_dir());
assert!(incomplete_dir.is_dir());
assert!(complete_dir.is_dir());
}
#[cfg(unix)]
#[tokio::test]
async fn initialize_reports_context_on_unwritable_data_dir() {
use std::os::unix::fs::PermissionsExt;
let tmp = tempfile::tempdir().unwrap();
let locked_parent = tmp.path().join("locked");
std::fs::create_dir_all(&locked_parent).unwrap();
std::fs::set_permissions(&locked_parent, std::fs::Permissions::from_mode(0o000)).unwrap();
let config_path = tmp.path().join("config.toml");
let data_dir = locked_parent.join("data");
let startup_cfg = StartupConfig {
config_path,
listen_addr: None,
port: None,
data_dir: Some(data_dir.clone()),
log_level: None,
};
let result = startup::initialize(startup_cfg, None).await;
std::fs::set_permissions(&locked_parent, std::fs::Permissions::from_mode(0o755)).unwrap();
let err = match result {
Err(e) => e,
Ok(_) => return,
};
let debug_text = format!("{err:?}");
assert_ne!(
debug_text.trim(),
"Permission denied (os error 13)",
"regression: error must not be the bare os-error text from issue #62, got: {debug_text}"
);
assert!(
debug_text.contains(&data_dir.display().to_string()),
"error should mention the failing path, got: {debug_text}"
);
}