mod mock_service;
use foundry_local::{models::ExecutionProvider, FoundryLocalManager};
use mock_service::start_mock_server;
use std::env;
trait TestableFoundryLocalManager {
async fn with_test_uri(uri: &str) -> Self;
}
impl TestableFoundryLocalManager for FoundryLocalManager {
async fn with_test_uri(uri: &str) -> Self {
let mut manager = FoundryLocalManager::builder().build().await.unwrap();
manager.set_test_service_uri(uri);
manager
}
}
#[tokio::test]
async fn test_list_catalog_models() {
let (server_uri, shutdown_tx) = start_mock_server().await;
let mut manager = FoundryLocalManager::with_test_uri(&server_uri).await;
let catalog_models = manager.list_catalog_models().await.unwrap();
assert_eq!(catalog_models.len(), 2);
assert_eq!(catalog_models[0].id, "mock-model-1");
assert_eq!(catalog_models[0].alias, "mock-small");
assert_eq!(catalog_models[0].runtime, ExecutionProvider::CPU);
assert_eq!(catalog_models[1].id, "mock-model-2");
assert_eq!(catalog_models[1].alias, "mock-medium");
assert_eq!(catalog_models[1].runtime, ExecutionProvider::CUDA);
shutdown_tx.send(()).unwrap();
}
#[tokio::test]
async fn test_get_model_info() {
let (server_uri, shutdown_tx) = start_mock_server().await;
let mut manager = FoundryLocalManager::with_test_uri(&server_uri).await;
let model_info = manager.get_model_info("mock-model-1", false).await.unwrap();
assert_eq!(model_info.id, "mock-model-1");
assert_eq!(model_info.alias, "mock-small");
let model_info = manager.get_model_info("mock-small", false).await.unwrap();
assert_eq!(model_info.id, "mock-model-1");
assert_eq!(model_info.alias, "mock-small");
shutdown_tx.send(()).unwrap();
}
#[tokio::test]
async fn test_get_cache_location() {
let (server_uri, shutdown_tx) = start_mock_server().await;
let manager = FoundryLocalManager::with_test_uri(&server_uri).await;
let cache_location = manager.get_cache_location().await.unwrap();
assert_eq!(cache_location, "/tmp/mock-cache");
shutdown_tx.send(()).unwrap();
}
#[tokio::test]
async fn test_list_cached_models() {
let (server_uri, shutdown_tx) = start_mock_server().await;
let mut manager = FoundryLocalManager::with_test_uri(&server_uri).await;
let cached_models = manager.list_cached_models().await.unwrap();
assert_eq!(cached_models.len(), 1);
assert_eq!(cached_models[0].id, "mock-model-1");
shutdown_tx.send(()).unwrap();
}
#[tokio::test]
async fn test_download_model() {
let (server_uri, shutdown_tx) = start_mock_server().await;
let mut manager = FoundryLocalManager::with_test_uri(&server_uri).await;
let model_info = manager
.download_model("mock-model-2", None, false)
.await
.unwrap();
assert_eq!(model_info.id, "mock-model-2");
let cached_models = manager.list_cached_models().await.unwrap();
assert_eq!(cached_models.len(), 2);
assert!(cached_models.iter().any(|m| m.id == "mock-model-1"));
assert!(cached_models.iter().any(|m| m.id == "mock-model-2"));
shutdown_tx.send(()).unwrap();
}
#[tokio::test]
async fn test_load_and_unload_model() {
let (server_uri, shutdown_tx) = start_mock_server().await;
let mut manager = FoundryLocalManager::with_test_uri(&server_uri).await;
let model_info = manager.load_model("mock-model-1", Some(300)).await.unwrap();
assert_eq!(model_info.id, "mock-model-1");
let loaded_models = manager.list_loaded_models().await.unwrap();
assert_eq!(loaded_models.len(), 1);
assert_eq!(loaded_models[0].id, "mock-model-1");
manager.unload_model("mock-model-1", false).await.unwrap();
let loaded_models = manager.list_loaded_models().await.unwrap();
assert_eq!(loaded_models.len(), 0);
shutdown_tx.send(()).unwrap();
}
#[tokio::test]
async fn test_endpoint_and_api_key() {
let (server_uri, shutdown_tx) = start_mock_server().await;
let manager = FoundryLocalManager::with_test_uri(&server_uri).await;
let endpoint = manager.endpoint().unwrap();
assert_eq!(endpoint, format!("{}/v1", server_uri));
let api_key = manager.api_key();
assert_eq!(api_key, "OPENAI_API_KEY");
env::set_var("OPENAI_API_KEY", "test-api-key");
let api_key = manager.api_key();
assert_eq!(api_key, "test-api-key");
shutdown_tx.send(()).unwrap();
}