govctl 0.9.4

Project governance CLI for RFC, ADR, and Work Item management
use super::*;

#[test]
fn test_guard_delete_unreferenced() -> common::TestResult {
    let temp_dir = init_project()?;
    write_guard(temp_dir.path(), "GUARD-TEMP", "true")?;

    let guard_path = temp_dir.path().join("gov/guard/guard-temp.toml");
    assert!(guard_path.exists());

    let output = run_commands(temp_dir.path(), &[&["guard", "delete", "GUARD-TEMP"]])?;
    assert!(output.contains("exit: 0"), "output: {}", output);
    assert!(!guard_path.exists(), "guard file should be deleted");
    Ok(())
}

#[test]
fn test_guard_delete_blocked_by_config() -> common::TestResult {
    let temp_dir = init_project()?;
    write_guard(temp_dir.path(), "GUARD-IMPORTANT", "true")?;
    append_verification_config(temp_dir.path(), true, &["GUARD-IMPORTANT"])?;

    let output = run_commands(temp_dir.path(), &[&["guard", "delete", "GUARD-IMPORTANT"]])?;
    assert!(output.contains("exit: 1"), "output: {}", output);
    assert!(
        output.contains("still referenced"),
        "should block delete: {}",
        output
    );
    assert!(
        output.contains("default_guards"),
        "should mention config: {}",
        output
    );
    Ok(())
}

#[test]
fn test_guard_delete_blocked_by_work_item() -> common::TestResult {
    let temp_dir = init_project()?;
    write_guard(temp_dir.path(), "GUARD-REQUIRED", "true")?;
    write_guarded_work_item(temp_dir.path(), "WI-2026-01-01-001", "GUARD-REQUIRED", None)?;

    let output = run_commands(temp_dir.path(), &[&["guard", "delete", "GUARD-REQUIRED"]])?;
    assert!(output.contains("exit: 1"), "output: {}", output);
    assert!(
        output.contains("still referenced"),
        "should block delete: {}",
        output
    );
    Ok(())
}

#[test]
fn test_guard_delete_blocked_by_work_item_waiver() -> common::TestResult {
    let temp_dir = init_project()?;
    write_guard(temp_dir.path(), "GUARD-WAIVED", "true")?;
    write_guarded_work_item(
        temp_dir.path(),
        "WI-2026-01-01-001",
        "GUARD-WAIVED",
        Some("covered elsewhere"),
    )?;

    let output = run_commands(temp_dir.path(), &[&["guard", "delete", "GUARD-WAIVED"]])?;
    assert!(output.contains("exit: 1"), "output: {}", output);
    assert!(
        output.contains("Waiver in work item WI-2026-01-01-001"),
        "should mention waiver blocker: {}",
        output
    );
    Ok(())
}

#[test]
fn test_guard_delete_force_does_not_bypass_reference_checks() -> common::TestResult {
    let temp_dir = init_project()?;
    write_guard(temp_dir.path(), "GUARD-FORCED", "true")?;
    append_verification_config(temp_dir.path(), true, &["GUARD-FORCED"])?;

    let output = run_commands(
        temp_dir.path(),
        &[&["guard", "delete", "GUARD-FORCED", "--force"]],
    )?;
    assert!(output.contains("exit: 1"), "output: {}", output);
    assert!(
        output.contains("still referenced"),
        "force should not bypass reference checks: {}",
        output
    );
    Ok(())
}

#[test]
fn test_guard_delete_missing_returns_coded_error() -> common::TestResult {
    let temp_dir = init_project()?;

    let output = run_commands(temp_dir.path(), &[&["guard", "delete", "GUARD-MISSING"]])?;
    assert!(output.contains("exit: 1"), "output: {}", output);
    assert!(output.contains("error[E1002]"), "output: {}", output);
    Ok(())
}