313 lines
11 KiB
Python
313 lines
11 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
Тестирование HR-AI системы по компонентам
|
||
"""
|
||
|
||
import asyncio
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
import requests
|
||
|
||
# Добавляем корневую директорию в PYTHONPATH
|
||
sys.path.append(str(Path(__file__).parent))
|
||
|
||
|
||
async def test_database_connection():
|
||
"""Тест подключения к PostgreSQL"""
|
||
print("Testing database connection...")
|
||
|
||
try:
|
||
from sqlalchemy import select
|
||
|
||
from app.core.database import get_db
|
||
from app.models.resume import Resume
|
||
|
||
# Получаем async сессию
|
||
async for db in get_db():
|
||
# Пробуем выполнить простой запрос
|
||
result = await db.execute(select(Resume).limit(1))
|
||
resumes = result.scalars().all()
|
||
|
||
print("OK Database: connection successful")
|
||
print(f"Found resumes in database: {len(resumes)}")
|
||
return True
|
||
|
||
except Exception as e:
|
||
print(f"FAIL Database: connection error - {str(e)}")
|
||
return False
|
||
|
||
|
||
async def test_rag_system():
|
||
"""Тест RAG системы (парсинг резюме)"""
|
||
print("\n🔍 Тестируем RAG систему...")
|
||
|
||
try:
|
||
from rag.llm.model import ResumeParser
|
||
from rag.registry import registry
|
||
|
||
# Инициализируем модели
|
||
chat_model = registry.get_chat_model()
|
||
# embeddings_model = registry.get_embeddings_model()
|
||
|
||
print("✅ RAG система: модели инициализированы")
|
||
|
||
# Тестируем парсер резюме
|
||
parser = ResumeParser(chat_model)
|
||
|
||
# Создаем тестовый текст резюме
|
||
test_resume_text = """
|
||
Иван Петров
|
||
Python разработчик
|
||
Опыт работы: 3 года
|
||
Навыки: Python, Django, PostgreSQL, Docker
|
||
Образование: МГУ, факультет ВМК
|
||
"""
|
||
|
||
parsed_resume = parser.parse_resume_text(test_resume_text)
|
||
|
||
print("✅ RAG система: парсинг резюме работает")
|
||
print(f"📋 Распарсенные данные: {parsed_resume}")
|
||
|
||
return True
|
||
|
||
except Exception as e:
|
||
print(f"❌ RAG система: ошибка - {str(e)}")
|
||
return False
|
||
|
||
|
||
def test_redis_connection():
|
||
"""Тест подключения к Redis"""
|
||
print("\n🔍 Тестируем подключение к Redis...")
|
||
|
||
try:
|
||
import redis
|
||
|
||
from rag.settings import settings
|
||
|
||
r = redis.Redis(
|
||
host=settings.redis_cache_url,
|
||
port=settings.redis_cache_port,
|
||
db=settings.redis_cache_db,
|
||
)
|
||
|
||
# Пробуем ping
|
||
r.ping()
|
||
|
||
print("✅ Redis: подключение успешно")
|
||
return True
|
||
|
||
except Exception as e:
|
||
print(f"❌ Redis: ошибка подключения - {str(e)}")
|
||
print(
|
||
"💡 Для запуска Redis используйте: docker run -d -p 6379:6379 redis:alpine"
|
||
)
|
||
return False
|
||
|
||
|
||
async def test_celery_tasks():
|
||
"""Тест Celery задач"""
|
||
print("\n🔍 Тестируем Celery задачи...")
|
||
|
||
try:
|
||
print("✅ Celery: задачи импортируются")
|
||
print(
|
||
"💡 Для полного теста запустите: celery -A celery_worker.celery_app worker --loglevel=info"
|
||
)
|
||
|
||
return True
|
||
|
||
except Exception as e:
|
||
print(f"❌ Celery: ошибка - {str(e)}")
|
||
return False
|
||
|
||
|
||
async def test_interview_service():
|
||
"""Тест сервиса интервью (без LiveKit)"""
|
||
print("\n🔍 Тестируем сервис интервью...")
|
||
|
||
try:
|
||
from app.core.database import get_db
|
||
from app.services.interview_service import InterviewRoomService
|
||
|
||
async for db in get_db():
|
||
service = InterviewRoomService(db)
|
||
|
||
# Тестируем генерацию токена (должен работать даже без LiveKit сервера)
|
||
try:
|
||
token = service.generate_access_token("test_room", "test_user")
|
||
print("✅ Interview Service: генерация токенов работает")
|
||
print(f"🎫 Тестовый токен сгенерирован (длина: {len(token)})")
|
||
except Exception as e:
|
||
print(f"⚠️ Interview Service: ошибка токена - {str(e)}")
|
||
|
||
# Тестируем fallback план интервью
|
||
fallback_plan = service._get_fallback_interview_plan()
|
||
print("✅ Interview Service: fallback план работает")
|
||
print(f"📋 Структура плана: {list(fallback_plan.keys())}")
|
||
|
||
return True
|
||
|
||
except Exception as e:
|
||
print(f"❌ Interview Service: ошибка - {str(e)}")
|
||
return False
|
||
|
||
|
||
def test_ai_agent_import():
|
||
"""Тест импорта AI агента"""
|
||
print("\n🔍 Тестируем AI агента...")
|
||
|
||
try:
|
||
from ai_interviewer_agent import InterviewAgent
|
||
|
||
# Тестовый план интервью
|
||
test_plan = {
|
||
"interview_structure": {
|
||
"duration_minutes": 15,
|
||
"greeting": "Привет! Тест интервью",
|
||
"sections": [
|
||
{
|
||
"name": "Знакомство",
|
||
"duration_minutes": 5,
|
||
"questions": ["Расскажи о себе"],
|
||
},
|
||
{
|
||
"name": "Опыт",
|
||
"duration_minutes": 10,
|
||
"questions": ["Какой у тебя опыт?"],
|
||
},
|
||
],
|
||
},
|
||
"candidate_info": {
|
||
"name": "Тестовый кандидат",
|
||
"skills": ["Python"],
|
||
"total_years": 2,
|
||
},
|
||
}
|
||
|
||
agent = InterviewAgent(test_plan)
|
||
|
||
print("✅ AI Agent: импорт и инициализация работают")
|
||
print(f"📊 Секций в плане: {len(agent.sections)}")
|
||
print(f"🎯 Текущая секция: {agent.get_current_section().get('name')}")
|
||
|
||
# Тестируем извлечение системных инструкций
|
||
instructions = agent.get_system_instructions()
|
||
print(f"📝 Инструкции сгенерированы (длина: {len(instructions)})")
|
||
|
||
return True
|
||
|
||
except Exception as e:
|
||
print(f"❌ AI Agent: ошибка - {str(e)}")
|
||
return False
|
||
|
||
|
||
def check_external_services():
|
||
"""Проверка внешних сервисов"""
|
||
print("\n🔍 Проверяем внешние сервисы...")
|
||
|
||
# Проверяем Milvus
|
||
try:
|
||
from rag.settings import settings
|
||
|
||
response = requests.get(f"{settings.milvus_uri}/health", timeout=5)
|
||
if response.status_code == 200:
|
||
print("✅ Milvus: сервер доступен")
|
||
else:
|
||
print("⚠️ Milvus: сервер недоступен")
|
||
except Exception:
|
||
print("❌ Milvus: сервер недоступен")
|
||
|
||
# Проверяем LiveKit (если запущен)
|
||
try:
|
||
# LiveKit health check обычно на HTTP порту
|
||
livekit_http_url = settings.livekit_url.replace("ws://", "http://").replace(
|
||
":7880", ":7880"
|
||
)
|
||
response = requests.get(livekit_http_url, timeout=2)
|
||
print("✅ LiveKit: сервер запущен")
|
||
except Exception:
|
||
print("❌ LiveKit: сервер не запущен")
|
||
print(
|
||
"💡 Для запуска LiveKit используйте Docker: docker run --rm -p 7880:7880 -p 7881:7881 livekit/livekit-server --dev"
|
||
)
|
||
|
||
|
||
async def run_all_tests():
|
||
"""Запуск всех тестов"""
|
||
print("=== HR-AI System Testing ===")
|
||
print("=" * 50)
|
||
|
||
tests = [
|
||
("Database", test_database_connection),
|
||
("RAG System", test_rag_system),
|
||
("Redis", lambda: test_redis_connection()),
|
||
("Celery", test_celery_tasks),
|
||
("Interview Service", test_interview_service),
|
||
("AI Agent", lambda: test_ai_agent_import()),
|
||
]
|
||
|
||
results = {}
|
||
|
||
for test_name, test_func in tests:
|
||
try:
|
||
if asyncio.iscoroutinefunction(test_func):
|
||
result = await test_func()
|
||
else:
|
||
result = test_func()
|
||
results[test_name] = result
|
||
except Exception as e:
|
||
print(f"❌ {test_name}: критическая ошибка - {str(e)}")
|
||
results[test_name] = False
|
||
|
||
# Проверяем внешние сервисы
|
||
check_external_services()
|
||
|
||
# Итоговый отчет
|
||
print("\n" + "=" * 50)
|
||
print("📊 ИТОГОВЫЙ ОТЧЕТ")
|
||
print("=" * 50)
|
||
|
||
passed = sum(1 for r in results.values() if r)
|
||
total = len(results)
|
||
|
||
for test_name, result in results.items():
|
||
status = "✅ PASS" if result else "❌ FAIL"
|
||
print(f"{test_name:20} {status}")
|
||
|
||
print(f"\n🎯 Результат: {passed}/{total} тестов прошли успешно")
|
||
|
||
if passed == total:
|
||
print("🎉 Система готова к тестированию!")
|
||
print_next_steps()
|
||
else:
|
||
print("⚠️ Некоторые компоненты требуют настройки")
|
||
print_troubleshooting()
|
||
|
||
|
||
def print_next_steps():
|
||
"""Следующие шаги для полного тестирования"""
|
||
print("\n📋 СЛЕДУЮЩИЕ ШАГИ:")
|
||
print("1. Запустите FastAPI сервер: uvicorn app.main:app --reload")
|
||
print(
|
||
"2. Запустите Celery worker: celery -A celery_worker.celery_app worker --loglevel=info"
|
||
)
|
||
print("3. Загрузите тестовое резюме через /resume/upload")
|
||
print("4. Проверьте генерацию плана интервью в базе данных")
|
||
print("5. Для полного теста голосовых интервью потребуются:")
|
||
print(" - API ключи Deepgram/Cartesia")
|
||
print(" - LiveKit сервер")
|
||
|
||
|
||
def print_troubleshooting():
|
||
"""Устранение неисправностей"""
|
||
print("\n🔧 УСТРАНЕНИЕ ПРОБЛЕМ:")
|
||
print("• Redis не запущен: docker run -d -p 6379:6379 redis:alpine")
|
||
print("• Milvus недоступен: проверьте настройки MILVUS_URI")
|
||
print("• RAG ошибки: проверьте OPENAI_API_KEY")
|
||
print("• База данных: проверьте DATABASE_URL и запустите alembic upgrade head")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
asyncio.run(run_all_tests())
|