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