test: 8 parallel agents — fix 150+ failures, add 30+ test files. schemas/models 99-100%, core/client_registry ~98%, maintenance 95-98%, git edges 97%, translate 98-100%, dashboard routes 95-96%, dataset_review 100%

This commit is contained in:
2026-06-15 17:31:43 +03:00
parent a18f19064f
commit 4e6bfa8549
43 changed files with 7792 additions and 92 deletions

View File

@@ -10,6 +10,7 @@ os.environ.setdefault("SECRET_KEY", "test-secret-key-for-tests")
os.environ.setdefault("DEV_MODE", "true")
import sys
from datetime import datetime
from pathlib import Path
from unittest.mock import AsyncMock, MagicMock, patch
@@ -29,7 +30,7 @@ def _make_client(overrides: dict | None = None) -> TestClient:
from src.schemas.auth import User, RoleSchema
app = FastAPI()
app.include_router(router)
app.include_router(router, prefix="/validation-tasks")
mock_user = User(
id="admin-1", username="admin", email="admin@x.com",
@@ -57,7 +58,11 @@ class TestListTasks:
def test_success(self):
mock_svc = MagicMock()
mock_svc.list_tasks.return_value = (1, [{"id": "task-1", "name": "Test"}])
mock_svc.list_tasks.return_value = (1, [{
"id": "task-1", "name": "Test", "environment_id": "env-1",
"is_active": True, "dashboard_ids": ["dash-1"],
"created_at": "2024-01-01T00:00:00",
}])
from src.api.routes.validation_tasks import _get_task_service
client = _make_client({_get_task_service: lambda: mock_svc})
@@ -99,8 +104,14 @@ class TestCreateTask:
}
def test_success(self):
from src.schemas.validation import ValidationTaskResponse
mock_svc = MagicMock()
mock_svc.create_task.return_value = {"id": "task-new", "name": "New Task"}
mock_svc.create_task.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
@@ -130,7 +141,11 @@ class TestGetTask:
def test_success(self):
mock_svc = MagicMock()
mock_svc.get_task.return_value = {"id": "task-1", "name": "Test Task"}
mock_svc.get_task.return_value = {
"id": "task-1", "name": "Test Task", "environment_id": "env-1",
"is_active": True, "dashboard_ids": ["dash-1"],
"created_at": "2024-01-01T00:00:00",
}
from src.api.routes.validation_tasks import _get_task_service
client = _make_client({_get_task_service: lambda: mock_svc})
@@ -156,8 +171,14 @@ class TestUpdateTask:
UPDATE_PAYLOAD = {"name": "Updated Task"}
def test_success(self):
from src.schemas.validation import ValidationTaskResponse
mock_svc = MagicMock()
mock_svc.update_task.return_value = {"id": "task-1", "name": "Updated Task"}
mock_svc.update_task.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
@@ -187,7 +208,11 @@ class TestToggleTaskStatus:
def test_activate(self):
mock_svc = MagicMock()
mock_svc.update_task.return_value = {"id": "task-1", "is_active": True}
mock_svc.update_task.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
@@ -202,7 +227,11 @@ class TestToggleTaskStatus:
def test_deactivate(self):
mock_svc = MagicMock()
mock_svc.update_task.return_value = {"id": "task-1", "is_active": False}
mock_svc.update_task.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
@@ -239,7 +268,8 @@ class TestTriggerRun:
resp = client.post("/validation-tasks/task-1/run")
assert resp.status_code == 200
data = resp.json()
assert data["spawned_task_id"] == "task-1"
# spawned_task_id comes from result["task_id"] (the mock returns "t-1")
assert data["spawned_task_id"] == "t-1"
assert data["status"] == "PENDING"
def test_value_error(self):
@@ -259,7 +289,9 @@ class TestListAllRuns:
def test_success(self):
mock_svc = MagicMock()
mock_svc.list_all_runs.return_value = (1, [{"id": "run-1"}])
mock_svc.list_all_runs.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})
@@ -377,7 +409,7 @@ class TestParseSupersetUrl:
mock_extractor.client = mock_client
from src.dependencies import get_config_manager
with patch("src.api.routes.validation_tasks.SupersetContextExtractor", return_value=mock_extractor):
with patch("src.core.utils.superset_context_extractor.SupersetContextExtractor", return_value=mock_extractor):
client = _make_client({get_config_manager: lambda: mock_config})
resp = client.post("/validation-tasks/parse-url", json=self.PARSE_PAYLOAD)
assert resp.status_code == 200
@@ -400,7 +432,7 @@ class TestParseSupersetUrl:
mock_extractor.client = MagicMock()
from src.dependencies import get_config_manager
with patch("src.api.routes.validation_tasks.SupersetContextExtractor", return_value=mock_extractor):
with patch("src.core.utils.superset_context_extractor.SupersetContextExtractor", return_value=mock_extractor):
client = _make_client({get_config_manager: lambda: mock_config})
resp = client.post("/validation-tasks/parse-url", json=self.PARSE_PAYLOAD)
assert resp.status_code == 200
@@ -423,7 +455,7 @@ class TestParseSupersetUrl:
mock_extractor.parse_superset_link = AsyncMock(side_effect=ValueError("Invalid URL"))
from src.dependencies import get_config_manager
with patch("src.api.routes.validation_tasks.SupersetContextExtractor", return_value=mock_extractor):
with patch("src.core.utils.superset_context_extractor.SupersetContextExtractor", return_value=mock_extractor):
client = _make_client({get_config_manager: lambda: mock_config})
resp = client.post("/validation-tasks/parse-url", json=self.PARSE_PAYLOAD)
assert resp.status_code == 422
@@ -436,7 +468,7 @@ class TestParseSupersetUrl:
mock_extractor.parse_superset_link = AsyncMock(side_effect=RuntimeError("Network error"))
from src.dependencies import get_config_manager
with patch("src.api.routes.validation_tasks.SupersetContextExtractor", return_value=mock_extractor):
with patch("src.core.utils.superset_context_extractor.SupersetContextExtractor", return_value=mock_extractor):
client = _make_client({get_config_manager: lambda: mock_config})
resp = client.post("/validation-tasks/parse-url", json=self.PARSE_PAYLOAD)
assert resp.status_code == 502
@@ -457,7 +489,7 @@ class TestLegacyLlmReportRedirect:
from src.core.database import get_db
client = _make_client({get_db: lambda: mock_db})
resp = client.get("/validation-tasks/reports/llm/old-task")
resp = client.get("/validation-tasks/reports/llm/old-task", follow_redirects=False)
assert resp.status_code == 302
assert "/validation-tasks/policy-1/runs/run-1" in resp.headers["location"]