Phase 27: P2 quality improvements — logging, httpx pooling, validation, tests
- app.py: replace print() with logging, basicConfig with LOG_LEVEL env var - api_client.py: shared AsyncClient instance (connection pooling), URL-encode delete_document path parameter, aclose() for cleanup - services/document.py: validate file exists and extension before ingest - tests/: ChatService (4) + DocumentService (6) unit tests via pytest-asyncio - pyproject.toml: asyncio_mode = auto - requirements-dev.txt: pytest, pytest-asyncio Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
import pytest
|
||||
from unittest.mock import AsyncMock, MagicMock
|
||||
|
||||
from services.chat import ChatService
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_api():
|
||||
api = MagicMock()
|
||||
api.reset = AsyncMock()
|
||||
api.save_feedback = AsyncMock()
|
||||
return api
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def service(mock_api):
|
||||
return ChatService(mock_api)
|
||||
|
||||
|
||||
async def test_reset_delegates_to_api(service, mock_api):
|
||||
await service.reset("user1")
|
||||
mock_api.reset.assert_awaited_once_with("user1")
|
||||
|
||||
|
||||
async def test_save_feedback_delegates_to_api(service, mock_api):
|
||||
await service.save_feedback("user1", "질문", "답변", 1, "run-123")
|
||||
mock_api.save_feedback.assert_awaited_once_with("user1", "질문", "답변", 1, "run-123")
|
||||
|
||||
|
||||
async def test_save_feedback_with_no_run_id(service, mock_api):
|
||||
await service.save_feedback("user1", "질문", "답변", -1, None)
|
||||
mock_api.save_feedback.assert_awaited_once_with("user1", "질문", "답변", -1, None)
|
||||
|
||||
|
||||
def test_chat_returns_api_iterator(service, mock_api):
|
||||
sentinel = object()
|
||||
mock_api.chat = MagicMock(return_value=sentinel)
|
||||
result = service.chat("안녕", "user1", False)
|
||||
assert result is sentinel
|
||||
mock_api.chat.assert_called_once_with("안녕", "user1", False)
|
||||
Reference in New Issue
Block a user