#[cfg(test)]
mod tests {
use crate::*;
use alloy_primitives::address;
use std::time::Duration;
#[tokio::test]
async fn test_odos_sor_with_custom_config() {
let config = ClientConfig {
timeout: Duration::from_secs(10),
retry_config: RetryConfig {
max_retries: 2,
..Default::default()
},
..Default::default()
};
let sor_client = OdosClient::with_config(config).expect("Failed to create SOR client");
assert_eq!(sor_client.config().timeout, Duration::from_secs(10));
assert_eq!(sor_client.config().retry_config.max_retries, 2);
}
#[tokio::test]
async fn test_odos_sor_default() {
let sor_client = OdosClient::new().expect("Failed to create default SOR client");
assert_eq!(sor_client.config().timeout, Duration::from_secs(30));
assert_eq!(sor_client.config().retry_config.max_retries, 3);
}
#[test]
fn test_error_type_conversions() {
let api_error = OdosError::api_error(
reqwest::StatusCode::BAD_REQUEST,
"Invalid request".to_string(),
);
assert_eq!(api_error.category(), "api");
assert!(!api_error.is_retryable());
let timeout_error = OdosError::timeout_error("Request timed out");
assert_eq!(timeout_error.category(), "timeout");
assert!(timeout_error.is_retryable());
let rate_limit_error = OdosError::rate_limit_error("Too many requests");
assert_eq!(rate_limit_error.category(), "rate_limit");
assert!(!rate_limit_error.is_retryable());
}
#[test]
fn test_error_creation_and_classification() {
let missing_data_err = OdosError::missing_data("Test missing data");
assert_eq!(missing_data_err.category(), "missing_data");
assert!(!missing_data_err.is_retryable());
let invalid_input_err = OdosError::invalid_input("Test invalid input");
assert_eq!(invalid_input_err.category(), "invalid_input");
assert!(!invalid_input_err.is_retryable());
let contract_err = OdosError::contract_error("Test contract error");
assert_eq!(contract_err.category(), "contract");
assert!(!contract_err.is_retryable());
let assembly_err = OdosError::transaction_assembly_error("Test assembly error");
assert_eq!(assembly_err.category(), "transaction_assembly");
assert!(!assembly_err.is_retryable());
}
#[test]
fn test_quote_request_builder() {
use alloy_primitives::{Address, U256};
let input_token = InputToken::new(Address::ZERO, U256::from(1000));
let output_token = OutputToken::new(Address::ZERO, 1);
let quote_request = QuoteRequest::builder()
.chain_id(1)
.input_tokens(vec![input_token])
.output_tokens(vec![output_token])
.slippage_limit_percent(1.0)
.user_addr(address!("742d35Cc6634C0532925a3b8D35f3e7a5edD29c0"))
.compact(false)
.simple(false)
.referral_code(0)
.disable_rfqs(false)
.build();
let _validated_request = quote_request;
}
#[test]
fn test_error_retryability_logic() {
let timeout_err = OdosError::timeout_error("Timeout");
assert!(timeout_err.is_retryable());
let rate_limit_err = OdosError::rate_limit_error("Rate limited");
assert!(!rate_limit_err.is_retryable());
let server_error = OdosError::api_error(
reqwest::StatusCode::INTERNAL_SERVER_ERROR,
"Server error".to_string(),
);
assert!(server_error.is_retryable());
let bad_request =
OdosError::api_error(reqwest::StatusCode::BAD_REQUEST, "Bad request".to_string());
assert!(!bad_request.is_retryable());
let too_many_requests = OdosError::rate_limit_error("Rate limited");
assert!(!too_many_requests.is_retryable());
let invalid_input = OdosError::invalid_input("Bad input");
assert!(!invalid_input.is_retryable());
let missing_data = OdosError::missing_data("Missing data");
assert!(!missing_data.is_retryable());
}
}