blazehash 0.2.5

Forensic file hasher — hashdeep for the modern era, BLAKE3 by default
Documentation
use assert_cmd::Command;
use tempfile::TempDir;
use std::fs;

fn make_manifest(dir: &TempDir) -> std::path::PathBuf {
    let p = dir.path().join("case.hash");
    fs::write(&p, "## case-id: CASE-001\n## examiner: Alice\n## algorithm: blake3\nblake3  aaaa  file1.txt\nblake3  bbbb  file2.txt\n").unwrap();
    p
}

#[test]
fn test_info_shows_case_id() {
    let dir = TempDir::new().unwrap();
    let m = make_manifest(&dir);
    let out = Command::cargo_bin("blazehash").unwrap()
        .args(["info", m.to_str().unwrap()])
        .assert().success().get_output().stdout.clone();
    let s = String::from_utf8_lossy(&out);
    assert!(s.contains("CASE-001"), "should display case-id value");
}

#[test]
fn test_info_shows_entry_count() {
    let dir = TempDir::new().unwrap();
    let m = make_manifest(&dir);
    let out = Command::cargo_bin("blazehash").unwrap()
        .args(["info", m.to_str().unwrap()])
        .assert().success().get_output().stdout.clone();
    let s = String::from_utf8_lossy(&out);
    assert!(s.contains('2'), "should show 2 entries");
}

#[test]
fn test_info_json_output() {
    let dir = TempDir::new().unwrap();
    let m = make_manifest(&dir);
    let out = Command::cargo_bin("blazehash").unwrap()
        .args(["info", m.to_str().unwrap(), "--json"])
        .assert().success().get_output().stdout.clone();
    let s = String::from_utf8_lossy(&out);
    let v: serde_json::Value = serde_json::from_str(&s).expect("should be valid JSON");
    assert_eq!(v["headers"]["case-id"], "CASE-001");
    assert_eq!(v["entries"], 2);
}

#[test]
fn test_info_shows_algorithms() {
    let dir = TempDir::new().unwrap();
    let m = make_manifest(&dir);
    let out = Command::cargo_bin("blazehash").unwrap()
        .args(["info", m.to_str().unwrap()])
        .assert().success().get_output().stdout.clone();
    let s = String::from_utf8_lossy(&out);
    assert!(s.contains("blake3"), "should list algorithms used");
}

#[test]
fn test_info_missing_manifest_fails() {
    let out = Command::cargo_bin("blazehash").unwrap()
        .args(["info", "/no/such/file.hash"])
        .output().unwrap();
    assert!(!out.status.success());
}