| """Test configuration and fixtures — Deep Modular Architecture""" |
| import os |
| import sys |
| from unittest.mock import AsyncMock, MagicMock, patch |
|
|
| import pytest |
| from fastapi.testclient import TestClient |
|
|
| |
| backend_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) |
| if backend_path not in sys.path: |
| sys.path.insert(0, backend_path) |
|
|
| from app.main import app |
| from app.services import chat_service, db_service |
|
|
|
|
| @pytest.fixture(scope="function") |
| def test_client(): |
| """Test client fixture""" |
| with TestClient(app) as client: |
| yield client |
|
|
|
|
| @pytest.fixture(autouse=True) |
| def mock_dependencies(): |
| """Mock all external dependencies using object-based patching to avoid CI import issues""" |
| |
| mock_app_instance = MagicMock() |
| mock_app_instance.ainvoke = AsyncMock(return_value={ |
| "generation": "Test response from AI", |
| "source": "Test Source", |
| "llm_success": True |
| }) |
| mock_app_instance.invoke.return_value = { |
| "generation": "Test response from AI", |
| "source": "Test Source", |
| "llm_success": True |
| } |
|
|
| |
| with patch.object(db_service, 'init_db') as mock_db, \ |
| patch.object(chat_service, 'initialize_workflow'), \ |
| patch.object(chat_service, 'workflow_app', mock_app_instance), \ |
| patch.object(db_service, 'save_message') as mock_save, \ |
| patch('app.main.process_pdf') as mock_pdf, \ |
| patch('app.main.get_or_create_vectorstore') as mock_vs: |
|
|
| mock_vs.return_value = MagicMock() |
|
|
| yield { |
| "db": mock_db, |
| "pdf": mock_pdf, |
| "vector_store": mock_vs, |
| "workflow_app": mock_app_instance, |
| "save_message": mock_save, |
| } |
|
|
|
|
| @pytest.fixture |
| def mock_session_middleware(): |
| """Mock session middleware behavior""" |
| pass |
|
|