use std::fs::{self, File};
use std::io::Write;
use tempfile::TempDir;
fn create_test_workspace() -> TempDir {
let temp_dir = TempDir::new().unwrap();
let workspace = temp_dir.path();
let test_file = workspace.join("test.rs");
let mut file = File::create(&test_file).unwrap();
writeln!(file, "fn test_function() {{}}").unwrap();
let db_path = workspace.join(".splice_graph.db");
let mut db = File::create(&db_path).unwrap();
writeln!(db, "dummy database").unwrap();
temp_dir
}
#[test]
fn test_pre_verify_blocks_corrupted_file() {
let temp_dir = create_test_workspace();
let workspace = temp_dir.path();
let test_file = workspace.join("test.rs");
let db_path = workspace.join(".splice_graph.db");
let replaced_checksum = splice::checksum::checksum_file(&test_file).unwrap();
let mut file = File::create(&test_file).unwrap();
writeln!(file, "fn modified_function() {{}}").unwrap();
use splice::verify;
let results = verify::pre_verify_patch(
&test_file,
Some(&replaced_checksum),
workspace,
&db_path,
false,
false,
)
.unwrap();
assert!(results.iter().any(|r| r.is_blocking()));
let checksum_failed = results.iter().any(|r| {
if let verify::PreVerificationResult::Fail { check, .. } = r {
check == "file_checksum"
} else {
false
}
});
assert!(checksum_failed, "Expected file_checksum failure");
}
#[test]
fn test_pre_verify_allows_clean_file() {
let temp_dir = create_test_workspace();
let workspace = temp_dir.path();
let test_file = workspace.join("test.rs");
let db_path = workspace.join(".splice_graph.db");
let checksum = splice::checksum::checksum_file(&test_file).unwrap();
use splice::verify;
let results = verify::pre_verify_patch(
&test_file,
Some(&checksum),
workspace,
&db_path,
false,
false,
)
.unwrap();
assert!(results.iter().all(|r| r.is_pass()));
}
#[test]
fn test_strict_mode_blocks_on_warning() {
let temp_dir = create_test_workspace();
let workspace = temp_dir.path();
let test_file = workspace.join("test.rs");
let db_path = workspace.join(".splice_graph.db");
use splice::verify;
let results_normal = verify::pre_verify_patch(
&test_file, None, workspace, &db_path, false, false,
)
.unwrap();
assert!(results_normal.iter().all(|r| r.is_pass()));
let results_strict = verify::pre_verify_patch(
&test_file, None, workspace, &db_path, true, false,
)
.unwrap();
assert!(results_strict.iter().all(|r| r.is_pass()));
let results_strict_skip = verify::pre_verify_patch(
&test_file, None, workspace, &db_path, true, true, )
.unwrap();
assert!(results_strict_skip.iter().all(|r| r.is_pass()));
assert!(results_strict_skip.len() == 1);
}
#[test]
fn test_skip_mode_bypasses_all_checks() {
let temp_dir = create_test_workspace();
let workspace = temp_dir.path();
let test_file = workspace.join("test.rs");
let db_path = workspace.join(".splice_graph.db");
fs::remove_file(&test_file).unwrap();
use splice::verify;
let results_normal = verify::pre_verify_patch(
&test_file, None, workspace, &db_path, false, false, )
.unwrap();
assert!(results_normal.iter().any(|r| r.is_blocking()));
let results_skip = verify::pre_verify_patch(
&test_file, None, workspace, &db_path, false, true, )
.unwrap();
assert!(results_skip.iter().all(|r| r.is_pass()));
assert!(results_skip.len() == 1);
}
#[test]
fn test_pre_verify_detects_readonly_file() {
let temp_dir = create_test_workspace();
let workspace = temp_dir.path();
let test_file = workspace.join("test.rs");
let db_path = workspace.join(".splice_graph.db");
let mut perms = fs::metadata(&test_file).unwrap().permissions();
perms.set_readonly(true);
fs::set_permissions(&test_file, perms.clone()).unwrap();
use splice::verify;
let results =
verify::pre_verify_patch(&test_file, None, workspace, &db_path, false, false).unwrap();
assert!(results.iter().any(|r| r.is_blocking()));
let writable_failed = results.iter().any(|r| {
if let verify::PreVerificationResult::Fail { check, .. } = r {
check == "file_writable"
} else {
false
}
});
assert!(writable_failed, "Expected file_writable failure");
perms.set_readonly(false);
fs::set_permissions(&test_file, perms).unwrap();
}
#[test]
fn test_pre_verify_detects_file_outside_workspace() {
let temp_dir = TempDir::new().unwrap();
let workspace = temp_dir.path().join("workspace");
fs::create_dir(&workspace).unwrap();
let outside_file = temp_dir.path().join("outside.rs");
let mut file = File::create(&outside_file).unwrap();
writeln!(file, "fn external() {{}}").unwrap();
let db_path = workspace.join(".splice_graph.db");
use splice::verify;
let results =
verify::pre_verify_patch(&outside_file, None, &workspace, &db_path, false, false).unwrap();
assert!(results.iter().any(|r| r.is_blocking()));
let workspace_failed = results.iter().any(|r| {
if let verify::PreVerificationResult::Fail { check, .. } = r {
check == "file_in_workspace"
} else {
false
}
});
assert!(workspace_failed, "Expected file_in_workspace failure");
}
#[test]
fn test_pre_verify_checks_workspace_writable() {
let temp_dir = create_test_workspace();
let workspace = temp_dir.path();
let test_file = workspace.join("test.rs");
let mut perms = fs::metadata(workspace).unwrap().permissions();
perms.set_readonly(true);
fs::set_permissions(workspace, perms.clone()).unwrap();
use splice::verify;
let db_path = workspace.join(".splice_graph.db");
let results =
verify::pre_verify_patch(&test_file, None, workspace, &db_path, false, false).unwrap();
assert!(results.iter().any(|r| r.is_blocking()));
perms.set_readonly(false);
fs::set_permissions(workspace, perms).unwrap();
}