rash_core 2.21.0

Declarative shell scripting using Rust native bindings
Documentation
use crate::cli::modules::run_test_with_env;
use std::sync::atomic::{AtomicU64, Ordering};

static TEST_COUNTER: AtomicU64 = AtomicU64::new(0);

fn get_unique_crontab_file() -> String {
    let test_id = TEST_COUNTER.fetch_add(1, Ordering::SeqCst);
    format!("/tmp/rash_test_cronvar_{}", test_id)
}

#[test]
fn test_cronvar_add_variable() {
    let crontab_file = get_unique_crontab_file();
    let _ = std::fs::remove_file(&crontab_file);

    let script_text = r#"
#!/usr/bin/env rash
- name: test cronvar module add variable
  cronvar:
    name: PATH
    value: /usr/local/bin:/usr/bin:/bin
        "#
    .to_string();

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

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

    let _ = std::fs::remove_file(&crontab_file);
}

#[test]
fn test_cronvar_update_variable() {
    let crontab_file = get_unique_crontab_file();
    let _ = std::fs::remove_file(&crontab_file);

    std::fs::write(&crontab_file, "PATH=/usr/bin:/bin\n").expect("Failed to create test crontab");

    let script_text = r#"
#!/usr/bin/env rash
- name: test cronvar module update variable
  cronvar:
    name: PATH
    value: /usr/local/bin:/usr/bin:/bin
        "#
    .to_string();

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

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

    let _ = std::fs::remove_file(&crontab_file);
}

#[test]
fn test_cronvar_no_change_when_exists() {
    let crontab_file = get_unique_crontab_file();
    let _ = std::fs::remove_file(&crontab_file);

    std::fs::write(&crontab_file, "PATH=/usr/bin:/bin\n").expect("Failed to create test crontab");

    let script_text = r#"
#!/usr/bin/env rash
- name: test cronvar module no change
  cronvar:
    name: PATH
    value: /usr/bin:/bin
        "#
    .to_string();

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

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

    let _ = std::fs::remove_file(&crontab_file);
}

#[test]
fn test_cronvar_remove_variable() {
    let crontab_file = get_unique_crontab_file();
    let _ = std::fs::remove_file(&crontab_file);

    std::fs::write(&crontab_file, "MAILTO=root\nPATH=/usr/bin:/bin\n")
        .expect("Failed to create test crontab");

    let script_text = r#"
#!/usr/bin/env rash
- name: test cronvar module remove variable
  cronvar:
    name: MAILTO
    state: absent
        "#
    .to_string();

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

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

    let _ = std::fs::remove_file(&crontab_file);
}