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."
));
}