use tempfile::TempDir;
use tree_type::GenericDir;
use tree_type::GenericFile;
use tree_type::dir_type;
use tree_type::file_type;
#[cfg(unix)]
use std::os::unix::fs::PermissionsExt;
#[cfg(unix)]
#[test]
fn test_file_type_secure() {
file_type!(TestFile);
let temp_dir = TempDir::new().unwrap();
let file_path = temp_dir.path().join("test.txt");
let test_file = TestFile::new(file_path).unwrap();
test_file.write("test content").unwrap();
test_file.secure().unwrap();
let metadata = std::fs::metadata(test_file.as_path()).unwrap();
let permissions = metadata.permissions();
assert_eq!(permissions.mode() & 0o777, 0o600);
}
#[cfg(unix)]
#[test]
fn test_dir_type_secure() {
dir_type!(TestDir);
let temp_dir = TempDir::new().unwrap();
let dir_path = temp_dir.path().join("test_dir");
let test_dir = TestDir::new(dir_path).unwrap();
test_dir.create().unwrap();
test_dir.secure().unwrap();
let metadata = std::fs::metadata(test_dir.as_path()).unwrap();
let permissions = metadata.permissions();
assert_eq!(permissions.mode() & 0o777, 0o700);
}
#[cfg(unix)]
#[test]
fn test_secure_method_signature() {
file_type!(TestFile);
dir_type!(TestDir);
let temp_dir = TempDir::new().unwrap();
let file_path = temp_dir.path().join("test.txt");
let test_file = TestFile::new(&file_path).unwrap();
let generic_file = GenericFile::new(&file_path).unwrap();
test_file.write("test").unwrap();
let _: Result<(), std::io::Error> = test_file.secure();
let _: Result<(), std::io::Error> = generic_file.secure();
let dir_path = temp_dir.path().join("test_dir");
let test_dir = TestDir::new(&dir_path).unwrap();
let generic_dir = GenericDir::new(&dir_path).unwrap();
test_dir.create().unwrap();
let _: Result<(), std::io::Error> = test_dir.secure();
let _: Result<(), std::io::Error> = generic_dir.secure();
}
#[cfg(unix)]
#[test]
fn test_secure_delegation() {
file_type!(TestFile);
dir_type!(TestDir);
let temp_dir = TempDir::new().unwrap();
let file_path = temp_dir.path().join("test.txt");
let test_file = TestFile::new(&file_path).unwrap();
test_file.write("test content").unwrap();
test_file.secure().unwrap();
let generic_file = test_file.as_generic();
let metadata1 = std::fs::metadata(&file_path).unwrap();
let reset_perms = std::fs::Permissions::from_mode(0o644);
std::fs::set_permissions(&file_path, reset_perms).unwrap();
generic_file.secure().unwrap();
let metadata2 = std::fs::metadata(&file_path).unwrap();
assert_eq!(
metadata1.permissions().mode() & 0o777,
metadata2.permissions().mode() & 0o777
);
let dir_path = temp_dir.path().join("test_dir");
let test_dir = TestDir::new(&dir_path).unwrap();
test_dir.create().unwrap();
test_dir.secure().unwrap();
let generic_dir = test_dir.as_generic();
let metadata1 = std::fs::metadata(&dir_path).unwrap();
let reset_perms = std::fs::Permissions::from_mode(0o755);
std::fs::set_permissions(&dir_path, reset_perms).unwrap();
generic_dir.secure().unwrap();
let metadata2 = std::fs::metadata(&dir_path).unwrap();
assert_eq!(
metadata1.permissions().mode() & 0o777,
metadata2.permissions().mode() & 0o777
);
}