cache-pin 0.1.5

Pin Nix flake inputs to revisions with full binary-cache coverage
use assert_cmd::Command;
use predicates::prelude::*;

#[test]
fn test_help() {
    Command::cargo_bin("cache-pin")
        .unwrap()
        .arg("--help")
        .assert()
        .success()
        .stdout(predicate::str::contains("Pin a flake input"))
        .stdout(predicate::str::contains("--check-current"))
        .stdout(predicate::str::contains("--json"))
        .stdout(predicate::str::contains("--plan"));
}

#[test]
fn test_no_args_fails() {
    Command::cargo_bin("cache-pin")
        .unwrap()
        .assert()
        .failure()
        .stderr(predicate::str::contains("--config"));
}

#[test]
fn test_nonexistent_config_fails() {
    Command::cargo_bin("cache-pin")
        .unwrap()
        .args(["--config", "/nonexistent/path.json"])
        .assert()
        .failure()
        .stderr(predicate::str::contains("failed to read config"));
}

#[test]
fn plan_conflicts_with_mutating_flags() {
    for flag in ["--update", "--no-lock"] {
        Command::cargo_bin("cache-pin")
            .unwrap()
            .args(["--config", "config.json", "--plan", flag])
            .assert()
            .failure()
            .stderr(predicate::str::contains("cannot be used with"));
    }
}