//! 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}"), } } }