import json from pathlib import Path from graphify.build import build_from_json, build FIXTURES = Path(__file__).parent / "fixtures" def load_extraction(): return json.loads((FIXTURES / "extraction.json").read_text()) def test_build_from_json_node_count(): G = build_from_json(load_extraction()) assert G.number_of_nodes() == 4 def test_build_from_json_edge_count(): G = build_from_json(load_extraction()) assert G.number_of_edges() == 4 def test_nodes_have_label(): G = build_from_json(load_extraction()) assert G.nodes["n_transformer"]["label"] == "Transformer" def test_edges_have_confidence(): G = build_from_json(load_extraction()) data = G.edges["n_attention", "n_concept_attn"] assert data["confidence"] == "INFERRED" def test_ambiguous_edge_preserved(): G = build_from_json(load_extraction()) data = G.edges["n_layernorm", "n_concept_attn"] assert data["confidence"] == "AMBIGUOUS" def test_legacy_node_source_canonicalized(): """Legacy 'source' key on nodes is renamed to 'source_file' before graph build.""" ext = {"nodes": [{"id": "n1", "label": "A", "file_type": "code", "source": "a.py"}], "edges": [], "input_tokens": 0, "output_tokens": 0} G = build_from_json(ext) assert "source_file" in G.nodes["n1"] assert G.nodes["n1"]["source_file"] == "a.py" assert "source" not in G.nodes["n1"] def test_legacy_edge_from_to_canonicalized(): """Legacy 'from'/'to' keys on edges are accepted alongside 'source'/'target'.""" ext = {"nodes": [{"id": "n1", "label": "A", "file_type": "code", "source_file": "a.py"}, {"id": "n2", "label": "B", "file_type": "code", "source_file": "b.py"}], "edges": [{"from": "n1", "to": "n2", "relation": "calls", "confidence": "EXTRACTED", "source_file": "a.py", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} G = build_from_json(ext) assert G.number_of_edges() == 1 def test_build_merges_multiple_extractions(): ext1 = {"nodes": [{"id": "n1", "label": "A", "file_type": "code", "source_file": "a.py"}], "edges": [], "input_tokens": 0, "output_tokens": 0} ext2 = {"nodes": [{"id": "n2", "label": "B", "file_type": "document", "source_file": "b.md"}], "edges": [{"source": "n1", "target": "n2", "relation": "references", "confidence": "INFERRED", "source_file": "b.md", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0} G = build([ext1, ext2]) assert G.number_of_nodes() == 2 assert G.number_of_edges() == 1