use crate::client::UnifiedLLMClient;
use crate::config::AnthropicConfig;
use crate::error::LlmError;
use crate::providers::AnthropicProvider;
use crate::tests::helpers::create_test_config;
#[cfg(test)]
mod factory_method_tests {
use super::*;
use crate::provider::LlmProvider;
#[test]
fn test_from_config_with_anthropic() {
let config = create_test_config("anthropic");
let result = UnifiedLLMClient::from_config(config);
assert!(
result.is_ok(),
"Should create Anthropic client from valid config"
);
let client = result.unwrap();
assert_eq!(
client.provider_name(),
"anthropic",
"Should identify as Anthropic provider"
);
}
#[test]
fn test_from_config_with_openai() {
let config = create_test_config("openai");
let result = UnifiedLLMClient::from_config(config);
assert!(
result.is_ok(),
"Should create OpenAI client from valid config"
);
let client = result.unwrap();
assert_eq!(
client.provider_name(),
"openai",
"Should identify as OpenAI provider"
);
}
#[test]
fn test_from_config_with_lmstudio() {
let config = create_test_config("lmstudio");
let result = UnifiedLLMClient::from_config(config);
assert!(
result.is_ok(),
"Should create LM Studio client from valid config"
);
let client = result.unwrap();
assert_eq!(
client.provider_name(),
"lmstudio",
"Should identify as LM Studio provider"
);
}
#[test]
fn test_from_config_unsupported_provider_error() {
let config = create_test_config("openai");
let result = UnifiedLLMClient::create("unsupported-provider", "model".to_string(), config);
assert!(result.is_err(), "Should fail for unsupported provider");
match result {
Err(LlmError::UnsupportedProvider { provider }) => {
assert_eq!(provider, "unsupported-provider");
}
Err(e) => panic!("Expected UnsupportedProvider error, got: {:?}", e),
Ok(_) => panic!("Expected error, got success"),
}
}
#[test]
fn test_provider_creation_with_invalid_config() {
let invalid_config = AnthropicConfig {
api_key: None, ..AnthropicConfig::default()
};
let result =
AnthropicProvider::new(invalid_config, crate::config::DefaultLLMParams::default());
assert!(
result.is_err(),
"Provider construction should fail with missing API key"
);
match result {
Err(LlmError::ConfigurationError { .. }) => {
}
_ => panic!("Expected ConfigurationError for missing API key"),
}
}
#[test]
fn test_from_config_propagates_provider_construction_errors() {
let config = create_test_config("openai");
let result = UnifiedLLMClient::create("invalid-provider", "model".to_string(), config);
assert!(result.is_err(), "Should fail for unsupported provider");
match result {
Err(LlmError::UnsupportedProvider { provider }) => {
assert_eq!(provider, "invalid-provider");
}
_ => panic!("Expected UnsupportedProvider error"),
}
}
#[test]
fn test_create_method_with_valid_parameters() {
let config = create_test_config("openai");
let model = "gpt-4".to_string();
let result = UnifiedLLMClient::create("openai", model.clone(), config);
assert!(result.is_ok(), "Should create client with valid parameters");
let client = result.unwrap();
assert_eq!(client.provider_name(), "openai");
}
#[test]
fn test_from_config_with_ollama() {
let config = create_test_config("ollama");
let result = UnifiedLLMClient::from_config(config);
assert!(
result.is_ok(),
"Should create Ollama client from valid config"
);
let client = result.unwrap();
assert_eq!(client.provider_name(), "ollama");
}
#[test]
#[serial_test::serial]
fn test_from_env_creates_client_from_environment_variables() {
std::env::set_var("AI_PROVIDER", "anthropic");
std::env::set_var("ANTHROPIC_API_KEY", "test-key-from-env");
let result = UnifiedLLMClient::from_env();
assert!(
result.is_ok(),
"Should create client from environment variables"
);
let client = result.unwrap();
assert_eq!(client.provider_name(), "anthropic");
std::env::remove_var("AI_PROVIDER");
std::env::remove_var("ANTHROPIC_API_KEY");
}
#[test]
#[serial_test::serial]
fn test_from_env_propagates_config_errors() {
std::env::set_var("AI_PROVIDER", "anthropic");
std::env::remove_var("ANTHROPIC_API_KEY");
let result = UnifiedLLMClient::from_env();
assert!(
result.is_err(),
"Should fail when required env vars are missing"
);
match result {
Err(LlmError::ConfigurationError { .. }) => {
}
_ => panic!("Expected ConfigurationError for missing API key"),
}
std::env::remove_var("AI_PROVIDER");
}
}
#[cfg(test)]
mod provider_name_tests {
use super::*;
use crate::provider::LlmProvider;
#[test]
fn test_anthropic_client_returns_correct_provider_name() {
let config = create_test_config("anthropic");
let client = UnifiedLLMClient::from_config(config).unwrap();
let provider_name = client.provider_name();
assert_eq!(provider_name, "anthropic");
}
#[test]
fn test_openai_client_returns_correct_provider_name() {
let config = create_test_config("openai");
let client = UnifiedLLMClient::from_config(config).unwrap();
let provider_name = client.provider_name();
assert_eq!(provider_name, "openai");
}
#[test]
fn test_lmstudio_client_returns_correct_provider_name() {
let config = create_test_config("lmstudio");
let client = UnifiedLLMClient::from_config(config).unwrap();
let provider_name = client.provider_name();
assert_eq!(provider_name, "lmstudio");
}
#[test]
fn test_ollama_client_returns_correct_provider_name() {
let config = create_test_config("ollama");
let client = UnifiedLLMClient::from_config(config).unwrap();
let provider_name = client.provider_name();
assert_eq!(provider_name, "ollama");
}
}
#[cfg(test)]
mod private_factory_tests {
use super::*;
#[test]
fn test_create_anthropic_provider_with_wrong_config_type() {
let config = create_test_config("openai");
let result = UnifiedLLMClient::create("anthropic", "claude-3".to_string(), config);
assert!(result.is_err(), "Should fail with config type mismatch");
match result {
Err(LlmError::ConfigurationError { .. }) => {
}
_ => panic!("Expected ConfigurationError"),
}
}
#[test]
fn test_create_openai_provider_with_wrong_config_type() {
let config = create_test_config("anthropic");
let result = UnifiedLLMClient::create("openai", "gpt-4".to_string(), config);
assert!(result.is_err(), "Should fail with config type mismatch");
match result {
Err(LlmError::ConfigurationError { .. }) => {
}
_ => panic!("Expected ConfigurationError"),
}
}
#[test]
fn test_create_lmstudio_provider_with_wrong_config_type() {
let config = create_test_config("anthropic");
let result = UnifiedLLMClient::create("lmstudio", "local-model".to_string(), config);
assert!(result.is_err(), "Should fail with config type mismatch");
}
#[test]
fn test_create_ollama_provider_with_wrong_config_type() {
let config = create_test_config("openai");
let result = UnifiedLLMClient::create("ollama", "llama2".to_string(), config);
assert!(result.is_err(), "Should fail with config type mismatch");
}
#[test]
fn test_create_anthropic_provider_success() {
let config = create_test_config("anthropic");
let result = UnifiedLLMClient::create("anthropic", "claude-3".to_string(), config);
assert!(
result.is_ok(),
"Should succeed with correct Anthropic config"
);
}
#[test]
fn test_create_openai_provider_success() {
let config = create_test_config("openai");
let result = UnifiedLLMClient::create("openai", "gpt-4".to_string(), config);
assert!(result.is_ok(), "Should succeed with correct OpenAI config");
}
#[test]
fn test_create_lmstudio_provider_success() {
let config = create_test_config("lmstudio");
let result = UnifiedLLMClient::create("lmstudio", "local-model".to_string(), config);
assert!(
result.is_ok(),
"Should succeed with correct LM Studio config"
);
}
#[test]
fn test_create_ollama_provider_success() {
let config = create_test_config("ollama");
let result = UnifiedLLMClient::create("ollama", "llama2".to_string(), config);
assert!(result.is_ok(), "Should succeed with correct Ollama config");
}
#[test]
fn test_create_with_different_models() {
let anthropic = UnifiedLLMClient::create(
"anthropic",
"claude-3-opus".to_string(),
create_test_config("anthropic"),
);
let openai = UnifiedLLMClient::create(
"openai",
"gpt-4-turbo".to_string(),
create_test_config("openai"),
);
assert!(anthropic.is_ok(), "Should create with Claude model");
assert!(openai.is_ok(), "Should create with GPT-4 model");
}
}