slopguard-cli 0.1.11

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

use std::fs::write;

use predicates::prelude::*;
use tempfile::tempdir;

use common::slopguard;

#[test]
fn list_shows_active_rules() {
    let output = slopguard().args(["list"]).output().unwrap();

    assert!(output.status.success());
    let stdout = String::from_utf8(output.stdout).unwrap();

    assert!(
        stdout.contains("no-unwrap-in-prod"),
        "should list no-unwrap-in-prod"
    );
    assert!(stdout.contains("rust"), "should show language column");
    assert!(
        stdout.contains("error") || stdout.contains("warning"),
        "should show severity column"
    );
    assert!(
        stdout.contains("correctness") || stdout.contains("security") || stdout.contains("slop"),
        "should show category column"
    );
}

#[test]
fn list_all_shows_disabled_rules() {
    let dir = tempdir().unwrap();
    let config_path = dir.path().join("slopguard.toml");
    write(&config_path, "[rules]\ndisable = [\"no-unwrap-in-prod\"]\n").unwrap();

    let output = slopguard()
        .args(["list", "--all", "--config", config_path.to_str().unwrap()])
        .output()
        .unwrap();

    assert!(output.status.success());
    let stdout = String::from_utf8(output.stdout).unwrap();

    assert!(
        stdout.contains("no-unwrap-in-prod"),
        "--all should still show disabled rules"
    );
    assert!(
        stdout.contains("disabled"),
        "disabled rules should be marked as disabled"
    );
}

#[test]
fn list_category_filter() {
    slopguard()
        .args(["list", "--category", "security"])
        .assert()
        .success()
        .stdout(predicate::str::contains("security"))
        .stdout(predicate::str::contains("no-debug-on-secrets"));

    let output = slopguard()
        .args(["list", "--category", "security"])
        .output()
        .unwrap();

    let stdout = String::from_utf8(output.stdout).unwrap();
    assert!(
        !stdout.contains("no-unwrap-in-prod"),
        "should not show correctness rules when filtering by security"
    );
}

#[test]
fn list_language_filter() {
    slopguard()
        .args(["list", "--language", "typescript"])
        .assert()
        .success()
        .stdout(predicate::str::contains("typescript"));

    let output = slopguard()
        .args(["list", "--language", "typescript"])
        .output()
        .unwrap();

    let stdout = String::from_utf8(output.stdout).unwrap();
    assert!(
        !stdout.contains("no-unwrap-in-prod"),
        "should not show Rust rules when filtering by TypeScript"
    );
    assert!(
        stdout.contains("no-any-typescript"),
        "should show TypeScript rules"
    );
}