use std::process::Command;
const BIN: &str = env!("CARGO_BIN_EXE_alembic-adapter-test");
fn manifest(rel: &str) -> String {
format!("{}/{}", env!("CARGO_MANIFEST_DIR"), rel)
}
fn python3_available() -> bool {
Command::new("python3").arg("--version").output().is_ok()
}
#[test]
fn passes_against_the_python_example() {
if !python3_available() {
eprintln!("skipping passes_against_the_python_example: python3 not found");
return;
}
let out = Command::new(BIN)
.args(["--cases", &manifest("examples/cases"), "--", "python3"])
.arg(manifest("examples/adapter.py"))
.output()
.expect("run binary");
let stdout = String::from_utf8_lossy(&out.stdout);
assert!(
out.status.success(),
"expected exit 0, got {}\n{stdout}",
out.status
);
assert!(stdout.contains("protocol/read-empty"), "{stdout}");
assert!(stdout.contains("passed"), "{stdout}");
}
#[test]
fn reports_a_failing_adapter_and_exits_1() {
let out = Command::new(BIN)
.args(["--", "sh", "-c", "echo noise; echo boom >&2; exit 1"])
.output()
.expect("run binary");
assert_eq!(out.status.code(), Some(1));
let stdout = String::from_utf8_lossy(&out.stdout);
assert!(stdout.contains("FAILED"), "{stdout}");
assert!(stdout.contains("noise"), "{stdout}");
assert!(stdout.contains("failed"), "{stdout}");
}
#[test]
fn unreadable_cases_path_exits_2() {
let out = Command::new(BIN)
.args(["--cases", "/no/such/cases", "--", "sh", "-c", "true"])
.output()
.expect("run binary");
assert_eq!(out.status.code(), Some(2));
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(stderr.contains("error:"), "{stderr}");
}
#[test]
fn missing_adapter_argument_exits_2() {
let out = Command::new(BIN).output().expect("run binary");
assert_eq!(out.status.code(), Some(2));
}