feat(scada): add project monitoring replay
Generic Container CI/CD / test-build-publish (push) Successful in 3m39s
Server CI/CD v2 / build-test-publish-and-deploy (push) Successful in 3m39s

This commit is contained in:
2026-11-04 14:27:21 +08:00
parent f25423dec4
commit 26fa5d1909
53 changed files with 5153 additions and 20 deletions
@@ -616,3 +616,52 @@ def test_project_map_config_accepts_search_and_preserves_extra_options():
AdminProjectUpdateRequest(map_config=None)
with pytest.raises(ValidationError):
AdminProjectUpdateRequest(map_config={'place_search': {'enabled': True, 'admin_code': 'wrong', 'region': '凤阳县'}})
def test_project_scada_monitoring_interval_is_a_strict_schedule_parameter():
from pydantic import ValidationError
from app.domain.schemas.admin_metadata import AdminProjectUpdateRequest
config = {
"scada_monitoring_interval_seconds": 900,
"future_option": {"enabled": True, "values": [1, "demo", None]},
}
request = AdminProjectUpdateRequest(settings=config)
assert request.model_dump(exclude_unset=True) == {"settings": config}
for value in (0, 59, True, 900.0, "900", 31_536_001):
with pytest.raises(ValidationError):
AdminProjectUpdateRequest(settings={"scada_monitoring_interval_seconds": value})
for value in (None, [], "settings", {"future_option": object()}):
with pytest.raises(ValidationError):
AdminProjectUpdateRequest(settings=value)
assert AdminProjectUpdateRequest().model_dump(exclude_unset=True) == {}
assert AdminProjectUpdateRequest(settings={}).model_dump(exclude_unset=True) == {"settings": {}}
assert AdminProjectUpdateRequest(
settings={"scada_monitoring_interval_seconds": None}
).model_dump(exclude_unset=True) == {"settings": {"scada_monitoring_interval_seconds": None}}
@pytest.mark.anyio
async def test_update_project_passes_only_requested_settings_and_returns_extra_keys(monkeypatch):
from app.domain.schemas.admin_metadata import AdminProjectUpdateRequest
now = datetime.now(timezone.utc)
project = _project(
code="demo", description=None, gs_workspace="demo", map_extent=None,
settings={"scada_monitoring_interval_seconds": 900, "future_option": {"enabled": True}},
status="active", created_at=now, updated_at=now,
)
repo = SimpleNamespace(session=object(), update_project=AsyncMock(return_value=project))
monkeypatch.setattr(admin_metadata, "log_audit_event", AsyncMock())
response = await admin_metadata.update_admin_project(
AdminProjectUpdateRequest(settings={"future_option": {"enabled": True}}),
project_id=project.id,
current_user=_user(role="admin", is_superuser=True),
metadata_repo=repo,
)
repo.update_project.assert_awaited_once_with(
project.id, updates={"settings": {"future_option": {"enabled": True}}}
)
assert response.settings.model_dump() == {**project.settings, "scada_monitoring": None}