#[ cfg( feature = "rate_limiting" ) ]
mod rate_limiting_integration_tests
{
use api_openai::
{
Client,
ClientApiAccessors,
environment ::{ OpenaiEnvironmentImpl, OpenAIRecommended },
secret ::Secret,
enhanced_rate_limiting ::{ EnhancedRateLimitingConfig, RateLimitingAlgorithm },
};
use core::time::Duration;
use tokio::time::sleep;
fn create_test_client_with_rate_limiting() -> Result< Client< OpenaiEnvironmentImpl >, Box< dyn std::error::Error > >
{
let secret = Secret::new( "sk-test-key-rate-limiting".to_string() )?;
let environment = OpenaiEnvironmentImpl::build(
secret,
None,
None,
OpenAIRecommended::base_url().to_string(),
OpenAIRecommended::realtime_base_url().to_string()
)?;
let rate_limiting_config = EnhancedRateLimitingConfig::new()
.with_max_requests( 2 ) .with_window_duration( 1000 ) .with_algorithm( RateLimitingAlgorithm::TokenBucket )
.with_burst_capacity( 2 );
let client = Client::build( environment )?
.with_rate_limiting_config( rate_limiting_config );
Ok( client )
}
#[ tokio::test ]
async fn test_rate_limiting_integration_with_client()
{
let client = create_test_client_with_rate_limiting().expect( "Failed to create test client" );
assert!( client.rate_limiting_config().is_some() );
let config = client.rate_limiting_config().unwrap();
assert_eq!( config.max_requests, 2 );
assert_eq!( config.window_duration_ms, 1000 );
assert_eq!( config.burst_capacity, 2 );
assert_eq!( config.algorithm, RateLimitingAlgorithm::TokenBucket );
}
#[ tokio::test ]
async fn test_rate_limiting_with_multiple_requests()
{
let client = create_test_client_with_rate_limiting().expect( "Failed to create test client" );
let result1 = client.models().list().await;
assert!( result1.is_err() );
let result2 = client.models().list().await;
assert!( result2.is_err() );
let result3 = client.models().list().await;
assert!( result3.is_err() );
sleep( Duration::from_millis( 1100 ) ).await;
let result4 = client.models().list().await;
assert!( result4.is_err() ); }
#[ tokio::test ]
async fn test_rate_limiting_zero_overhead_when_not_configured()
{
let secret = Secret::new( "sk-test-key-no-rate-limiting".to_string() ).unwrap();
let environment = OpenaiEnvironmentImpl::build(
secret,
None,
None,
OpenAIRecommended::base_url().to_string(),
OpenAIRecommended::realtime_base_url().to_string()
).unwrap();
let client = Client::build( environment ).unwrap();
assert!( client.rate_limiting_config().is_none() );
let result = client.models().list().await;
assert!( result.is_err() );
for _ in 0..5
{
let result = client.models().list().await;
assert!( result.is_err() );
}
}
#[ tokio::test ]
async fn test_rate_limiting_config_validation()
{
let secret = Secret::new( "sk-test-key".to_string() ).unwrap();
let environment = OpenaiEnvironmentImpl::build(
secret,
None,
None,
OpenAIRecommended::base_url().to_string(),
OpenAIRecommended::realtime_base_url().to_string()
).unwrap();
let invalid_config = EnhancedRateLimitingConfig::new()
.with_max_requests( 0 );
let client = Client::build( environment ).unwrap()
.with_rate_limiting_config( invalid_config );
assert!( client.rate_limiting_config().is_some() );
}
#[ tokio::test ]
async fn test_rate_limiting_sliding_window_algorithm()
{
let secret = Secret::new( "sk-test-key-sliding-window".to_string() ).unwrap();
let environment = OpenaiEnvironmentImpl::build(
secret,
None,
None,
OpenAIRecommended::base_url().to_string(),
OpenAIRecommended::realtime_base_url().to_string()
).unwrap();
let rate_limiting_config = EnhancedRateLimitingConfig::new()
.with_max_requests( 3 )
.with_window_duration( 2000 ) .with_algorithm( RateLimitingAlgorithm::SlidingWindow );
let client = Client::build( environment ).unwrap()
.with_rate_limiting_config( rate_limiting_config );
let config = client.rate_limiting_config().unwrap();
assert_eq!( config.algorithm, RateLimitingAlgorithm::SlidingWindow );
assert_eq!( config.max_requests, 3 );
assert_eq!( config.window_duration_ms, 2000 );
for _i in 0..3
{
let result = client.models().list().await;
assert!( result.is_err() ); }
let result = client.models().list().await;
assert!( result.is_err() );
}
}
#[ cfg( not( feature = "rate_limiting" ) ) ]
mod no_rate_limiting_integration_tests
{
use api_openai::
{
Client,
environment ::{ OpenaiEnvironmentImpl, OpenAIRecommended },
secret ::Secret,
};
#[ tokio::test ]
async fn test_zero_overhead_when_rate_limiting_feature_disabled()
{
let secret = Secret::new( "sk-test-key".to_string() ).unwrap();
let environment = OpenaiEnvironmentImpl::build(
secret,
None,
None,
OpenAIRecommended::base_url().to_string(),
OpenAIRecommended::realtime_base_url().to_string()
).unwrap();
let client = Client::build( environment ).unwrap();
let result = client.models().list().await;
assert!( result.is_err() ); }
}