use start_command::{docker_pull_image, get_default_docker_image, is_command_available};
#[test]
fn test_get_default_docker_image() {
let image = get_default_docker_image();
assert!(!image.is_empty());
assert!(image.contains(':'), "Image should have a tag");
let valid_chars =
|c: char| c.is_alphanumeric() || c == '-' || c == '_' || c == '/' || c == ':' || c == '.';
assert!(
image.chars().all(valid_chars),
"Image name should contain valid characters"
);
}
#[test]
fn test_get_default_docker_image_returns_known_images() {
let image = get_default_docker_image();
let known_images = [
"alpine:latest",
"ubuntu:latest",
"debian:latest",
"archlinux:latest",
"fedora:latest",
"centos:latest",
];
assert!(
known_images.contains(&image.as_str()),
"Image '{}' should be one of the known base images: {:?}",
image,
known_images
);
}
#[test]
fn test_docker_pull_image_records_prep_phase_in_log() {
if !is_command_available("docker") {
eprintln!(" Skipping: docker not installed");
return;
}
let log_path = std::env::temp_dir().join(format!(
"start-138-rust-{}-{}.log",
std::process::id(),
std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.map(|d| d.as_nanos())
.unwrap_or(0)
));
std::fs::write(&log_path, "=== Start Command Log ===\n").unwrap();
let (success, _output) = docker_pull_image("invalid..badname", Some(&log_path));
let contents = std::fs::read_to_string(&log_path).unwrap();
let _ = std::fs::remove_file(&log_path);
assert!(!success, "pull of an invalid reference must fail");
assert!(
contents.contains("Preparing image invalid..badname"),
"log must contain the \"Preparing image …\" start marker, got:\n{}",
contents
);
assert!(
contents.contains("Image preparation failed"),
"log must contain the failure marker with elapsed duration, got:\n{}",
contents
);
}
#[test]
fn test_docker_pull_image_without_log_path() {
if !is_command_available("docker") {
eprintln!(" Skipping: docker not installed");
return;
}
let (success, output) = docker_pull_image("invalid..badname", None);
assert!(!success);
let _ = output; }