slopguard-cli 0.1.8

CLI tool to catch AI-generated code patterns via static analysis
mod common;

use predicates::prelude::*;

use common::slopguard;

#[test]
fn explain_existing_rule() {
    slopguard()
        .args(["explain", "no-unwrap-in-prod"])
        .assert()
        .success()
        .stdout(predicate::str::contains("no-unwrap-in-prod"))
        .stdout(predicate::str::contains("error"))
        .stdout(predicate::str::contains("correctness"))
        .stdout(predicate::str::contains(".unwrap()"))
        .stdout(predicate::str::contains("should_match"))
        .stdout(predicate::str::contains("should_not_match"));
}

#[test]
fn explain_unknown_rule_suggests() {
    slopguard()
        .args(["explain", "no-unwarp-in-prod"])
        .assert()
        .code(2)
        .stderr(predicate::str::contains("no-unwrap-in-prod"));
}

#[test]
fn explain_unknown_no_suggestion() {
    slopguard()
        .args(["explain", "zzz-completely-fake-rule"])
        .assert()
        .code(2)
        .stderr(predicate::str::contains("unknown rule"))
        .stderr(predicate::str::contains("Did you mean").not());
}

#[test]
fn explain_json_output() {
    let output = slopguard()
        .args(["explain", "no-unwrap-in-prod", "--format", "json"])
        .output()
        .unwrap();

    assert!(output.status.success());

    let json: serde_json::Value =
        serde_json::from_slice(&output.stdout).expect("output should be valid JSON");

    assert_eq!(json["id"].as_str(), Some("no-unwrap-in-prod"));
    assert_eq!(json["severity"].as_str(), Some("error"));
    assert_eq!(json["category"].as_str(), Some("correctness"));
    assert!(json["message"].is_string());
    assert!(json["should_match"].is_array());
    assert!(json["should_not_match"].is_array());
}