fix: 5 agents — core 703/703, settings 38/38, git edges 191/191, API routes 1139/1140, plugins +70 coverage

This commit is contained in:
2026-06-15 18:02:09 +03:00
parent 9cf2d6400a
commit 3de67c258a
18 changed files with 1432 additions and 154 deletions

View File

@@ -105,7 +105,7 @@ class TestGetSettings:
from src.core.config_models import Environment
env = Environment(
id="env-1", name="Test Env", url="https://example.com",
username="admin", password="real-password", stage="dev",
username="admin", password="real-password", stage="DEV",
)
real_config = _make_real_config(environments=[env])
@@ -245,7 +245,7 @@ class TestGetEnvironments:
mock_config = MagicMock()
real_env = Environment(
id="env-1", name="Test Env", url="https://example.com",
username="admin", password="secret", stage="dev",
username="admin", password="secret", stage="DEV",
)
mock_config.get_environments.return_value = [real_env]
@@ -267,7 +267,9 @@ class TestAddEnvironment:
"id": "env-new",
"name": "New Env",
"url": "https://superset.example.com",
"username": "admin",
"password": "secret",
"stage": "DEV",
}
def test_success(self):
@@ -308,7 +310,9 @@ class TestUpdateEnvironment:
"id": "env-1",
"name": "Updated Env",
"url": "https://superset.example.com",
"username": "admin",
"password": "new-password",
"stage": "DEV",
}
def test_success(self):
@@ -344,7 +348,8 @@ class TestUpdateEnvironment:
from src.dependencies import get_config_manager
client = _make_client({get_config_manager: lambda: mock_config})
resp = client.put("/api/settings/environments/env-1", json={
"id": "env-1", "name": "Updated", "url": "https://x.com", "password": "********",
"id": "env-1", "name": "Updated", "url": "https://x.com",
"username": "admin", "password": "********", "stage": "DEV",
})
assert resp.status_code == 200
@@ -365,6 +370,7 @@ class TestUpdateEnvironment:
def test_not_found(self):
mock_config = MagicMock()
mock_config.get_environments.return_value = [_make_env("env-1")]
mock_config.update_environment.return_value = False
with patch("src.api.routes.settings.AsyncSupersetClient") as mock_client_cls:
mock_client = MagicMock()
@@ -494,8 +500,26 @@ class TestGetValidationPolicies:
"""GET /settings/automation/policies"""
def test_success(self):
from datetime import time, datetime, timezone
from src.models.llm import ValidationPolicy
mock_db = MagicMock()
mock_db.query.return_value.all.return_value = [MagicMock(id="p1")]
mock_db.query.return_value.all.return_value = [
ValidationPolicy(
id="p1",
name="Test Policy",
environment_id="env-1",
is_active=True,
notify_owners=True,
alert_condition="FAIL_ONLY",
dashboard_ids=["d1"],
schedule_days=[1, 3, 5],
window_start=time(9, 0),
window_end=time(18, 0),
created_at=datetime.now(timezone.utc),
updated_at=datetime.now(timezone.utc),
)
]
from src.core.database import get_db
client = _make_client({get_db: lambda: mock_db})
@@ -509,12 +533,26 @@ class TestCreateValidationPolicy:
"""POST /settings/automation/policies"""
def test_success(self):
from datetime import datetime, timezone
mock_db = MagicMock()
now = datetime.now(timezone.utc)
# Simulate that db.refresh populates auto-generated fields (id, created_at, updated_at)
def _refresh(obj):
obj.id = getattr(obj, "id", None) or "new-id"
if getattr(obj, "created_at", None) is None:
obj.created_at = now
if getattr(obj, "updated_at", None) is None:
obj.updated_at = now
mock_db.refresh.side_effect = _refresh
from src.core.database import get_db
client = _make_client({get_db: lambda: mock_db})
resp = client.post("/api/settings/automation/policies", json={
"name": "Test Policy", "environment_id": "env-1", "dashboard_ids": [],
"schedule_days": [1, 3, 5], "window_start": "09:00", "window_end": "18:00",
})
assert resp.status_code == 200
mock_db.add.assert_called_once()
@@ -527,8 +565,18 @@ class TestUpdateValidationPolicy:
"""PATCH /settings/automation/policies/{id}"""
def test_success(self):
from datetime import time, datetime, timezone
from src.models.llm import ValidationPolicy
mock_db = MagicMock()
mock_policy = MagicMock()
mock_policy = ValidationPolicy(
id="p1", name="Test", environment_id="env-1",
is_active=True, notify_owners=True, alert_condition="FAIL_ONLY",
dashboard_ids=[], schedule_days=[1],
window_start=time(9, 0), window_end=time(18, 0),
created_at=datetime.now(timezone.utc),
updated_at=datetime.now(timezone.utc),
)
mock_db.query.return_value.filter.return_value.first.return_value = mock_policy
from src.core.database import get_db
@@ -612,10 +660,13 @@ class TestListConnections:
mock_conn_svc = MagicMock()
mock_conn_svc.list_connections.return_value = [{"id": "conn-1", "name": "Test"}]
from src.api.routes.settings import _get_connection_service
from src.dependencies import get_config_manager
with patch("src.api.routes.settings._get_connection_service", return_value=mock_conn_svc):
client = _make_client({get_config_manager: lambda: MagicMock()})
resp = client.get("/api/settings/connections")
client = _make_client({
get_config_manager: lambda: MagicMock(),
_get_connection_service: lambda: mock_conn_svc,
})
resp = client.get("/api/settings/connections")
assert resp.status_code == 200
@@ -631,10 +682,13 @@ class TestGetConnection:
mock_conn_svc.get_connection.return_value = mock_conn
mock_conn_svc._count_job_references.return_value = 2
from src.api.routes.settings import _get_connection_service
from src.dependencies import get_config_manager
with patch("src.api.routes.settings._get_connection_service", return_value=mock_conn_svc):
client = _make_client({get_config_manager: lambda: MagicMock()})
resp = client.get("/api/settings/connections/conn-1")
client = _make_client({
get_config_manager: lambda: MagicMock(),
_get_connection_service: lambda: mock_conn_svc,
})
resp = client.get("/api/settings/connections/conn-1")
assert resp.status_code == 200
data = resp.json()
assert data["password"] == "********"
@@ -644,10 +698,13 @@ class TestGetConnection:
mock_conn_svc = MagicMock()
mock_conn_svc.get_connection.return_value = None
from src.api.routes.settings import _get_connection_service
from src.dependencies import get_config_manager
with patch("src.api.routes.settings._get_connection_service", return_value=mock_conn_svc):
client = _make_client({get_config_manager: lambda: MagicMock()})
resp = client.get("/api/settings/connections/unknown")
client = _make_client({
get_config_manager: lambda: MagicMock(),
_get_connection_service: lambda: mock_conn_svc,
})
resp = client.get("/api/settings/connections/unknown")
assert resp.status_code == 404
@@ -660,23 +717,29 @@ class TestCreateConnection:
mock_conn_svc = MagicMock()
mock_conn_svc.create_connection.return_value = {"id": "conn-new", "name": "New"}
from src.api.routes.settings import _get_connection_service
from src.dependencies import get_config_manager
with patch("src.api.routes.settings._get_connection_service", return_value=mock_conn_svc):
client = _make_client({get_config_manager: lambda: MagicMock()})
resp = client.post("/api/settings/connections", json={
"name": "New", "host": "localhost", "port": 5432,
"database": "db", "username": "u", "password": "p", "dialect": "postgresql",
})
client = _make_client({
get_config_manager: lambda: MagicMock(),
_get_connection_service: lambda: mock_conn_svc,
})
resp = client.post("/api/settings/connections", json={
"name": "New", "host": "localhost", "port": 5432,
"database": "db", "username": "u", "password": "p", "dialect": "postgresql",
})
assert resp.status_code == 201
def test_value_error(self):
mock_conn_svc = MagicMock()
mock_conn_svc.create_connection.side_effect = ValueError("Invalid")
from src.api.routes.settings import _get_connection_service
from src.dependencies import get_config_manager
with patch("src.api.routes.settings._get_connection_service", return_value=mock_conn_svc):
client = _make_client({get_config_manager: lambda: MagicMock()})
resp = client.post("/api/settings/connections", json={"name": "Bad"})
client = _make_client({
get_config_manager: lambda: MagicMock(),
_get_connection_service: lambda: mock_conn_svc,
})
resp = client.post("/api/settings/connections", json={"name": "Bad"})
assert resp.status_code == 422
@@ -689,20 +752,26 @@ class TestUpdateConnection:
mock_conn_svc = MagicMock()
mock_conn_svc.update_connection.return_value = {"id": "conn-1", "name": "Updated"}
from src.api.routes.settings import _get_connection_service
from src.dependencies import get_config_manager
with patch("src.api.routes.settings._get_connection_service", return_value=mock_conn_svc):
client = _make_client({get_config_manager: lambda: MagicMock()})
resp = client.put("/api/settings/connections/conn-1", json={"name": "Updated"})
client = _make_client({
get_config_manager: lambda: MagicMock(),
_get_connection_service: lambda: mock_conn_svc,
})
resp = client.put("/api/settings/connections/conn-1", json={"name": "Updated"})
assert resp.status_code == 200
def test_value_error(self):
mock_conn_svc = MagicMock()
mock_conn_svc.update_connection.side_effect = ValueError("Invalid")
from src.api.routes.settings import _get_connection_service
from src.dependencies import get_config_manager
with patch("src.api.routes.settings._get_connection_service", return_value=mock_conn_svc):
client = _make_client({get_config_manager: lambda: MagicMock()})
resp = client.put("/api/settings/connections/conn-1", json={"name": ""})
client = _make_client({
get_config_manager: lambda: MagicMock(),
_get_connection_service: lambda: mock_conn_svc,
})
resp = client.put("/api/settings/connections/conn-1", json={"name": ""})
assert resp.status_code == 422
@@ -715,10 +784,13 @@ class TestDeleteConnection:
mock_conn_svc = MagicMock()
mock_conn_svc.delete_connection.return_value = {"success": True}
from src.api.routes.settings import _get_connection_service
from src.dependencies import get_config_manager
with patch("src.api.routes.settings._get_connection_service", return_value=mock_conn_svc):
client = _make_client({get_config_manager: lambda: MagicMock()})
resp = client.delete("/api/settings/connections/conn-1")
client = _make_client({
get_config_manager: lambda: MagicMock(),
_get_connection_service: lambda: mock_conn_svc,
})
resp = client.delete("/api/settings/connections/conn-1")
assert resp.status_code == 200
def test_in_use(self):
@@ -727,10 +799,13 @@ class TestDeleteConnection:
"success": False, "blocking_jobs": ["job-1"],
}
from src.api.routes.settings import _get_connection_service
from src.dependencies import get_config_manager
with patch("src.api.routes.settings._get_connection_service", return_value=mock_conn_svc):
client = _make_client({get_config_manager: lambda: MagicMock()})
resp = client.delete("/api/settings/connections/conn-1")
client = _make_client({
get_config_manager: lambda: MagicMock(),
_get_connection_service: lambda: mock_conn_svc,
})
resp = client.delete("/api/settings/connections/conn-1")
assert resp.status_code == 409
@@ -743,9 +818,12 @@ class TestTestConnectionEndpoint:
mock_conn_svc = MagicMock()
mock_conn_svc.test_connection = AsyncMock(return_value={"success": True})
from src.api.routes.settings import _get_connection_service
from src.dependencies import get_config_manager
with patch("src.api.routes.settings._get_connection_service", return_value=mock_conn_svc):
client = _make_client({get_config_manager: lambda: MagicMock()})
resp = client.post("/api/settings/connections/conn-1/test")
client = _make_client({
get_config_manager: lambda: MagicMock(),
_get_connection_service: lambda: mock_conn_svc,
})
resp = client.post("/api/settings/connections/conn-1/test")
assert resp.status_code == 200
# #endregion Test.Api.Settings