pub fn normalize_base_url(base_url: &str) -> String {
base_url.trim_end_matches('/').to_string()
}
pub fn construct_api_url(base_url: &str, endpoint: &str) -> String {
let normalized_base = normalize_base_url(base_url);
let endpoint = endpoint.trim_start_matches('/');
format!("{}/{}", normalized_base, endpoint)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_normalize_base_url() {
assert_eq!(
normalize_base_url("https://api.example.com/v1"),
"https://api.example.com/v1"
);
assert_eq!(
normalize_base_url("https://api.example.com/v1/"),
"https://api.example.com/v1"
);
assert_eq!(
normalize_base_url("https://api.example.com/v1///"),
"https://api.example.com/v1"
);
assert_eq!(
normalize_base_url("https://api.example.com/"),
"https://api.example.com"
);
assert_eq!(
normalize_base_url("https://api.example.com"),
"https://api.example.com"
);
assert_eq!(normalize_base_url(""), "");
assert_eq!(normalize_base_url("///"), "");
}
#[test]
fn test_construct_api_url() {
assert_eq!(
construct_api_url("https://api.example.com/v1", "chat/completions"),
"https://api.example.com/v1/chat/completions"
);
assert_eq!(
construct_api_url("https://api.example.com/v1/", "chat/completions"),
"https://api.example.com/v1/chat/completions"
);
assert_eq!(
construct_api_url("https://api.example.com/v1", "/chat/completions"),
"https://api.example.com/v1/chat/completions"
);
assert_eq!(
construct_api_url("https://api.example.com/v1/", "/chat/completions"),
"https://api.example.com/v1/chat/completions"
);
assert_eq!(
construct_api_url("https://api.example.com/v1///", "models"),
"https://api.example.com/v1/models"
);
assert_eq!(
construct_api_url("https://api.example.com/v1", "///models"),
"https://api.example.com/v1/models"
);
assert_eq!(
construct_api_url("https://api.openai.com/v1/", "models"),
"https://api.openai.com/v1/models"
);
}
}