fix(tests): 61 failed backend unit tests — async/await mocks, deadlock fix, SyntaxError repairs
Группы исправлений: - Группа 1 (async/await misuse): MagicMock → AsyncMock для get_dashboards, export_dashboard, import_dashboard, sync_environment, get_run_detail, list_all_runs, create_task и др. — 23 теста - Группа 2 (runner.run deadlock): добавлены моки get_async_job_runner + IdMappingService/AsyncSupersetClient в migration plugin + API tests для предотвращения вечной блокировки future.result() — 16 тестов - Группа 3 (SyntaxError): исправлены 7 незакрытых скобок ')' в test_validation_tasks_comprehensive.py (QA-агент оставил AsyncMock без закрывающих скобок) - Группа 4 (mock verification): logger mock error→explore, scheduler tests skipped (удалён из production), dataset mapper — 11 тестов - Группа 5 (search/assistant): MagicMock → AsyncMock — 9 тестов - Группа 6 (extractor parsing): AsyncMock для async методов — 9 тестов Итого: 61 ранее FAILED → 274 passed, 4 skipped, 0 failed
This commit is contained in:
@@ -643,7 +643,7 @@ class TestToolLlmValidation:
|
||||
|
||||
svc = MagicMock()
|
||||
mock_validation_svc.return_value = svc
|
||||
svc.create_task.return_value = MagicMock(id="vt-1", name="Validation Task")
|
||||
svc.create_task = AsyncMock(return_value=MagicMock(id="vt-1", name="Validation Task"))
|
||||
svc.trigger_run = AsyncMock(return_value={"task_id": "task-42", "run_id": "run-1"})
|
||||
|
||||
intent_data = {
|
||||
@@ -694,7 +694,7 @@ class TestToolLlmValidation:
|
||||
|
||||
svc = MagicMock()
|
||||
mock_validation_svc.return_value = svc
|
||||
svc.create_task.side_effect = ValueError("Invalid config")
|
||||
svc.create_task = AsyncMock(side_effect=ValueError("Invalid config"))
|
||||
|
||||
with pytest.raises(HTTPException) as exc:
|
||||
await handle_run_llm_validation(
|
||||
@@ -723,7 +723,7 @@ class TestToolLlmValidation:
|
||||
|
||||
svc = MagicMock()
|
||||
mock_validation_svc.return_value = svc
|
||||
svc.create_task.return_value = MagicMock(id="vt-1", name="Validation Task")
|
||||
svc.create_task = AsyncMock(return_value=MagicMock(id="vt-1", name="Validation Task"))
|
||||
svc.trigger_run = AsyncMock(side_effect=ValueError("Trigger failed"))
|
||||
|
||||
with pytest.raises(HTTPException) as exc:
|
||||
|
||||
@@ -351,10 +351,13 @@ class TestTriggerSyncNow:
|
||||
mock_db.query.return_value.filter_by.return_value.first.side_effect = [None, None]
|
||||
|
||||
mock_sync = MagicMock()
|
||||
mock_sync.sync_environment = AsyncMock()
|
||||
|
||||
from src.core.database import get_db
|
||||
from src.dependencies import get_config_manager
|
||||
with patch("src.api.routes.migration.IdMappingService", return_value=mock_sync):
|
||||
with patch("src.api.routes.migration.IdMappingService", return_value=mock_sync), \
|
||||
patch("src.api.routes.migration.AsyncSupersetClient"), \
|
||||
patch("src.api.routes.migration.get_async_job_runner"):
|
||||
client = _make_client({
|
||||
get_config_manager: lambda: mock_config,
|
||||
get_db: lambda: mock_db,
|
||||
@@ -388,11 +391,14 @@ class TestTriggerSyncNow:
|
||||
mock_db.query.return_value.filter_by.return_value.first.return_value = None
|
||||
|
||||
mock_sync = MagicMock()
|
||||
mock_sync.sync_environment.side_effect = [None, RuntimeError("sync failed")]
|
||||
mock_sync.sync_environment = AsyncMock()
|
||||
|
||||
from src.core.database import get_db
|
||||
from src.dependencies import get_config_manager
|
||||
with patch("src.api.routes.migration.IdMappingService", return_value=mock_sync):
|
||||
# Make AsyncSupersetClient raise on 2nd call to simulate sync failure
|
||||
with patch("src.api.routes.migration.IdMappingService", return_value=mock_sync), \
|
||||
patch("src.api.routes.migration.AsyncSupersetClient", side_effect=[MagicMock(), RuntimeError("Connection failed")]), \
|
||||
patch("src.api.routes.migration.get_async_job_runner"):
|
||||
client = _make_client({
|
||||
get_config_manager: lambda: mock_config,
|
||||
get_db: lambda: mock_db,
|
||||
|
||||
@@ -18,7 +18,7 @@ os.environ.setdefault("DEV_MODE", "true")
|
||||
|
||||
from datetime import UTC, datetime
|
||||
import pytest
|
||||
from unittest.mock import MagicMock
|
||||
from unittest.mock import AsyncMock, MagicMock
|
||||
|
||||
from fastapi.testclient import TestClient
|
||||
|
||||
@@ -90,6 +90,11 @@ def mock_all_deps():
|
||||
mock_user.roles = [admin_role]
|
||||
|
||||
mock_task_service = MagicMock()
|
||||
mock_task_service.create_task = AsyncMock()
|
||||
mock_task_service.update_task = AsyncMock()
|
||||
mock_task_service.trigger_run = AsyncMock()
|
||||
mock_task_service.list_all_runs = AsyncMock()
|
||||
mock_task_service.get_run_detail = AsyncMock()
|
||||
mock_task_manager = MagicMock()
|
||||
mock_scheduler = MagicMock()
|
||||
mock_config = MagicMock()
|
||||
|
||||
@@ -107,11 +107,11 @@ class TestCreateTask:
|
||||
from src.schemas.validation import ValidationTaskResponse
|
||||
|
||||
mock_svc = MagicMock()
|
||||
mock_svc.create_task.return_value = ValidationTaskResponse(
|
||||
mock_svc.create_task = AsyncMock(return_value=ValidationTaskResponse(
|
||||
id="task-new", name="New Task", environment_id="env-1",
|
||||
is_active=True, dashboard_ids=["dash-1"],
|
||||
created_at=datetime.now(),
|
||||
)
|
||||
))
|
||||
mock_sched = MagicMock()
|
||||
|
||||
from src.api.routes.validation_tasks import _get_task_service
|
||||
@@ -126,7 +126,7 @@ class TestCreateTask:
|
||||
|
||||
def test_value_error(self):
|
||||
mock_svc = MagicMock()
|
||||
mock_svc.create_task.side_effect = ValueError("Invalid provider")
|
||||
mock_svc.create_task = AsyncMock(side_effect=ValueError("Invalid provider"))
|
||||
|
||||
from src.api.routes.validation_tasks import _get_task_service
|
||||
client = _make_client({_get_task_service: lambda: mock_svc})
|
||||
@@ -174,11 +174,11 @@ class TestUpdateTask:
|
||||
from src.schemas.validation import ValidationTaskResponse
|
||||
|
||||
mock_svc = MagicMock()
|
||||
mock_svc.update_task.return_value = ValidationTaskResponse(
|
||||
mock_svc.update_task = AsyncMock(return_value=ValidationTaskResponse(
|
||||
id="task-1", name="Updated Task", environment_id="env-1",
|
||||
is_active=True, dashboard_ids=["dash-1"],
|
||||
created_at=datetime.now(),
|
||||
)
|
||||
))
|
||||
mock_sched = MagicMock()
|
||||
|
||||
from src.api.routes.validation_tasks import _get_task_service
|
||||
@@ -193,7 +193,7 @@ class TestUpdateTask:
|
||||
|
||||
def test_not_found(self):
|
||||
mock_svc = MagicMock()
|
||||
mock_svc.update_task.side_effect = ValueError("Task not found")
|
||||
mock_svc.update_task = AsyncMock(side_effect=ValueError("Task not found"))
|
||||
|
||||
from src.api.routes.validation_tasks import _get_task_service
|
||||
client = _make_client({_get_task_service: lambda: mock_svc})
|
||||
@@ -208,11 +208,11 @@ class TestToggleTaskStatus:
|
||||
|
||||
def test_activate(self):
|
||||
mock_svc = MagicMock()
|
||||
mock_svc.update_task.return_value = {
|
||||
mock_svc.update_task = AsyncMock(return_value={
|
||||
"id": "task-1", "name": "Task", "environment_id": "env-1",
|
||||
"is_active": True, "dashboard_ids": ["dash-1"],
|
||||
"created_at": "2024-01-01T00:00:00",
|
||||
}
|
||||
})
|
||||
mock_sched = MagicMock()
|
||||
|
||||
from src.api.routes.validation_tasks import _get_task_service
|
||||
@@ -227,11 +227,11 @@ class TestToggleTaskStatus:
|
||||
|
||||
def test_deactivate(self):
|
||||
mock_svc = MagicMock()
|
||||
mock_svc.update_task.return_value = {
|
||||
mock_svc.update_task = AsyncMock(return_value={
|
||||
"id": "task-1", "name": "Task", "environment_id": "env-1",
|
||||
"is_active": False, "dashboard_ids": ["dash-1"],
|
||||
"created_at": "2024-01-01T00:00:00",
|
||||
}
|
||||
})
|
||||
mock_sched = MagicMock()
|
||||
|
||||
from src.api.routes.validation_tasks import _get_task_service
|
||||
@@ -246,7 +246,7 @@ class TestToggleTaskStatus:
|
||||
|
||||
def test_not_found(self):
|
||||
mock_svc = MagicMock()
|
||||
mock_svc.update_task.side_effect = ValueError("Task not found")
|
||||
mock_svc.update_task = AsyncMock(side_effect=ValueError("Task not found"))
|
||||
|
||||
from src.api.routes.validation_tasks import _get_task_service
|
||||
client = _make_client({_get_task_service: lambda: mock_svc})
|
||||
@@ -289,9 +289,9 @@ class TestListAllRuns:
|
||||
|
||||
def test_success(self):
|
||||
mock_svc = MagicMock()
|
||||
mock_svc.list_all_runs.return_value = (1, [{
|
||||
mock_svc.list_all_runs = AsyncMock(return_value=(1, [{
|
||||
"id": "run-1", "dashboard_id": "dash-1", "status": "SUCCESS",
|
||||
}])
|
||||
}]))
|
||||
|
||||
from src.api.routes.validation_tasks import _get_task_service
|
||||
client = _make_client({_get_task_service: lambda: mock_svc})
|
||||
@@ -302,7 +302,7 @@ class TestListAllRuns:
|
||||
|
||||
def test_with_filters(self):
|
||||
mock_svc = MagicMock()
|
||||
mock_svc.list_all_runs.return_value = (0, [])
|
||||
mock_svc.list_all_runs = AsyncMock(return_value=(0, []))
|
||||
|
||||
from src.api.routes.validation_tasks import _get_task_service
|
||||
client = _make_client({_get_task_service: lambda: mock_svc})
|
||||
@@ -311,7 +311,7 @@ class TestListAllRuns:
|
||||
|
||||
def test_value_error(self):
|
||||
mock_svc = MagicMock()
|
||||
mock_svc.list_all_runs.side_effect = ValueError("Invalid filter")
|
||||
mock_svc.list_all_runs = AsyncMock(side_effect=ValueError("Invalid filter"))
|
||||
|
||||
from src.api.routes.validation_tasks import _get_task_service
|
||||
client = _make_client({_get_task_service: lambda: mock_svc})
|
||||
@@ -357,12 +357,12 @@ class TestGetRunDetail:
|
||||
|
||||
def test_success(self):
|
||||
mock_svc = MagicMock()
|
||||
mock_svc.get_run_detail.return_value = {
|
||||
mock_svc.get_run_detail = AsyncMock(return_value={
|
||||
"run": {"id": "run-1", "policy_id": "task-1", "status": "SUCCESS",
|
||||
"trigger": "manual", "dashboard_count": 2, "pass_count": 1,
|
||||
"warn_count": 0, "fail_count": 0, "unknown_count": 0},
|
||||
"records": [{"dashboard_id": "dash-1", "status": "PASS"}],
|
||||
}
|
||||
})
|
||||
|
||||
from src.api.routes.validation_tasks import _get_task_service
|
||||
client = _make_client({_get_task_service: lambda: mock_svc})
|
||||
|
||||
Reference in New Issue
Block a user