Spaces:
Sleeping
Sleeping
| #!/usr/bin/env python3 | |
| """ | |
| Standalone Tests for BYOK Handler (LLM Provider Management) | |
| Coverage Target: 80%+ | |
| Priority: P0 (Critical LLM Infrastructure) | |
| """ | |
| import sys | |
| import os | |
| sys.path.insert(0, '.') | |
| os.environ['ENVIRONMENT'] = 'development' | |
| from core.llm.byok_handler import BYOKHandler, QueryComplexity, PROVIDER_TIERS, COST_EFFICIENT_MODELS | |
| from unittest.mock import MagicMock, AsyncMock, patch | |
| import asyncio | |
| def test_query_complexity_enum(): | |
| """Test QueryComplexity enum values""" | |
| print("Testing QueryComplexity enum...") | |
| assert QueryComplexity.SIMPLE.value == "simple" | |
| assert QueryComplexity.MODERATE.value == "moderate" | |
| assert QueryComplexity.COMPLEX.value == "complex" | |
| assert QueryComplexity.ADVANCED.value == "advanced" | |
| print("✓ QueryComplexity enum tests passed") | |
| def test_provider_tiers_configuration(): | |
| """Test PROVIDER_TIERS configuration""" | |
| print("Testing provider tiers configuration...") | |
| assert "deepseek" in PROVIDER_TIERS["budget"] | |
| assert "anthropic" in PROVIDER_TIERS["mid"] | |
| assert "openai" in PROVIDER_TIERS["premium"] | |
| print("✓ Provider tiers configuration tests passed") | |
| def test_cost_efficient_models(): | |
| """Test COST_EFFICIENT_MODELS recommendations""" | |
| print("Testing cost efficient models...") | |
| assert QueryComplexity.SIMPLE in COST_EFFICIENT_MODELS["openai"] | |
| assert QueryComplexity.ADVANCED in COST_EFFICIENT_MODELS["openai"] | |
| assert "claude" in COST_EFFICIENT_MODELS["anthropic"][QueryComplexity.SIMPLE].lower() | |
| print("✓ Cost efficient models tests passed") | |
| def test_byok_handler_initialization(): | |
| """Test BYOKHandler initialization""" | |
| print("Testing BYOKHandler initialization...") | |
| handler = BYOKHandler() | |
| assert hasattr(handler, 'async_clients') | |
| assert hasattr(handler, 'clients') | |
| assert hasattr(handler, 'workspace_id') | |
| assert hasattr(handler, 'health_monitor') | |
| print("✓ BYOKHandler initialization tests passed") | |
| def test_analyze_query_complexity_simple(): | |
| """Test query complexity analysis for simple queries""" | |
| print("Testing query complexity analysis (simple)...") | |
| handler = BYOKHandler() | |
| result = handler.analyze_query_complexity("What is 2+2?") | |
| assert result == QueryComplexity.SIMPLE | |
| print("✓ Query complexity analysis (simple) tests passed") | |
| def test_analyze_query_complexity_advanced(): | |
| """Test query complexity analysis for advanced queries""" | |
| print("Testing query complexity analysis (advanced)...") | |
| handler = BYOKHandler() | |
| result = handler.analyze_query_complexity( | |
| "Analyze this complex data and provide multi-step reasoning with code" | |
| ) | |
| assert result in [QueryComplexity.COMPLEX, QueryComplexity.ADVANCED] | |
| print("✓ Query complexity analysis (advanced) tests passed") | |
| def test_get_optimal_provider(): | |
| """Test optimal provider selection""" | |
| print("Testing optimal provider selection...") | |
| handler = BYOKHandler() | |
| provider = handler.get_optimal_provider("simple task", QueryComplexity.SIMPLE) | |
| assert provider is not None | |
| print("✓ Optimal provider selection tests passed") | |
| def test_get_ranked_providers(): | |
| """Test ranked providers""" | |
| print("Testing ranked providers...") | |
| handler = BYOKHandler() | |
| providers = handler.get_ranked_providers(QueryComplexity.SIMPLE) | |
| assert isinstance(providers, list) | |
| assert len(providers) > 0 | |
| print("✓ Ranked providers tests passed") | |
| def test_get_available_providers(): | |
| """Test getting available providers""" | |
| print("Testing available providers...") | |
| handler = BYOKHandler() | |
| providers = handler.get_available_providers() | |
| assert isinstance(providers, list) | |
| print("✓ Available providers tests passed") | |
| def test_get_provider_fallback_order(): | |
| """Test provider fallback order""" | |
| print("Testing provider fallback order...") | |
| handler = BYOKHandler() | |
| fallbacks = handler._get_provider_fallback_order("openai") | |
| assert isinstance(fallbacks, list) | |
| assert fallbacks[0] == "openai" | |
| print("✓ Provider fallback order tests passed") | |
| def test_get_context_window(): | |
| """Test context window retrieval""" | |
| print("Testing context window retrieval...") | |
| handler = BYOKHandler() | |
| context = handler.get_context_window("gpt-4") | |
| assert isinstance(context, int) | |
| assert context > 0 | |
| print("✓ Context window retrieval tests passed") | |
| def test_truncate_to_context(): | |
| """Test text truncation to context limit""" | |
| print("Testing text truncation...") | |
| handler = BYOKHandler() | |
| long_text = "test " * 10000 | |
| truncated = handler.truncate_to_context(long_text, "gpt-4") | |
| assert isinstance(truncated, str) | |
| assert len(truncated) <= len(long_text) | |
| print("✓ Text truncation tests passed") | |
| def test_classify_cognitive_tier(): | |
| """Test cognitive tier classification""" | |
| print("Testing cognitive tier classification...") | |
| handler = BYOKHandler() | |
| tier = handler.classify_cognitive_tier("simple question") | |
| assert tier is not None | |
| print("✓ Cognitive tier classification tests passed") | |
| def test_get_routing_info(): | |
| """Test routing info""" | |
| print("Testing routing info...") | |
| handler = BYOKHandler() | |
| info = handler.get_routing_info("test prompt") | |
| assert isinstance(info, dict) | |
| assert "provider" in info or "complexity" in info | |
| print("✓ Routing info tests passed") | |
| def test_provider_tier_coverage(): | |
| """Test that all major providers are covered""" | |
| print("Testing provider tier coverage...") | |
| major_providers = ["openai", "anthropic", "deepseek", "gemini"] | |
| all_tier_providers = set() | |
| for tier_providers in PROVIDER_TIERS.values(): | |
| all_tier_providers.update(tier_providers) | |
| for provider in major_providers: | |
| assert provider in all_tier_providers | |
| print("✓ Provider tier coverage tests passed") | |
| def test_model_recommendation_coverage(): | |
| """Test model recommendations exist for all complexities""" | |
| print("Testing model recommendation coverage...") | |
| for provider, models in COST_EFFICIENT_MODELS.items(): | |
| for complexity in QueryComplexity: | |
| assert complexity in models | |
| assert models[complexity] is not None | |
| print("✓ Model recommendation coverage tests passed") | |
| async def test_health_monitor(): | |
| """Test health monitor""" | |
| print("Testing health monitor...") | |
| handler = BYOKHandler() | |
| handler.health_monitor.record_call("test-provider", success=True, latency_ms=100) | |
| assert handler.health_monitor is not None | |
| print("✓ Health monitor tests passed") | |
| async def test_refresh_pricing(): | |
| """Test pricing refresh""" | |
| print("Testing pricing refresh...") | |
| handler = BYOKHandler() | |
| result = await handler.refresh_pricing(force=False) | |
| assert isinstance(result, dict) | |
| print("✓ Pricing refresh tests passed") | |
| def test_get_provider_comparison(): | |
| """Test provider comparison""" | |
| print("Testing provider comparison...") | |
| handler = BYOKHandler() | |
| comparison = handler.get_provider_comparison() | |
| assert isinstance(comparison, dict) | |
| print("✓ Provider comparison tests passed") | |
| def test_get_cheapest_models(): | |
| """Test getting cheapest models""" | |
| print("Testing cheapest models...") | |
| handler = BYOKHandler() | |
| cheapest = handler.get_cheapest_models(limit=5) | |
| assert isinstance(cheapest, list) | |
| print("✓ Cheapest models tests passed") | |
| async def main(): | |
| """Run all tests""" | |
| print("=" * 60) | |
| print("Running BYOK Handler Tests (Standalone)") | |
| print("=" * 60) | |
| try: | |
| # Sync tests | |
| test_query_complexity_enum() | |
| test_provider_tiers_configuration() | |
| test_cost_efficient_models() | |
| test_byok_handler_initialization() | |
| test_analyze_query_complexity_simple() | |
| test_analyze_query_complexity_advanced() | |
| test_get_optimal_provider() | |
| test_get_ranked_providers() | |
| test_get_available_providers() | |
| test_get_provider_fallback_order() | |
| test_get_context_window() | |
| test_truncate_to_context() | |
| test_classify_cognitive_tier() | |
| test_get_routing_info() | |
| test_provider_tier_coverage() | |
| test_model_recommendation_coverage() | |
| test_get_provider_comparison() | |
| test_get_cheapest_models() | |
| # Async tests | |
| await test_health_monitor() | |
| await test_refresh_pricing() | |
| print("=" * 60) | |
| print("✓ ALL TESTS PASSED") | |
| print("=" * 60) | |
| return 0 | |
| except AssertionError as e: | |
| print(f"✗ TEST FAILED: {e}") | |
| import traceback | |
| traceback.print_exc() | |
| return 1 | |
| except Exception as e: | |
| print(f"✗ ERROR: {e}") | |
| import traceback | |
| traceback.print_exc() | |
| return 1 | |
| if __name__ == "__main__": | |
| exit_code = asyncio.run(main()) | |
| sys.exit(exit_code) | |