use sal_virt::buildah::{BuildahError, Builder}; /// Tests Buildah builder creation and property validation /// /// This test verifies that: /// - Builder is created with correct initial state /// - Properties are accessible and correct /// - Debug mode defaults to false /// - Container ID handling works properly #[test] fn test_builder_creation_and_properties() { let result = Builder::new("test-container", "alpine:latest"); match result { Ok(builder) => { // Validate builder properties are correctly set assert_eq!(builder.name(), "test-container"); assert_eq!(builder.image(), "alpine:latest"); assert!(!builder.debug()); // Container ID should be set if buildah is available // (it will be Some(container_id) if buildah created a container) assert!(builder.container_id().is_some() || builder.container_id().is_none()); println!("✓ Buildah is available - builder created successfully"); if let Some(container_id) = builder.container_id() { assert!(!container_id.is_empty()); println!("✓ Container ID: {}", container_id); } } Err(BuildahError::CommandExecutionFailed(_)) => { // Expected in CI/test environments without buildah println!("⚠️ Buildah not available - test environment detected"); } Err(e) => { // Use proper test assertion for unexpected errors assert!( false, "Unexpected error type: {:?}. Expected CommandExecutionFailed or success.", e ); } } } /// Tests Buildah builder debug mode functionality /// /// This test verifies that: /// - Debug mode defaults to false /// - Debug mode can be toggled /// - set_debug returns mutable reference for chaining /// - Debug state is properly maintained #[test] fn test_builder_debug_mode_functionality() { let result = Builder::new("test-debug-container", "alpine:latest"); match result { Ok(mut builder) => { // Test initial debug state assert!(!builder.debug()); // Test enabling debug mode builder.set_debug(true); assert!(builder.debug()); // Test disabling debug mode builder.set_debug(false); assert!(!builder.debug()); // Test method chaining capability builder.set_debug(true).set_debug(false); assert!(!builder.debug()); // Test that set_debug returns the builder for chaining let final_state = builder.set_debug(true).debug(); assert!(final_state); println!("✓ Debug mode functionality verified"); } Err(BuildahError::CommandExecutionFailed(_)) => { // Expected in CI/test environments without buildah println!("⚠️ Buildah not available - test environment detected"); } Err(e) => { // Use proper test assertion for unexpected errors assert!( false, "Unexpected error type: {:?}. Expected CommandExecutionFailed or success.", e ); } } } #[test] fn test_builder_properties() { let result = Builder::new("my-test-container", "ubuntu:20.04"); match result { Ok(builder) => { assert_eq!(builder.name(), "my-test-container"); assert_eq!(builder.image(), "ubuntu:20.04"); // Container ID should be set if buildah successfully created container // Note: This assertion is flexible to handle both cases assert!(builder.container_id().is_some() || builder.container_id().is_none()); } Err(BuildahError::CommandExecutionFailed(_)) => { // Buildah not available - this is expected in CI/test environments println!("Buildah not available - skipping test"); } Err(e) => { // Use proper test assertion instead of panic assert!( false, "Unexpected error type: {:?}. Expected CommandExecutionFailed or success.", e ); } } } /// Tests Buildah error type handling and formatting /// /// This test verifies that: /// - Error types are properly constructed /// - Error messages are formatted correctly /// - Error types implement Display trait properly /// - Error categorization works as expected #[test] fn test_buildah_error_types_and_formatting() { // Test CommandFailed error let cmd_error = BuildahError::CommandFailed("Test command failed".to_string()); assert!(matches!(cmd_error, BuildahError::CommandFailed(_))); let cmd_error_msg = format!("{}", cmd_error); assert!(cmd_error_msg.contains("Test command failed")); assert!(!cmd_error_msg.is_empty()); // Test Other error let other_error = BuildahError::Other("Generic error occurred".to_string()); assert!(matches!(other_error, BuildahError::Other(_))); let other_error_msg = format!("{}", other_error); assert!(other_error_msg.contains("Generic error occurred")); // Test ConversionError let conv_error = BuildahError::ConversionError("Failed to convert data".to_string()); assert!(matches!(conv_error, BuildahError::ConversionError(_))); let conv_error_msg = format!("{}", conv_error); assert!(conv_error_msg.contains("Failed to convert data")); // Test JsonParseError let json_error = BuildahError::JsonParseError("Invalid JSON format".to_string()); assert!(matches!(json_error, BuildahError::JsonParseError(_))); let json_error_msg = format!("{}", json_error); assert!(json_error_msg.contains("Invalid JSON format")); } #[test] fn test_builder_static_methods() { // Test static methods that don't require a container // These should work even if buildah is not available (they'll just fail gracefully) // Test images listing let images_result = Builder::images(); match images_result { Ok(_images) => { // If buildah is available, we should get a list (possibly empty) println!("Buildah is available - images list retrieved"); } Err(BuildahError::CommandExecutionFailed(_)) => { // Buildah not available - this is expected in CI/test environments println!("Buildah not available - skipping images test"); } Err(e) => { // Other errors might indicate buildah is available but something else went wrong println!("Buildah error (expected in test environment): {:?}", e); } } }