rash_core 2.20.0

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_info_basic() {
    skip_without_docker!();

    let script_text = r#"
#!/usr/bin/env rash
- name: Get Docker info
  docker_info:
  register: docker
"#;

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

    assert!(stderr.is_empty(), "stderr should be empty: {}", stderr);
    assert!(
        stdout.contains("Docker information collected"),
        "stdout: {}",
        stdout
    );
}

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

    let script_text = r#"
#!/usr/bin/env rash
- name: Get Docker info in check mode
  docker_info:
  register: docker
"#;

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

    assert!(stderr.is_empty(), "stderr should be empty: {}", stderr);
    assert!(
        stdout.contains("Docker information collected"),
        "stdout: {}",
        stdout
    );
}

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

    let script_text = r#"
#!/usr/bin/env rash
- name: Get Docker info without version
  docker_info:
    get_version: false
  register: docker
"#;

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

    assert!(stderr.is_empty(), "stderr should be empty: {}", stderr);
    assert!(
        stdout.contains("Docker information collected"),
        "stdout: {}",
        stdout
    );
}

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

    let script_text = r#"
#!/usr/bin/env rash
- name: Get Docker info without system info
  docker_info:
    get_info: false
  register: docker
"#;

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

    assert!(stderr.is_empty(), "stderr should be empty: {}", stderr);
    assert!(
        stdout.contains("Docker information collected"),
        "stdout: {}",
        stdout
    );
}

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

    let script_text = r#"
#!/usr/bin/env rash
- name: Get Docker info with disk usage
  docker_info:
    get_disk_usage: true
  register: docker
"#;

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

    assert!(stderr.is_empty(), "stderr should be empty: {}", stderr);
    assert!(
        stdout.contains("Docker information collected"),
        "stdout: {}",
        stdout
    );
}

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

    let script_text = r#"
#!/usr/bin/env rash
- name: Get Docker disk usage only
  docker_info:
    get_version: false
    get_info: false
    get_disk_usage: true
  register: docker
"#;

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

    assert!(stderr.is_empty(), "stderr should be empty: {}", stderr);
    assert!(
        stdout.contains("Docker information collected"),
        "stdout: {}",
        stdout
    );
}

#[test]
fn test_docker_info_not_available() {
    let script_text = r#"
#!/usr/bin/env rash
- name: Get Docker info (may not be available)
  docker_info:
  register: docker
"#;

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

    assert!(stderr.is_empty(), "stderr should be empty: {}", stderr);
    if docker_available() {
        assert!(
            stdout.contains("Docker information collected"),
            "stdout: {}",
            stdout
        );
    } else {
        assert!(
            stdout.contains("Docker is not available"),
            "stdout: {}",
            stdout
        );
    }
}