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:
@@ -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"]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user