use std::sync::LazyLock;
use crate::{
error::Result,
jolpica::{
agent::{Agent, AgentConfigs, MultiPageOption, RateLimiterOption},
api::{JOLPICA_API_BASE_URL, JOLPICA_API_RATE_LIMIT_QUOTA},
get::retry_on_http_error,
},
rate_limiter::RateLimiter,
};
pub(crate) const TESTS_DEFAULT_HTTP_RETRIES: usize = 3;
pub(crate) fn retry_http<T>(f: impl Fn() -> Result<T>) -> Result<T> {
retry_on_http_error(f, get_jolpica_test_rate_limiter(), Some(TESTS_DEFAULT_HTTP_RETRIES))
}
pub(crate) fn is_using_local_jolpica() -> bool {
std::env::var("LOCAL_JOLPICA").map_or(false, |v| v == "1" || v == "true")
}
pub(crate) fn get_jolpica_test_base_url() -> String {
if is_using_local_jolpica() {
if let Ok(url) = std::env::var("LOCAL_JOLPICA_BASE_URL") {
url
} else {
"http://localhost:8000/ergast/f1".to_string()
}
} else {
JOLPICA_API_BASE_URL.to_string()
}
}
pub(crate) fn get_jolpica_test_rate_limiter() -> Option<&'static RateLimiter> {
static JOLPICA_API_RATE_LIMITER: LazyLock<RateLimiter> =
LazyLock::new(|| RateLimiter::new(JOLPICA_API_RATE_LIMIT_QUOTA));
if is_using_local_jolpica() && std::env::var("LOCAL_JOLPICA_ENABLE_RATE_LIMIT").is_err() {
None
} else {
Some(&*JOLPICA_API_RATE_LIMITER)
}
}
pub(crate) fn get_jolpica_test_rate_limiter_option() -> RateLimiterOption<'static> {
if let Some(rate_limiter) = get_jolpica_test_rate_limiter() {
RateLimiterOption::External(rate_limiter)
} else {
RateLimiterOption::None
}
}
pub(crate) static JOLPICA_SP: LazyLock<Agent<'_>> = LazyLock::new(|| {
Agent::new(AgentConfigs {
base_url: get_jolpica_test_base_url(),
multi_page: MultiPageOption::Disabled,
http_retries: Some(TESTS_DEFAULT_HTTP_RETRIES),
rate_limiter: get_jolpica_test_rate_limiter_option(),
})
});
pub(crate) static JOLPICA_MP: LazyLock<Agent<'_>> = LazyLock::new(|| {
Agent::new(AgentConfigs {
base_url: get_jolpica_test_base_url(),
multi_page: MultiPageOption::Enabled(None),
http_retries: Some(TESTS_DEFAULT_HTTP_RETRIES),
rate_limiter: get_jolpica_test_rate_limiter_option(),
})
});
pub(crate) fn get_request_avg_duration_ms() -> u64 {
if is_using_local_jolpica() { 15 } else { 300 }
}