rash_core 2.19.1

Declarative shell scripting using Rust native bindings
Documentation
use std::env;
use std::path::Path;

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

use serde_json::json;

#[test]
fn test_gem_present() {
    let mocks_dir = Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/mocks");

    let script_text = format!(
        r#"
#!/usr/bin/env rash
- name: test gem module
  gem:
    executable: {}/gem.rh
    name:
      - sinatra
      - rack
      - bundler
    state: present
        "#,
        mocks_dir.to_str().unwrap()
    );

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

    assert!(stdout.contains("+ sinatra"));
    assert!(stdout.contains("+ rack"));
    assert!(!stdout.contains("+ bundler"));
    assert!(stderr.is_empty());
    assert!(stdout.ends_with("changed\n"));
}

#[test]
fn test_gem_remove() {
    let mocks_dir = Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/mocks");

    let script_text = format!(
        r#"
#!/usr/bin/env rash
- name: test gem module
  gem:
    executable: {}/gem.rh
    name:
      - rubocop
      - bundler
      - nonexistent-gem
    state: absent
        "#,
        mocks_dir.to_str().unwrap()
    );

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

    assert!(stdout.contains("- rubocop"));
    assert!(stdout.contains("- bundler"));
    assert!(!stdout.contains("- nonexistent-gem"));
    assert!(stderr.is_empty());
    assert!(stdout.ends_with("changed\n"));
}

#[test]
fn test_gem_latest() {
    let mocks_dir = Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/mocks");

    let script_text = format!(
        r#"
#!/usr/bin/env rash
- name: test gem module
  gem:
    executable: {}/gem.rh
    name:
      - bundler
      - rails
    state: latest
        "#,
        mocks_dir.to_str().unwrap()
    );

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

    assert!(stdout.contains("+ bundler") || stdout.contains("+ rails"));
    assert!(stderr.is_empty());
    assert!(stdout.ends_with("changed\n"));
}

#[test]
fn test_gem_result_extra() {
    let mocks_dir = Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/mocks");

    let script_text = format!(
        r#"
#!/usr/bin/env rash
- name: test gem module
  gem:
    executable: {}/gem.rh
    name:
      - sinatra
      - bundler
      - rubocop
    state: absent
  register: gems
- debug:
    msg: "{{{{ gems.extra }}}}"
        "#,
        mocks_dir.to_str().unwrap()
    );
    let args = ["--output", "raw"];
    let (stdout, stderr) = run_test(&script_text, &args);

    assert!(stderr.is_empty());
    assert_eq!(
        stdout.lines().last().unwrap().replace(' ', ""),
        serde_json::to_string(&json!({
            "installed_gems": [],
            "updated_gems": [],
            "removed_gems": ["bundler", "rubocop"],
        }))
        .unwrap()
    );
}

#[test]
fn test_gem_version_constraint() {
    let mocks_dir = Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/mocks");

    let script_text = format!(
        r#"
#!/usr/bin/env rash
- name: test gem module
  gem:
    executable: {}/gem.rh
    name: puma
    version: ">= 6.0"
    state: present
        "#,
        mocks_dir.to_str().unwrap()
    );

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

    assert!(stdout.contains("+ puma"));
    assert!(stderr.is_empty());
    assert!(stdout.ends_with("changed\n"));
}

#[test]
fn test_gem_user_install() {
    let mocks_dir = Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/mocks");

    let script_text = format!(
        r#"
#!/usr/bin/env rash
- name: test gem module
  gem:
    executable: {}/gem.rh
    name: sinatra
    user_install: false
    state: present
        "#,
        mocks_dir.to_str().unwrap()
    );

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

    assert!(stdout.contains("+ sinatra"));
    assert!(stderr.is_empty());
    assert!(stdout.ends_with("changed\n"));
}

#[test]
fn test_gem_executable_not_found() {
    let script_text = r#"
#!/usr/bin/env rash
- name: test gem module
  gem:
    executable: non-existent-gem.rh
    name:
      - bundler
    state: present
        "#
    .to_string();
    let args = ["--output", "raw"];
    let (_, stderr) = run_test(&script_text, &args);

    assert!(stderr.lines().last().unwrap().contains(
        "Failed to execute 'non-existent-gem.rh': No such file or directory (os error 2). The executable may not be installed or not in the PATH."
    ));
}