asar-rust 0.1.0

Rust port of @electron/asar — create and extract Electron ASAR archives
Documentation
use asar_rust::filesystem::{Filesystem, FilesystemEntry, ListOptions};
use std::path::Path;

#[test]
fn test_new_filesystem() {
    let fs = Filesystem::new(Path::new("/test"));
    assert_eq!(fs.root_path(), Path::new("/test"));
}

#[test]
fn test_insert_directory() {
    let mut fs = Filesystem::new(Path::new("/test"));
    fs.insert_directory(Path::new("/test/subdir"), false).unwrap();
    let entry = fs.get_file("/subdir", true);
    assert!(entry.is_ok());
    assert!(entry.unwrap().is_directory());
}

#[test]
fn test_insert_file() {
    let mut fs = Filesystem::new(Path::new("/test"));
    fs.insert_file(Path::new("/test/file.txt"), 100, false, false, None).unwrap();
    let entry = fs.get_file("/file.txt", true).unwrap();
    assert!(entry.is_file());
    if let FilesystemEntry::File(f) = entry {
        assert_eq!(f.size, 100);
        assert_eq!(f.offset, "0");
    }
}

#[test]
fn test_insert_link() {
    let mut fs = Filesystem::new(Path::new("/test"));
    fs.insert_link(Path::new("/test/link"), "target".to_string(), false).unwrap();
    let entry = fs.get_file("/link", false).unwrap();
    assert!(entry.is_link());
}

#[test]
fn test_list_files() {
    let mut fs = Filesystem::new(Path::new("/test"));
    fs.insert_directory(Path::new("/test/dir"), false).unwrap();
    fs.insert_file(Path::new("/test/file.txt"), 100, false, false, None).unwrap();
    let files = fs.list_files(None);
    assert_eq!(files.len(), 2);
    assert!(files.contains(&"/dir".to_string()));
    assert!(files.contains(&"/file.txt".to_string()));
}

#[test]
fn test_list_files_with_is_pack() {
    let mut fs = Filesystem::new(Path::new("/test"));
    fs.insert_file(Path::new("/test/packed.txt"), 100, false, false, None).unwrap();
    fs.insert_file(Path::new("/test/unpacked.txt"), 100, false, true, None).unwrap();
    let files = fs.list_files(Some(&ListOptions { is_pack: true }));
    assert_eq!(files.len(), 2);
    assert!(files.iter().any(|f| f.contains("pack") && f.contains("packed.txt")));
    assert!(files.iter().any(|f| f.contains("unpack") && f.contains("unpacked.txt")));
}

#[test]
fn test_get_file_nonexistent() {
    let fs = Filesystem::new(Path::new("/test"));
    let result = fs.get_file("/nonexistent", true);
    assert!(result.is_err());
}

#[test]
fn test_directory_unpack_flag_applies_to_children() {
    let mut fs = Filesystem::new(Path::new("/test"));
    fs.insert_directory(Path::new("/test/unpacked_dir"), true).unwrap();
    fs.insert_file(Path::new("/test/unpacked_dir/file.txt"), 100, false, false, None).unwrap();
    let entry = fs.get_file("/unpacked_dir/file.txt", true).unwrap();
    if let FilesystemEntry::File(f) = entry {
        assert!(f.unpacked);
    } else {
        panic!("Expected file entry");
    }
}