rustmaninoff 0.1.0

Fast IaC security scanner with Checkov-compatible policies
Documentation
use std::fs;
use std::path::PathBuf;
use std::process::Command;
use std::time::{SystemTime, UNIX_EPOCH};

fn dir(label: &str) -> PathBuf {
    let nanos = SystemTime::now()
        .duration_since(UNIX_EPOCH)
        .unwrap()
        .as_nanos();
    let path = std::env::temp_dir().join(format!("rustmaninoff-bin-{label}-{nanos}"));
    fs::create_dir_all(&path).unwrap();
    path
}

fn binary() -> Command {
    Command::new(env!("CARGO_BIN_EXE_rustmaninoff"))
}

#[test]
fn binary_exits_clean_failed_and_usage() {
    let clean = dir("clean");
    fs::write(
        clean.join("main.tf"),
        "resource \"aws_ebs_volume\" \"disk\" {\n  encrypted = true\n}\n",
    )
    .unwrap();
    let ok = binary().arg("scan").arg(&clean).output().expect("run");
    assert_eq!(
        ok.status.code(),
        Some(0),
        "{}",
        String::from_utf8_lossy(&ok.stderr)
    );
    let bad = dir("bad");
    fs::write(
        bad.join("main.tf"),
        "resource \"aws_ebs_volume\" \"disk\" {\n  encrypted = false\n}\n",
    )
    .unwrap();
    let failed = binary().arg("scan").arg(&bad).output().expect("run");
    assert_eq!(failed.status.code(), Some(1));
    let usage = binary()
        .arg("scan")
        .arg(&bad)
        .arg("--framework")
        .arg("nope")
        .output()
        .expect("run");
    assert_eq!(usage.status.code(), Some(2));
    assert!(String::from_utf8_lossy(&usage.stderr).contains("error:"));
    let _ = fs::remove_dir_all(clean);
    let _ = fs::remove_dir_all(bad);
}