use assert_cmd::prelude::*;
use predicates::prelude::*;
use std::env;
use std::process::Command;
use tempfile::TempDir;
fn pend_bin() -> Command {
Command::cargo_bin("pend").expect("binary exists")
}
fn pend_with_tempdir() -> (TempDir, Command) {
let tmp = TempDir::new().expect("create tempdir");
let mut cmd = pend_bin();
cmd.env("PEND_DIR", tmp.path());
(tmp, cmd)
}
#[test]
fn simple_success_flow() {
let (tmp, mut cmd) = pend_with_tempdir();
let pend_path = assert_cmd::cargo::cargo_bin("pend");
cmd.args(["do", "okjob", pend_path.to_str().unwrap(), "--version"])
.assert()
.success();
pend_bin()
.env("PEND_DIR", tmp.path())
.args(["wait", "okjob"])
.assert()
.stdout(predicate::str::contains(env!("CARGO_PKG_VERSION")))
.success();
}
#[test]
fn propagates_failure_exit_code() {
let (tmp, mut cmd) = pend_with_tempdir();
let pend_path = assert_cmd::cargo::cargo_bin("pend");
cmd.args([
"do",
"failjob",
pend_path.to_str().unwrap(),
"--invalid-flag",
])
.assert()
.success();
pend_bin()
.env("PEND_DIR", tmp.path())
.args(["wait", "failjob"])
.assert()
.code(2)
.failure();
}
#[test]
fn dir_flag_overrides_env() {
let env_dir = TempDir::new().unwrap();
let flag_dir = TempDir::new().unwrap();
let pend_path = assert_cmd::cargo::cargo_bin("pend");
Command::new(&pend_path)
.env("PEND_DIR", env_dir.path())
.args([
"--dir",
flag_dir.path().to_str().unwrap(),
"do",
"flagjob",
"bash",
"-c",
"echo fromflag",
])
.assert()
.success();
Command::new(&pend_path)
.env("PEND_DIR", env_dir.path())
.args([
"--dir",
flag_dir.path().to_str().unwrap(),
"wait",
"flagjob",
])
.assert()
.success()
.stdout(predicate::str::contains("fromflag"));
assert!(flag_dir.path().join("flagjob.out").exists());
assert!(!env_dir.path().join("flagjob.out").exists());
}
#[test]
fn multi_job_interleaved_wait() {
let (tmp, _) = pend_with_tempdir();
let pend_path = assert_cmd::cargo::cargo_bin("pend");
Command::new(&pend_path)
.env("PEND_DIR", tmp.path())
.args([
"do",
"failfast",
"bash",
"-c",
"echo failfast-start && exit 2",
])
.assert()
.success();
Command::new(&pend_path)
.env("PEND_DIR", tmp.path())
.args([
"do",
"slowok",
"bash",
"-c",
"echo slowok-start && sleep 0.2 && echo slowok-end",
])
.assert()
.success();
Command::new(&pend_path)
.env("PEND_DIR", tmp.path())
.args(["--no-color", "wait", "failfast", "slowok"])
.assert()
.stdout(predicate::str::contains("failfast-start"))
.stdout(predicate::str::contains("slowok-start"))
.stdout(predicate::str::contains("slowok-end"))
.code(2)
.failure();
}