#[cfg(test)]
mod tests {
use atelier_data::clients::http::http_client::{HttpClient, HttpClientBuilder};
use atelier_data::exchanges::Exchange;
use async_rate_limiter::RateLimiter;
use reqwest::Client;
use std::time::Duration;
fn test_rate_limiter() -> RateLimiter {
RateLimiter::new(10)
}
fn assert_build_err(result: Result<HttpClient, String>, expected_substr: &str) {
let Err(err) = result else {
panic!("expected build() to fail with '{expected_substr}', but it succeeded");
};
assert!(
err.to_lowercase().contains(&expected_substr.to_lowercase()),
"error message should mention '{expected_substr}', got: {err}",
);
}
#[test]
fn test_http_builder_missing_client_errors() {
let result = HttpClientBuilder::new()
.exchange(Exchange::Bybit)
.rate_limiter(test_rate_limiter())
.base_url("https://api.bybit.com".into())
.timeout(Duration::from_secs(5))
.build();
assert_build_err(result, "client");
}
#[test]
fn test_http_builder_missing_exchange_errors() {
let result = HttpClientBuilder::new()
.client(Client::new())
.rate_limiter(test_rate_limiter())
.base_url("https://api.bybit.com".into())
.timeout(Duration::from_secs(5))
.build();
assert_build_err(result, "exchange");
}
#[test]
fn test_http_builder_missing_rate_limiter_errors() {
let result = HttpClientBuilder::new()
.client(Client::new())
.exchange(Exchange::Bybit)
.base_url("https://api.bybit.com".into())
.timeout(Duration::from_secs(5))
.build();
assert_build_err(result, "rate_limiter");
}
#[test]
fn test_http_builder_missing_base_url_errors() {
let result = HttpClientBuilder::new()
.client(Client::new())
.exchange(Exchange::Bybit)
.rate_limiter(test_rate_limiter())
.timeout(Duration::from_secs(5))
.build();
assert_build_err(result, "base_url");
}
#[test]
fn test_http_builder_missing_timeout_errors() {
let result = HttpClientBuilder::new()
.client(Client::new())
.exchange(Exchange::Bybit)
.rate_limiter(test_rate_limiter())
.base_url("https://api.bybit.com".into())
.build();
assert_build_err(result, "timeout");
}
#[test]
fn test_http_builder_complete_builds_successfully() {
let result = HttpClientBuilder::new()
.client(Client::new())
.exchange(Exchange::Bybit)
.rate_limiter(test_rate_limiter())
.base_url("https://api.bybit.com".into())
.timeout(Duration::from_secs(10))
.build();
let Ok(http_client) = result else {
panic!("complete builder should succeed");
};
assert_eq!(http_client.exchange, Exchange::Bybit);
assert_eq!(http_client.base_url, "https://api.bybit.com");
assert_eq!(http_client.timeout, Duration::from_secs(10));
}
#[test]
fn test_http_builder_error_type_is_string() {
let result: Result<HttpClient, String> = HttpClientBuilder::new().build();
assert!(result.is_err());
}
#[test]
fn test_http_builder_default_is_equivalent_to_new() {
let Err(from_new) = HttpClientBuilder::new().build() else {
panic!("new() builder with no fields should fail");
};
let Err(from_default) = HttpClientBuilder::default().build() else {
panic!("default() builder with no fields should fail");
};
assert_eq!(
from_new, from_default,
"Default::default() and new() should produce the same initial state",
);
}
}