use docker_wrapper::prerequisites::ensure_docker;
use docker_wrapper::DockerCommand;
use docker_wrapper::RunCommand;
use std::time::Duration;
use tokio::time::sleep;
async fn ensure_docker_or_skip() {
match ensure_docker().await {
Ok(_) => {}
Err(_) => {
println!("Docker not available - skipping integration test");
}
}
}
#[tokio::test]
async fn test_run_simple_container() {
ensure_docker_or_skip().await;
let run_cmd = RunCommand::new("alpine:latest")
.cmd(vec!["echo".to_string(), "hello world".to_string()])
.remove();
match run_cmd.execute().await {
Ok(container_id) => {
println!("Container ran successfully: {}", container_id.short());
assert!(!container_id.0.is_empty());
}
Err(e) => {
println!("Integration test failed (this may be expected in CI): {e}");
}
}
}
#[tokio::test]
async fn test_run_detached_container() {
ensure_docker_or_skip().await;
let run_cmd = RunCommand::new("alpine:latest")
.cmd(vec!["sleep".to_string(), "2".to_string()])
.detach()
.remove();
match run_cmd.execute().await {
Ok(container_id) => {
println!("Detached container started: {}", container_id.short());
assert!(!container_id.0.is_empty());
sleep(Duration::from_millis(500)).await;
}
Err(e) => {
println!("Detached container test failed (this may be expected in CI): {e}");
}
}
}
#[tokio::test]
async fn test_run_with_environment() {
ensure_docker_or_skip().await;
let run_cmd = RunCommand::new("alpine:latest")
.env("TEST_VAR", "test_value")
.cmd(vec![
"sh".to_string(),
"-c".to_string(),
"echo $TEST_VAR".to_string(),
])
.remove();
match run_cmd.execute().await {
Ok(container_id) => {
println!("Container with environment ran: {}", container_id.short());
assert!(!container_id.0.is_empty());
}
Err(e) => {
println!("Environment test failed (this may be expected in CI): {e}");
}
}
}
#[tokio::test]
async fn test_run_command_validation() {
let run_cmd = RunCommand::new("nginx:alpine")
.name("test-nginx")
.port(8080, 80)
.env("ENV_VAR", "value")
.detach();
let args = run_cmd.build_command_args();
assert!(args.contains(&"--name".to_string()));
assert!(args.contains(&"test-nginx".to_string()));
assert!(args.contains(&"--publish".to_string()));
assert!(args.contains(&"8080:80".to_string()));
assert!(args.contains(&"--env".to_string()));
assert!(args.contains(&"ENV_VAR=value".to_string()));
assert!(args.contains(&"--detach".to_string()));
assert!(args.contains(&"nginx:alpine".to_string()));
}
#[tokio::test]
async fn test_docker_prerequisites() {
match ensure_docker().await {
Ok(info) => {
println!("Docker available: {}", info.version.version);
assert!(!info.version.version.is_empty());
}
Err(e) => {
println!("Docker prerequisites check failed: {e}");
}
}
}