rash_core 2.19.2

Declarative shell scripting using Rust native bindings
Documentation
use std::process::Command;

use crate::cli::modules::run_test;

fn docker_available() -> bool {
    Command::new("docker")
        .args(["info"])
        .output()
        .map(|o| o.status.success())
        .unwrap_or(false)
}

macro_rules! skip_without_docker {
    () => {
        if !docker_available() {
            eprintln!("Skipping test: Docker not available");
            return;
        }
    };
}

#[test]
fn test_docker_prune_containers() {
    skip_without_docker!();

    let script_text = r#"
#!/usr/bin/env rash
- name: Prune stopped containers
  docker_prune:
    containers: true
"#;

    let args = ["--diff"];
    let (stdout, stderr) = run_test(script_text, &args);

    assert!(stderr.is_empty(), "stderr should be empty: {}", stderr);
    assert!(
        stdout.contains("changed") || stdout.contains("ok"),
        "stdout should contain 'changed' or 'ok': {}",
        stdout
    );
}

#[test]
fn test_docker_prune_all() {
    skip_without_docker!();

    let script_text = r#"
#!/usr/bin/env rash
- name: Prune all Docker resources
  docker_prune:
    all: true
"#;

    let args = ["--diff"];
    let (stdout, stderr) = run_test(script_text, &args);

    assert!(stderr.is_empty(), "stderr should be empty: {}", stderr);
    assert!(
        stdout.contains("changed"),
        "stdout should contain 'changed': {}",
        stdout
    );
}

#[test]
fn test_docker_prune_multiple_types() {
    skip_without_docker!();

    let script_text = r#"
#!/usr/bin/env rash
- name: Prune multiple resource types
  docker_prune:
    containers: true
    images: true
    volumes: true
"#;

    let args = ["--diff"];
    let (_stdout, stderr) = run_test(script_text, &args);

    assert!(stderr.is_empty(), "stderr should be empty: {}", stderr);
}

#[test]
fn test_docker_prune_check_mode() {
    skip_without_docker!();

    let script_text = r#"
#!/usr/bin/env rash
- name: Check mode - should not prune
  docker_prune:
    containers: true
    images: true
"#;

    let args = ["--check", "--diff"];
    let (stdout, stderr) = run_test(script_text, &args);

    assert!(stderr.is_empty(), "stderr should be empty: {}", stderr);
    assert!(
        stdout.contains("changed"),
        "stdout should show changed in check mode: {}",
        stdout
    );
}

#[test]
fn test_docker_prune_no_options() {
    skip_without_docker!();

    let script_text = r#"
#!/usr/bin/env rash
- name: Prune without options
  docker_prune: {}
"#;

    let args = ["--diff"];
    let (_stdout, stderr) = run_test(script_text, &args);

    assert!(stderr.is_empty(), "stderr should be empty: {}", stderr);
}