#![allow(clippy::unwrap_used, clippy::expect_used)]
use assert_cmd::Command;
use std::fs;
use tempfile::TempDir;
fn create_test_dir() -> TempDir {
let temp_dir = tempfile::Builder::new()
.prefix("cuenv_test_")
.tempdir()
.expect("Failed to create temp directory");
let path = temp_dir.path();
fs::create_dir_all(path.join("cue.mod")).unwrap();
fs::write(
path.join("cue.mod/module.cue"),
"module: \"test.example/hooks\"\nlanguage: version: \"v0.9.0\"\n",
)
.unwrap();
temp_dir
}
#[test]
fn test_exec_waits_for_hooks() {
let temp_dir = create_test_dir();
let path = temp_dir.path();
let cue_content = r#"
package cuenv
name: "test"
hooks: {
onEnter: {
slow_hook: {
command: "sh"
args: ["-c", "sleep 0.1 && echo export HOOK_VAR=success"]
source: true
}
}
}
"#;
fs::write(path.join("env.cue"), cue_content).unwrap();
let cuenv_bin = env!("CARGO_BIN_EXE_cuenv");
#[allow(deprecated)]
let mut cmd = Command::cargo_bin("cuenv").unwrap();
let allow_output = cmd
.current_dir(path)
.env("CUENV_EXECUTABLE", cuenv_bin) .arg("allow")
.arg("--yes")
.output()
.unwrap();
if allow_output.status.code() == Some(3) {
let stderr = String::from_utf8_lossy(&allow_output.stderr);
assert!(
stderr.contains("Evaluation/FFI error") || stderr.contains("Unexpected error"),
"Expected FFI or Unexpected error in sandbox during allow, got: {stderr}"
);
return; }
assert!(
allow_output.status.success(),
"cuenv allow failed: {}",
String::from_utf8_lossy(&allow_output.stderr)
);
#[allow(deprecated)]
let mut cmd = Command::cargo_bin("cuenv").unwrap();
let output = cmd.current_dir(path)
.env("CUENV_EXECUTABLE", cuenv_bin) .arg("exec")
.arg("--")
.arg("sh")
.arg("-c")
.arg("if [ \"$HOOK_VAR\" = \"success\" ]; then echo FOUND; exit 0; else echo MISSING; exit 1; fi")
.output()
.unwrap();
if output.status.code() == Some(3) {
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stderr.contains("Evaluation/FFI error") || stderr.contains("Unexpected error"),
"Expected FFI or Unexpected error in sandbox, got: {stderr}"
);
} else {
assert!(
output.status.success(),
"Command failed: stdout={}, stderr={}",
String::from_utf8_lossy(&output.stdout),
String::from_utf8_lossy(&output.stderr)
);
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(
stdout.contains("FOUND"),
"Expected FOUND in stdout, got: {stdout}"
);
}
}