fn fixture(name: &str) -> String {
let manifest_dir = env!("CARGO_MANIFEST_DIR");
format!("{}/tests/fixtures/{}", manifest_dir, name)
}
#[test]
fn check_python_not_installed_when_path_is_empty() {
let tmp = TempDir::new().unwrap();
let mut cmd = Command::cargo_bin("schemalint").unwrap();
cmd.current_dir(tmp.path());
cmd.env("PATH", tmp.path());
let output = cmd
.args([
"check-python",
"--package",
"myapp.models",
"--profile",
"openai.so.2026-04-30",
])
.output()
.unwrap();
assert!(
!output.status.success(),
"exit code should be 1 when python is not found"
);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stderr.contains("python interpreter not found"),
"expected NotInstalled message, got:\n{stderr}"
);
assert!(
stderr.contains("python3") && stderr.contains("python"),
"expected candidate list in error, got:\n{stderr}"
);
}
#[test]
#[cfg(unix)]
fn check_python_fake_sidecar_discover_failed_few_stderr_lines() {
let script = fixture("fake_discover_error_few_stderr.sh");
let mut cmd = Command::cargo_bin("schemalint").unwrap();
let output = cmd
.args([
"check-python",
"--package",
"myapp.models",
"--profile",
"openai.so.2026-04-30",
"--python-path",
&script,
])
.output()
.unwrap();
assert!(
!output.status.success(),
"exit code should be 1 when discover fails"
);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stderr.contains("fake short-stderr discovery error"),
"expected fake DiscoverFailed message, got:\n{stderr}"
);
}
#[test]
#[cfg(unix)]
fn check_python_fake_sidecar_invalid_response_many_stderr_lines() {
let script = fixture("fake_invalid_response.sh");
let mut cmd = Command::cargo_bin("schemalint").unwrap();
let output = cmd
.args([
"check-python",
"--package",
"myapp.models",
"--profile",
"openai.so.2026-04-30",
"--python-path",
&script,
])
.output()
.unwrap();
assert!(
!output.status.success(),
"exit code should be 1 on invalid response"
);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stderr.contains("invalid response from python helper"),
"expected InvalidResponse error, got:\n{stderr}"
);
assert!(
stderr.contains("response parse error"),
"expected parse error detail, got:\n{stderr}"
);
}
#[test]
#[cfg(unix)]
fn check_python_fake_sidecar_discover_failed_with_stderr() {
let script = fixture("fake_discover_error.sh");
let mut cmd = Command::cargo_bin("schemalint").unwrap();
let output = cmd
.args([
"check-python",
"--package",
"myapp.models",
"--profile",
"openai.so.2026-04-30",
"--python-path",
&script,
])
.output()
.unwrap();
assert!(
!output.status.success(),
"exit code should be 1 on discovery failure"
);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stderr.contains("fake discovery failure: module not found"),
"expected fake DiscoverFailed message, got:\n{stderr}"
);
assert!(
stderr.contains("discovery failed for package"),
"expected 'discovery failed for package' framing, got:\n{stderr}"
);
}