hgzero/rag/tests/test_api.py
2025-10-29 05:54:08 +09:00

181 lines
4.8 KiB
Python

"""
FastAPI 엔드포인트 테스트
"""
import pytest
from fastapi.testclient import TestClient
from pathlib import Path
import sys
# 프로젝트 루트 디렉토리를 Python 경로에 추가
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))
from src.api.main import app
client = TestClient(app)
def test_root():
"""루트 엔드포인트 테스트"""
response = client.get("/")
assert response.status_code == 200
data = response.json()
assert data["service"] == "Vector DB 통합 시스템"
assert data["version"] == "1.0.0"
def test_search_terms_keyword():
"""용어 키워드 검색 테스트"""
response = client.post(
"/api/terms/search",
json={
"query": "API",
"search_type": "keyword",
"top_k": 5,
"confidence_threshold": 0.7
}
)
assert response.status_code == 200
results = response.json()
assert isinstance(results, list)
if len(results) > 0:
result = results[0]
assert "term" in result
assert "relevance_score" in result
assert "match_type" in result
def test_search_terms_vector():
"""용어 벡터 검색 테스트"""
response = client.post(
"/api/terms/search",
json={
"query": "회의 일정 관리",
"search_type": "vector",
"top_k": 3,
"confidence_threshold": 0.6
}
)
assert response.status_code == 200
results = response.json()
assert isinstance(results, list)
def test_search_terms_hybrid():
"""용어 하이브리드 검색 테스트"""
response = client.post(
"/api/terms/search",
json={
"query": "마이크로서비스",
"search_type": "hybrid",
"top_k": 5,
"confidence_threshold": 0.5
}
)
assert response.status_code == 200
results = response.json()
assert isinstance(results, list)
def test_get_term_stats():
"""용어 통계 조회 테스트"""
response = client.get("/api/terms/stats")
assert response.status_code == 200
stats = response.json()
assert "total_terms" in stats
assert "by_category" in stats
assert "avg_confidence" in stats
def test_search_documents():
"""관련 문서 검색 테스트"""
response = client.post(
"/api/documents/search",
json={
"query": "프로젝트 계획",
"top_k": 3,
"relevance_threshold": 0.3,
"semantic_ranking": True
}
)
assert response.status_code == 200
results = response.json()
assert isinstance(results, list)
if len(results) > 0:
result = results[0]
assert "document_id" in result
assert "title" in result
assert "content" in result
assert "relevance_score" in result
def test_search_documents_with_filters():
"""필터링된 문서 검색 테스트"""
response = client.post(
"/api/documents/search",
json={
"query": "회의록",
"top_k": 5,
"relevance_threshold": 0.3,
"document_type": "회의록",
"semantic_ranking": True
}
)
assert response.status_code == 200
results = response.json()
assert isinstance(results, list)
def test_get_document_stats():
"""문서 통계 조회 테스트"""
response = client.get("/api/documents/stats")
assert response.status_code == 200
stats = response.json()
assert "total_documents" in stats
assert "by_type" in stats
assert "total_chunks" in stats
def test_get_nonexistent_term():
"""존재하지 않는 용어 조회 테스트"""
response = client.get("/api/terms/nonexistent-term-id")
assert response.status_code == 404
def test_explain_term():
"""용어 설명 생성 테스트 (Claude AI)"""
# 먼저 용어 검색
search_response = client.post(
"/api/terms/search",
json={
"query": "API",
"search_type": "keyword",
"top_k": 1
}
)
if search_response.status_code == 200:
results = search_response.json()
if len(results) > 0:
term_id = results[0]["term"]["term_id"]
# 용어 설명 생성
explain_response = client.post(
f"/api/terms/{term_id}/explain",
json={
"meeting_context": "백엔드 개발 회의에서 REST API 설계 논의"
}
)
assert explain_response.status_code == 200
explanation = explain_response.json()
assert "term" in explanation
assert "explanation" in explanation
assert "generated_by" in explanation
if __name__ == "__main__":
pytest.main([__file__, "-v"])