|
17 | 17 | from java_ontology import VALID_RESOLVE_REASONS |
18 | 18 |
|
19 | 19 | from mcp_v2 import ( |
| 20 | + Edge, |
20 | 21 | NodeFilter, |
21 | 22 | _NODEFILTER_APPLICABLE_FIELDS, |
22 | 23 | describe_v2, |
@@ -1559,6 +1560,49 @@ def test_neighbors_dedup_calls_collapses_identical_dst(kuzu_graph) -> None: |
1559 | 1560 | assert multi, "dedup_calls should emit call_site_count on collapsed rows" |
1560 | 1561 |
|
1561 | 1562 |
|
| 1563 | +def test_describe_ucs_id_not_describable(kuzu_graph) -> None: |
| 1564 | + rows = kuzu_graph._rows( # noqa: SLF001 |
| 1565 | + "MATCH (u:UnresolvedCallSite) RETURN u.id AS id LIMIT 1", |
| 1566 | + ) |
| 1567 | + assert rows |
| 1568 | + ucs_id = str(rows[0]["id"]) |
| 1569 | + assert ucs_id.startswith("ucs:") |
| 1570 | + out = describe_v2(ucs_id, graph=kuzu_graph) |
| 1571 | + assert out.success is False |
| 1572 | + assert out.record is None |
| 1573 | + assert "not describable" in (out.message or "").lower() |
| 1574 | + assert "unresolved-calls" in (out.message or "").lower() |
| 1575 | + |
| 1576 | + |
| 1577 | +def test_neighbors_dedup_calls_include_unresolved(kuzu_graph) -> None: |
| 1578 | + mid = client_message_processor_process_id(kuzu_graph) |
| 1579 | + out = neighbors_v2( |
| 1580 | + mid, |
| 1581 | + direction="out", |
| 1582 | + edge_types=["CALLS"], |
| 1583 | + include_unresolved=True, |
| 1584 | + dedup_calls=True, |
| 1585 | + limit=500, |
| 1586 | + graph=kuzu_graph, |
| 1587 | + ) |
| 1588 | + assert out.success is True |
| 1589 | + kinds = {str((e.attrs or {}).get("row_kind") or "resolved") for e in out.results} |
| 1590 | + assert "resolved" in kinds |
| 1591 | + assert "unresolved_call_site" in kinds |
| 1592 | + keys = [_calls_transcript_sort_key_from_edge(e) for e in out.results] |
| 1593 | + assert keys == sorted(keys) |
| 1594 | + resolved = [e for e in out.results if (e.attrs or {}).get("row_kind") == "resolved"] |
| 1595 | + assert any(int((e.attrs or {}).get("call_site_count") or 0) > 1 for e in resolved) |
| 1596 | + |
| 1597 | + |
| 1598 | +def _calls_transcript_sort_key_from_edge(edge: Edge) -> tuple[int, int, int]: |
| 1599 | + attrs = edge.attrs or {} |
| 1600 | + line = int(attrs.get("call_site_line") or 0) |
| 1601 | + byte = int(attrs.get("call_site_byte") or 0) |
| 1602 | + kind_rank = 0 if str(attrs.get("row_kind") or "resolved") == "resolved" else 1 |
| 1603 | + return (line, byte, kind_rank) |
| 1604 | + |
| 1605 | + |
1562 | 1606 | def test_describe_unresolved_call_sites_rollup_cap_footer_and_total(kuzu_graph) -> None: |
1563 | 1607 | mid = client_message_processor_process_id(kuzu_graph) |
1564 | 1608 | out = describe_v2(mid, graph=kuzu_graph) |
|
0 commit comments