tree-type 0.4.5

Rust macros for creating type-safe filesystem tree structures
Documentation
#![allow(deprecated)]

use std::fs;
use tempfile::TempDir;
use tree_type::GenericFile;
use tree_type::tree_type;

#[cfg(unix)]
use std::os::unix::fs::PermissionsExt;

// Unit tests for GenericFile secure() method
#[cfg(unix)]
#[test]
fn test_generic_file_secure() {
    let temp_dir = TempDir::new().unwrap();
    let file_path = temp_dir.path().join("test_file.txt");

    // Create file
    fs::write(&file_path, "test content").unwrap();

    let file = GenericFile::new(&file_path).unwrap();
    file.secure().unwrap();

    // Verify permissions are 0o600
    let metadata = fs::metadata(&file_path).unwrap();
    let permissions = metadata.permissions();
    assert_eq!(permissions.mode() & 0o777, 0o600);
}

#[cfg(unix)]
#[test]
fn test_generic_file_secure_nonexistent_file() {
    let temp_dir = TempDir::new().unwrap();
    let file_path = temp_dir.path().join("nonexistent.txt");

    let file = GenericFile::new(&file_path).unwrap();
    let result = file.secure();

    // Should return an error for nonexistent file
    assert!(result.is_err());
}

// Integration tests for macro-generated file types
tree_type! {
    SecureTestRoot {
        test_file("test.txt")
    }
}

#[cfg(unix)]
#[test]
fn test_macro_generated_file_secure() {
    let temp_dir = TempDir::new().unwrap();
    let root = SecureTestRoot::new(temp_dir.path()).unwrap();

    // Create file
    root.test_file().write("test content").unwrap();

    root.test_file().secure().unwrap();

    // Verify permissions are 0o600
    let metadata = fs::metadata(root.test_file().as_path()).unwrap();
    let permissions = metadata.permissions();
    assert_eq!(permissions.mode() & 0o777, 0o600);
}

#[cfg(unix)]
#[test]
fn test_macro_generated_file_secure_delegation() {
    let temp_dir = TempDir::new().unwrap();
    let root = SecureTestRoot::new(temp_dir.path()).unwrap();

    // Create file with different permissions
    root.test_file().write("test content").unwrap();
    let mut perms = fs::metadata(root.test_file().as_path())
        .unwrap()
        .permissions();
    perms.set_mode(0o644);
    fs::set_permissions(root.test_file().as_path(), perms).unwrap();

    root.test_file().secure().unwrap();

    // Verify permissions changed to 0o600
    let metadata = fs::metadata(root.test_file().as_path()).unwrap();
    let permissions = metadata.permissions();
    assert_eq!(permissions.mode() & 0o777, 0o600);
}

// Test that secure() method is available on macro-generated types
#[cfg(unix)]
#[test]
fn test_secure_method_availability() {
    let temp_dir = TempDir::new().unwrap();
    let root = SecureTestRoot::new(temp_dir.path()).unwrap();

    root.test_file().write("test").unwrap();

    // This should compile and work
    let result = root.test_file().secure();
    assert!(result.is_ok());
}