cargo-brief 0.12.1

Visibility-aware Rust API extractor — pseudo-Rust output for AI agent consumption
Documentation
use std::process::Command;

#[test]
fn cli_smoke_test() {
    let output = Command::new("cargo")
        .args([
            "run",
            "--",
            "api",
            "test-fixture",
            "--manifest-path",
            "test_fixture/Cargo.toml",
            "--recursive",
        ])
        .output()
        .expect("Failed to run cargo-brief");

    assert!(output.status.success(), "cargo-brief exited with error");

    let stdout = String::from_utf8_lossy(&output.stdout);
    assert!(stdout.contains("// crate test_fixture"), "has crate header");
    assert!(stdout.contains("pub struct PubStruct"), "has PubStruct");
    assert!(stdout.contains("pub enum PlainEnum"), "has PlainEnum");
    assert!(stdout.contains("pub union MyUnion"), "has MyUnion");
    assert!(stdout.contains("pub static GLOBAL_COUNT"), "has static");
}

#[test]
fn cli_self_keyword_test() {
    // Run from the project root — "self" should resolve to "cargo-brief"
    let output = Command::new("cargo")
        .args(["run", "--", "api", "self", "--depth", "0"])
        .output()
        .expect("Failed to run cargo-brief with self");

    assert!(
        output.status.success(),
        "cargo-brief api self exited with error: {}",
        String::from_utf8_lossy(&output.stderr)
    );

    let stdout = String::from_utf8_lossy(&output.stdout);
    assert!(
        stdout.contains("// crate cargo_brief"),
        "self should resolve to cargo-brief crate, got:\n{stdout}"
    );
}

#[test]
fn cli_self_module_syntax_test() {
    // "self::cli" should resolve to cargo-brief's cli module
    let output = Command::new("cargo")
        .args(["run", "--", "api", "self::cli"])
        .output()
        .expect("Failed to run cargo-brief with self::cli");

    assert!(
        output.status.success(),
        "cargo-brief api self::cli exited with error: {}",
        String::from_utf8_lossy(&output.stderr)
    );

    let stdout = String::from_utf8_lossy(&output.stdout);
    // After refactor, BriefCommand is the main enum
    assert!(
        stdout.contains("BriefCommand")
            || stdout.contains("ApiArgs")
            || stdout.contains("FilterArgs"),
        "self::cli should show CLI types, got:\n{stdout}"
    );
}

#[test]
fn cli_file_path_test() {
    // "src/cli.rs" should resolve to the cli module of self
    let output = Command::new("cargo")
        .args(["run", "--", "api", "src/cli.rs"])
        .output()
        .expect("Failed to run cargo-brief with file path");

    assert!(
        output.status.success(),
        "cargo-brief api src/cli.rs exited with error: {}",
        String::from_utf8_lossy(&output.stderr)
    );

    let stdout = String::from_utf8_lossy(&output.stdout);
    assert!(
        stdout.contains("BriefCommand")
            || stdout.contains("ApiArgs")
            || stdout.contains("FilterArgs"),
        "src/cli.rs should show CLI types, got:\n{stdout}"
    );
}