|
| 1 | +from __future__ import annotations |
| 2 | + |
| 3 | +from bugfinder.knowledge_graph.graph import KnowledgeGraph |
| 4 | +from bugfinder.knowledge_graph.schema import EdgeType, NodeType |
| 5 | + |
| 6 | + |
| 7 | +class TestKnowledgeGraphExtended: |
| 8 | + def test_get_node_nonexistent(self) -> None: |
| 9 | + kg = KnowledgeGraph() |
| 10 | + assert kg.get_node("nonexistent") is None |
| 11 | + |
| 12 | + def test_get_neighbors_nonexistent(self) -> None: |
| 13 | + kg = KnowledgeGraph() |
| 14 | + assert kg.get_neighbors("nonexistent") == [] |
| 15 | + |
| 16 | + def test_add_duplicate_node(self) -> None: |
| 17 | + kg = KnowledgeGraph() |
| 18 | + kg.add_node("a", NodeType.DOMAIN, name="First") |
| 19 | + kg.add_node("a", NodeType.DOMAIN, name="Second") |
| 20 | + node = kg.get_node("a") |
| 21 | + assert node is not None |
| 22 | + assert node["name"] == "Second" |
| 23 | + |
| 24 | + def test_find_paths_no_path(self) -> None: |
| 25 | + kg = KnowledgeGraph() |
| 26 | + kg.add_node("a", NodeType.DOMAIN) |
| 27 | + kg.add_node("b", NodeType.IP_ADDRESS) |
| 28 | + paths = kg.find_paths("a", "b") |
| 29 | + assert paths == [] |
| 30 | + |
| 31 | + def test_find_paths_max_depth(self) -> None: |
| 32 | + kg = KnowledgeGraph() |
| 33 | + kg.add_node("a", NodeType.DOMAIN) |
| 34 | + kg.add_node("b", NodeType.IP_ADDRESS) |
| 35 | + kg.add_node("c", NodeType.FINDING) |
| 36 | + kg.add_edge("a", "b", EdgeType.RESOLVES_TO) |
| 37 | + kg.add_edge("b", "c", EdgeType.HAS_FINDING) |
| 38 | + paths = kg.find_paths("a", "c", max_depth=1) |
| 39 | + assert paths == [] |
| 40 | + |
| 41 | + def test_clear(self) -> None: |
| 42 | + kg = KnowledgeGraph() |
| 43 | + kg.add_node("a", NodeType.DOMAIN) |
| 44 | + kg.clear() |
| 45 | + assert kg.node_count == 0 |
| 46 | + assert kg.edge_count == 0 |
| 47 | + |
| 48 | + def test_to_dict_empty(self) -> None: |
| 49 | + kg = KnowledgeGraph() |
| 50 | + data = kg.to_dict() |
| 51 | + assert data["nodes"] == [] |
| 52 | + assert data["edges"] == [] |
| 53 | + |
| 54 | + def test_get_nodes_by_type_none(self) -> None: |
| 55 | + kg = KnowledgeGraph() |
| 56 | + assert kg.get_nodes_by_type("nonexistent") == [] |
| 57 | + |
| 58 | + def test_get_finding_chain(self) -> None: |
| 59 | + kg = KnowledgeGraph() |
| 60 | + kg.add_node("finding-1", NodeType.FINDING) |
| 61 | + kg.add_node("host-1", NodeType.HOST) |
| 62 | + kg.add_edge("finding-1", "host-1", EdgeType.HAS_FINDING) |
| 63 | + chain = kg.get_finding_chain("finding-1") |
| 64 | + assert len(chain) == 1 |
| 65 | + assert chain[0]["node"] == "host-1" |
| 66 | + |
| 67 | + def test_merge_keeps_existing_nodes(self) -> None: |
| 68 | + kg1 = KnowledgeGraph() |
| 69 | + kg1.add_node("a", NodeType.DOMAIN) |
| 70 | + kg2 = KnowledgeGraph() |
| 71 | + kg2.add_node("a", NodeType.DOMAIN, extra="data") |
| 72 | + kg2.add_node("b", NodeType.DOMAIN) |
| 73 | + kg1.merge(kg2) |
| 74 | + assert kg1.node_count == 2 |
| 75 | + node = kg1.get_node("a") |
| 76 | + assert node is not None |
0 commit comments