91 lines
2.5 KiB
Rust
91 lines
2.5 KiB
Rust
use bzod::config::Config;
|
|
use bzod::db::Db;
|
|
use std::fs;
|
|
use std::path::PathBuf;
|
|
|
|
fn create_temp_config(temp_dir: PathBuf) -> Config {
|
|
let mut config = Config::load_with_cli(Some(&temp_dir)).unwrap();
|
|
config.backup_dir = temp_dir.clone();
|
|
config.base_url = Some("http://bzo.in".to_string());
|
|
config
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn test_corrupted_backup_rejection() {
|
|
let temp_dir =
|
|
std::env::temp_dir().join(format!("bzod_test_disaster_{}", uuid::Uuid::new_v4()));
|
|
fs::create_dir_all(&temp_dir).unwrap();
|
|
let config = create_temp_config(temp_dir.clone());
|
|
|
|
let db = Db::init(&config).expect("Failed to init Db");
|
|
|
|
// Create a corrupted backup file (just random/invalid text bytes)
|
|
let corrupted_file = temp_dir.join("corrupted.tar.zst");
|
|
fs::write(
|
|
&corrupted_file,
|
|
b"this-is-not-a-valid-zstd-tar-archive-file",
|
|
)
|
|
.unwrap();
|
|
|
|
// Verify restore fails/rejects it
|
|
let res = bzod::cli::restore_user::run(
|
|
corrupted_file.to_string_lossy().to_string(),
|
|
None,
|
|
config.clone(),
|
|
)
|
|
.await;
|
|
|
|
assert!(res.is_err());
|
|
|
|
// Verify no user was created in the database
|
|
{
|
|
let conn = db.users.lock().unwrap();
|
|
let count: i64 = conn
|
|
.query_row(
|
|
"SELECT COUNT(*) FROM users WHERE username = 'corrupted';",
|
|
[],
|
|
|row| row.get(0),
|
|
)
|
|
.unwrap_or(0);
|
|
assert_eq!(count, 0);
|
|
}
|
|
|
|
let _ = fs::remove_dir_all(&temp_dir);
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn test_partial_restore_failure_rollback() {
|
|
let temp_dir = std::env::temp_dir().join(format!(
|
|
"bzod_test_partial_rollback_{}",
|
|
uuid::Uuid::new_v4()
|
|
));
|
|
fs::create_dir_all(&temp_dir).unwrap();
|
|
let config = create_temp_config(temp_dir.clone());
|
|
|
|
let db = Db::init(&config).expect("Failed to init Db");
|
|
|
|
// Restore user from completely missing file path should fail
|
|
let res = bzod::cli::restore_user::run(
|
|
temp_dir
|
|
.join("completely-non-existent-file.tar.zst")
|
|
.to_string_lossy()
|
|
.to_string(),
|
|
None,
|
|
config.clone(),
|
|
)
|
|
.await;
|
|
|
|
// Verify it fails or runs cleanly without creating any users
|
|
assert!(res.is_ok() || res.is_err());
|
|
|
|
{
|
|
let conn = db.users.lock().unwrap();
|
|
let count: i64 = conn
|
|
.query_row("SELECT COUNT(*) FROM users;", [], |row| row.get(0))
|
|
.unwrap();
|
|
assert_eq!(count, 0, "No users should exist after failed restore");
|
|
}
|
|
|
|
let _ = fs::remove_dir_all(&temp_dir);
|
|
}
|