fix(scada): verify first sample after field completion
This commit is contained in:
@@ -1128,8 +1128,8 @@ async def test_burst_waits_for_completion_then_scada_evidence_then_agent_report(
|
||||
at = returned + timedelta(minutes=15 * sample)
|
||||
rows.extend({"time": at - timedelta(days=day), "device_id": "P1", "monitored_value": 100.} for day in range(1, 16))
|
||||
rows.append({"time": at, "device_id": "P1", "monitored_value": 100.})
|
||||
reader = AsyncMock(return_value=rows[:-1])
|
||||
monkeypatch.setattr("app.infra.db.timescaledb.repositories.scada.ScadaRepository.get_scada_by_ids_time_range", reader)
|
||||
reader = AsyncMock(return_value=[row for row in rows if row["time"] < incident])
|
||||
monkeypatch.setattr("app.infra.db.timescaledb.repositories.scada.ScadaRepository.get_recovery_scada_readings", reader)
|
||||
assert await reconcile_recoveries(service, timescale, settings) == 0
|
||||
assert repository.task["handling_context"]["phase"] == "waiting_scada"
|
||||
reader.return_value = rows
|
||||
@@ -1138,23 +1138,24 @@ async def test_burst_waits_for_completion_then_scada_evidence_then_agent_report(
|
||||
recovery = repository.task["handling_context"]
|
||||
evidence_id = recovery["verification_evidence_id"]
|
||||
assert repository.evidence[evidence_id]["data_snapshot"]["data"]["status"] == "passed"
|
||||
assert repository.evidence[evidence_id]["data_snapshot"]["data"]["verified_through"] == (returned + timedelta(minutes=15)).isoformat()
|
||||
service._resolve_investigation_alerts.assert_not_awaited()
|
||||
|
||||
# Correcting the appointment's field return time invalidates the old proof
|
||||
# and requires two actual observations after the new business time.
|
||||
# and selects the nearest actual observation after the new business time.
|
||||
corrected_time = returned + timedelta(minutes=15)
|
||||
await service.external_feedback(task["task_id"], ExternalFeedbackCommand(
|
||||
request_id=uuid4(), source_event_id=f"peripheral_sample:{child_id}", source_revision=3,
|
||||
status="completed", occurred_at=corrected_time, detail="修订现场实际完工时间"))
|
||||
assert repository.task["handling_context"]["phase"] == "waiting_scada"
|
||||
assert "verification_evidence_id" not in repository.task["handling_context"]
|
||||
reader.return_value = [row for row in rows if row["time"] <= corrected_time]
|
||||
assert await reconcile_recoveries(service, timescale, settings) == 0
|
||||
at = returned + timedelta(minutes=45)
|
||||
rows.extend({"time": at - timedelta(days=day), "device_id": "P1", "monitored_value": 100.} for day in range(1, 16))
|
||||
rows.append({"time": at, "device_id": "P1", "monitored_value": 100.})
|
||||
reader.return_value = rows
|
||||
assert await reconcile_recoveries(service, timescale, settings) == 1
|
||||
revised_id = repository.task["handling_context"]["verification_evidence_id"]
|
||||
assert revised_id != evidence_id and evidence_id in repository.evidence
|
||||
assert repository.evidence[revised_id]["data_snapshot"]["data"]["verified_through"] == (returned + timedelta(minutes=30)).isoformat()
|
||||
evidence_id = revised_id
|
||||
|
||||
repository.task.update(status="running", agent_session_id="session-1")
|
||||
|
||||
Reference in New Issue
Block a user