#[ cfg( feature = "retry" ) ]
mod retry_error_handling_tests
{
use crate::enhanced_retry_helpers::*;
use api_openai::error::OpenAIError;
#[ tokio::test ]
async fn test_error_classification_retryable()
{
let config = EnhancedRetryConfig::default();
let network_error = OpenAIError::Network( "Connection failed".to_string() );
assert!( config.is_retryable_error( &network_error ) );
let timeout_error = OpenAIError::Timeout( "Request timeout".to_string() );
assert!( config.is_retryable_error( &timeout_error ) );
let server_error = OpenAIError::Http( "HTTP error with status 500: Internal Server Error".to_string() );
assert!( config.is_retryable_error( &server_error ) );
let rate_limit_error = OpenAIError::Http( "HTTP error with status 429: Rate limit exceeded".to_string() );
assert!( config.is_retryable_error( &rate_limit_error ) );
let rate_limit_direct = OpenAIError::RateLimit( "Rate limit exceeded".to_string() );
assert!( config.is_retryable_error( &rate_limit_direct ) );
}
#[ tokio::test ]
async fn test_error_classification_non_retryable()
{
let config = EnhancedRetryConfig::default();
let api_error = OpenAIError::Internal( "Invalid API key".to_string() );
assert!( !config.is_retryable_error( &api_error ) );
let validation_error = OpenAIError::InvalidArgument( "Invalid request".to_string() );
assert!( !config.is_retryable_error( &validation_error ) );
let parse_error = OpenAIError::Internal( "JSON parse error".to_string() );
assert!( !config.is_retryable_error( &parse_error ) );
let config_error = OpenAIError::MissingArgument( "Missing required field".to_string() );
assert!( !config.is_retryable_error( &config_error ) );
let client_error = OpenAIError::Http( "HTTP error with status 400: Bad Request".to_string() );
assert!( !config.is_retryable_error( &client_error ) );
let not_found_error = OpenAIError::Http( "HTTP error with status 404: Not Found".to_string() );
assert!( !config.is_retryable_error( ¬_found_error ) );
}
}