use docker_wrapper::command::volume::{
VolumeCreateCommand, VolumeInspectCommand, VolumeLsCommand, VolumePruneCommand, VolumeRmCommand,
};
use docker_wrapper::DockerCommand;
#[tokio::test]
async fn test_volume_lifecycle() {
let volume_name = format!("test-volume-{}", uuid::Uuid::new_v4());
let create_result = VolumeCreateCommand::new()
.name(&volume_name)
.label("test", "integration")
.execute()
.await;
if create_result.is_err() {
eprintln!("Skipping test - Docker not available");
return;
}
let create_output = create_result.unwrap();
assert!(create_output.stdout.contains(&volume_name));
let ls_result = VolumeLsCommand::new()
.filter("name", &volume_name)
.execute()
.await
.unwrap();
assert!(ls_result.stdout.contains(&volume_name));
let inspect_result = VolumeInspectCommand::new(&volume_name)
.execute()
.await
.unwrap();
assert!(inspect_result.stdout.contains(&volume_name));
let rm_result = VolumeRmCommand::new(&volume_name).execute().await.unwrap();
assert_eq!(rm_result.exit_code, 0);
}
#[tokio::test]
async fn test_volume_create_with_options() {
let volume_name = format!("test-volume-opts-{}", uuid::Uuid::new_v4());
let create_cmd = VolumeCreateCommand::new()
.name(&volume_name)
.driver("local")
.driver_opt("type", "tmpfs")
.driver_opt("device", "tmpfs")
.driver_opt("o", "size=100m")
.label("environment", "test")
.label("version", "1.0");
let args = create_cmd.build_command_args();
assert!(args.contains(&"volume".to_string()));
assert!(args.contains(&"create".to_string()));
assert!(args.contains(&"--driver".to_string()));
assert!(args.contains(&"local".to_string()));
assert!(args.contains(&"--opt".to_string()));
assert!(args.contains(&volume_name));
if create_cmd.execute().await.is_ok() {
let _ = VolumeRmCommand::new(&volume_name).execute().await;
}
}
#[tokio::test]
async fn test_volume_ls_with_filters() {
let ls_cmd = VolumeLsCommand::new()
.filter("driver", "local")
.filter("label", "test")
.quiet()
.format("table {{.Name}}\t{{.Driver}}");
let args = ls_cmd.build_command_args();
assert!(args.contains(&"volume".to_string()));
assert!(args.contains(&"ls".to_string()));
assert!(args.contains(&"--filter".to_string()));
assert!(args.contains(&"driver=local".to_string()));
assert!(args.contains(&"--quiet".to_string()));
assert!(args.contains(&"--format".to_string()));
}
#[tokio::test]
async fn test_volume_inspect_format() {
let inspect_cmd = VolumeInspectCommand::new("volume1").format("{{.Name}}: {{.Driver}}");
let args = inspect_cmd.build_command_args();
assert!(args.contains(&"volume".to_string()));
assert!(args.contains(&"inspect".to_string()));
assert!(args.contains(&"--format".to_string()));
assert!(args.contains(&"volume1".to_string()));
}
#[tokio::test]
async fn test_volume_rm_multiple() {
let rm_cmd = VolumeRmCommand::new("volume1")
.add_volume("volume2")
.force();
let args = rm_cmd.build_command_args();
assert!(args.contains(&"volume".to_string()));
assert!(args.contains(&"rm".to_string()));
assert!(args.contains(&"--force".to_string()));
assert!(args.contains(&"volume1".to_string()));
assert!(args.contains(&"volume2".to_string()));
}
#[tokio::test]
async fn test_volume_prune() {
let prune_cmd = VolumePruneCommand::new()
.force()
.all()
.filter("label", "test");
let args = prune_cmd.build_command_args();
assert!(args.contains(&"volume".to_string()));
assert!(args.contains(&"prune".to_string()));
assert!(args.contains(&"--force".to_string()));
assert!(args.contains(&"--all".to_string()));
assert!(args.contains(&"--filter".to_string()));
assert!(args.contains(&"label=test".to_string()));
}
#[tokio::test]
async fn test_volume_create_and_use() {
let volume_name = format!("test-volume-use-{}", uuid::Uuid::new_v4());
if VolumeCreateCommand::new()
.name(&volume_name)
.execute()
.await
.is_ok()
{
let ls_result = VolumeLsCommand::new().quiet().execute().await.unwrap();
assert!(ls_result.stdout.contains(&volume_name));
let _ = VolumeRmCommand::new(&volume_name).execute().await;
}
}
#[cfg(test)]
mod uuid {
pub struct Uuid;
impl Uuid {
pub fn new_v4() -> String {
format!(
"{:x}",
std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_secs()
)
}
}
}