Files

81 lines
2.0 KiB
Rust

//! Integration tests for the `envdiff` command.
use std::fs;
use std::path::PathBuf;
use std::sync::atomic::{AtomicU64, Ordering};
use assert_cmd::Command;
use predicates::prelude::*;
fn cargo_command() -> Command {
Command::cargo_bin("envdiff").expect("binary")
}
struct TempTestDir {
path: PathBuf,
}
impl TempTestDir {
fn path(&self) -> &std::path::Path {
&self.path
}
}
impl Drop for TempTestDir {
fn drop(&mut self) {
let _ = fs::remove_dir_all(&self.path);
}
}
#[test]
fn runs_cmd_and_reports_environment_diff_as_json() {
let temp = unique_temp_dir();
let script = temp.path().join("mutate.cmd");
fs::write(
&script,
"@echo off\r\nset TEST_FLAG=enabled\r\nset PATH=%PATH%;C:\\Mercury\\Bin\r\n",
)
.expect("script");
let mut command = cargo_command();
command
.arg("run")
.arg("--json")
.arg("--shell")
.arg("cmd")
.arg("--")
.arg(&script)
.assert()
.success()
.stdout(predicate::str::contains("\"added\""))
.stdout(predicate::str::contains("\"name\":\"TEST_FLAG\""))
.stdout(predicate::str::contains("\"path_like_changes\""));
}
#[test]
fn help_includes_envdiff_examples() {
let mut command = cargo_command();
command
.arg("--help")
.assert()
.success()
.stdout(predicate::str::contains("snapshot"))
.stdout(predicate::str::contains("run --shell cmd"))
.stdout(predicate::str::contains("ConvertFrom-Json"));
}
fn unique_temp_dir() -> TempTestDir {
static NEXT_ID: AtomicU64 = AtomicU64::new(0);
loop {
let unique = NEXT_ID.fetch_add(1, Ordering::Relaxed);
let path =
std::env::temp_dir().join(format!("envdiff-test-{}-{unique}", std::process::id()));
match fs::create_dir(&path) {
Ok(()) => return TempTestDir { path },
Err(error) if error.kind() == std::io::ErrorKind::AlreadyExists => {}
Err(error) => panic!("tempdir: {error}"),
}
}
}