feat: add node coverage and improve investigation presentation
This commit is contained in:
@@ -598,6 +598,42 @@ async def test_unified_commands_record_canonical_events_without_mutating_task(pa
|
||||
assert len(repository.events) == 1 and repository.task["revision"] == task["revision"]
|
||||
|
||||
|
||||
@pytest.mark.anyio
|
||||
async def test_saved_mcp_coverage_envelope_publishes_groups_without_agent_geometry():
|
||||
from fastapi.encoders import jsonable_encoder
|
||||
from app.services.node_coverage import build_node_coverage
|
||||
|
||||
now = datetime(2026, 10, 10, tzinfo=timezone.utc)
|
||||
context = _context()
|
||||
task = _task_document(context, now, lease=now + timedelta(minutes=1))
|
||||
repository = RunTaskRepository(task, _active_run(task, now))
|
||||
service = OperationalTaskService(repository, context, set(), clock=lambda: now)
|
||||
coverage = build_node_coverage(
|
||||
[{"group_id": "one", "title": "第一组", "node_ids": ["A"]},
|
||||
{"group_id": "two", "title": "第二组", "node_ids": ["A", "B"]}],
|
||||
[{"id": "A", "longitude": 117.24, "latitude": 32.75},
|
||||
{"id": "B", "longitude": 117.241, "latitude": 32.75}],
|
||||
[],
|
||||
)
|
||||
snapshot = TaskDataSnapshot(
|
||||
source="generate_node_coverage", source_ref="mcp:node-coverage", queried_at=now,
|
||||
origin="system_data", truncated=False,
|
||||
data=jsonable_encoder({"source": "generate_node_coverage", "data": {
|
||||
"result": {"map_payload": coverage["map_payload"]},
|
||||
}}),
|
||||
)
|
||||
evidence, _ = await service.record_data_snapshot(task["task_id"], snapshot)
|
||||
await service.publish_presentation_event(task["task_id"], TaskPresentationEventCommand(
|
||||
request_id=uuid4(), run_id=repository.run["run_id"], source_session_id="session-1",
|
||||
command={"action": "set_overlay", "overlay_id": "isolation-coverage", "title": "节点覆盖示意",
|
||||
"mode": "geometry", "evidence_id": evidence.evidence_id},
|
||||
))
|
||||
features = repository.events[-1]["metadata"]["command"]["data"]["features"]
|
||||
assert {feature["properties"]["coverage_group"] for feature in features} == {"one", "two"}
|
||||
assert all(feature["properties"]["display_only"] for feature in features)
|
||||
assert [feature["properties"]["node_count"] for feature in features] == [1, 2]
|
||||
|
||||
|
||||
@pytest.mark.anyio
|
||||
async def test_overlay_event_uses_stored_coordinates_and_rejects_untrusted_or_oversized_data():
|
||||
now = datetime(2026, 10, 10, tzinfo=timezone.utc)
|
||||
|
||||
Reference in New Issue
Block a user