fix(scada): preserve observation fields in chart evidence
Generic Container CI/CD / test-build-publish (push) Successful in 4m10s
Server CI/CD v2 / build-test-publish-and-deploy (push) Successful in 4m10s

This commit is contained in:
2026-11-12 12:22:07 +08:00
parent 2e8fe86f3f
commit 1892b1d1f0
5 changed files with 75 additions and 3 deletions
@@ -1,5 +1,6 @@
"""SCADA display coverage is independent of whether a device supports a conclusion."""
from datetime import datetime, timedelta, timezone
from copy import deepcopy
from uuid import uuid4
import pytest
@@ -16,6 +17,44 @@ END = datetime(2026, 7, 16, tzinfo=timezone.utc)
START = END - timedelta(hours=3)
@pytest.mark.anyio
async def test_value_only_detail_evidence_cannot_claim_missing_observations():
from app.services.scada_presentation_coverage import verify_chart
task, repository, _, evidence_id = await investigation()
detail = deepcopy(repository.evidence[evidence_id])
detail["evidence_id"] = "detail-values"
rows = detail["data_snapshot"]["data"]["data"]["readings"]
detail["data_snapshot"]["data"]["data"] = [
{"device_id": row["device_id"], "time": row["time"], "value": row["monitored_value"]}
for row in rows
]
value = chart(devices=["524529"])
value["series"][0].update(data=[None] * 13, sample_times=[None] * 13)
with pytest.raises(DomainError) as failure:
verify_chart(task, value, [repository.evidence[evidence_id], detail], ["detail-values"])
assert failure.value.code == "SCADA_CHART_EVIDENCE_REQUIRED"
@pytest.mark.anyio
@pytest.mark.parametrize("field", ["monitored_value", "cleaned_value"])
async def test_detail_fields_do_not_discard_other_observed_fields(field):
from app.services.scada_presentation_coverage import verify_chart
task, repository, _, evidence_id = await investigation()
detail = deepcopy(repository.evidence[evidence_id])
detail["evidence_id"] = "detail-cleaned"
rows = detail["data_snapshot"]["data"]["data"]["readings"]
detail["data_snapshot"]["data"]["data"] = [
{"device_id": row["device_id"], "time": row["time"], "value": row["cleaned_value"] + 10,
"cleaned_value": row["cleaned_value"] + 10} for row in rows
]
value = chart(devices=["524529"])
value["scada"]["value_field"] = field
if field == "cleaned_value":
value["series"][0]["data"] = [point + 10 for point in value["series"][0]["data"]]
result = verify_chart(task, value, [repository.evidence[evidence_id], detail], [evidence_id, "detail-cleaned"])
assert result["gaps"] == []
@pytest.fixture
def anyio_backend():
return "asyncio"