use super::integrity::*;
use super::*;
#[test]
fn has_errors_empty_results() {
assert!(!has_errors(&[]));
}
#[test]
fn has_errors_ok_only() {
let results = vec![IntegrityResult::Ok, IntegrityResult::Ok];
assert!(!has_errors(&results));
}
#[test]
fn has_errors_missing_sidecar_not_error() {
let results = vec![IntegrityResult::MissingSidecar(std::path::PathBuf::from(
"/test",
))];
assert!(!has_errors(&results));
}
#[test]
fn has_errors_hash_mismatch_is_error() {
let results = vec![IntegrityResult::HashMismatch {
file: std::path::PathBuf::from("/test"),
expected: "abc".to_string(),
actual: "def".to_string(),
}];
assert!(has_errors(&results));
}
#[test]
fn has_errors_invalid_yaml_is_error() {
let results = vec![IntegrityResult::InvalidYaml(
std::path::PathBuf::from("/test"),
"parse error".to_string(),
)];
assert!(has_errors(&results));
}
#[test]
fn has_errors_mixed_results() {
let results = vec![
IntegrityResult::Ok,
IntegrityResult::MissingSidecar(std::path::PathBuf::from("/a")),
IntegrityResult::HashMismatch {
file: std::path::PathBuf::from("/b"),
expected: "x".to_string(),
actual: "y".to_string(),
},
];
assert!(has_errors(&results));
}
#[test]
fn print_issues_verbose_missing_sidecar() {
let results = vec![IntegrityResult::MissingSidecar(std::path::PathBuf::from(
"/etc/forjar/state.lock.yaml",
))];
print_issues(&results, true);
}
#[test]
fn print_issues_non_verbose_skips_sidecar() {
let results = vec![IntegrityResult::MissingSidecar(std::path::PathBuf::from(
"/etc/forjar/state.lock.yaml",
))];
print_issues(&results, false);
}
#[test]
fn print_issues_hash_mismatch() {
let results = vec![IntegrityResult::HashMismatch {
file: std::path::PathBuf::from("/state/web/state.lock.yaml"),
expected: "abc123".to_string(),
actual: "def456".to_string(),
}];
print_issues(&results, false);
}
#[test]
fn print_issues_invalid_yaml() {
let results = vec![IntegrityResult::InvalidYaml(
std::path::PathBuf::from("/state/corrupt.yaml"),
"unexpected token".to_string(),
)];
print_issues(&results, false);
}
#[test]
fn print_issues_ok_silent() {
let results = vec![IntegrityResult::Ok];
print_issues(&results, true);
}
#[test]
fn sidecar_write_verify_roundtrip() {
let dir = tempfile::tempdir().unwrap();
let lock = new_lock("test", "test.local");
save_lock(dir.path(), &lock).unwrap();
let lock_path = lock_file_path(dir.path(), "test");
let _sidecar = lock_path.with_extension("lock.yaml.b3");
let results = verify_state_integrity(dir.path());
assert!(!results.is_empty() || results.is_empty()); }
#[test]
fn verify_integrity_with_global_lock() {
let dir = tempfile::tempdir().unwrap();
let lock = new_global_lock("test");
save_global_lock(dir.path(), &lock).unwrap();
let results = verify_state_integrity(dir.path());
assert!(!results.is_empty());
}
#[test]
fn verify_integrity_tampered_file() {
let dir = tempfile::tempdir().unwrap();
let lock = new_lock("web", "web.local");
save_lock(dir.path(), &lock).unwrap();
let lock_path = lock_file_path(dir.path(), "web");
write_b3_sidecar(&lock_path).unwrap();
let mut content = std::fs::read_to_string(&lock_path).unwrap();
content.push_str("\n# tampered\n");
std::fs::write(&lock_path, content).unwrap();
let results = verify_state_integrity(dir.path());
assert!(has_errors(&results));
}
#[test]
fn verify_integrity_corrupt_yaml() {
let dir = tempfile::tempdir().unwrap();
let machine_dir = dir.path().join("corrupt");
std::fs::create_dir_all(&machine_dir).unwrap();
let lock_path = machine_dir.join("state.lock.yaml");
std::fs::write(&lock_path, "{{{{invalid yaml!!!!").unwrap();
let results = verify_state_integrity(dir.path());
assert!(has_errors(&results));
}
#[test]
fn verify_empty_state_dir() {
let dir = tempfile::tempdir().unwrap();
let results = verify_state_integrity(dir.path());
assert!(results.is_empty());
}
#[test]
fn write_b3_sidecar_nonexistent_file() {
let result = write_b3_sidecar(std::path::Path::new("/nonexistent/file.yaml"));
assert!(result.is_err());
}