use sqlitegraph::{EdgeSpec, GraphConfig, NodeSpec, open_graph};
#[test]
fn test_graph_enforces_node_existence_before_edge_insert() {
let temp_dir = tempfile::tempdir().unwrap();
let db_path = temp_dir.path().join("test.db");
let graph =
open_graph(&db_path, &GraphConfig::native()).expect("Failed to create V2 native graph");
let existing_node_id = graph
.insert_node(NodeSpec {
kind: "Node".to_string(),
name: "existing_node".to_string(),
file_path: None,
data: serde_json::json!({"id": 1}),
})
.expect("Failed to insert existing node");
let node_ids: Vec<i64> = (2..=6)
.map(|i| {
graph
.insert_node(NodeSpec {
kind: "Node".to_string(),
name: format!("node_{}", i),
file_path: None,
data: serde_json::json!({"id": i}),
})
.expect(&format!("Failed to insert node {}", i))
})
.collect();
let result = graph.insert_edge(EdgeSpec {
from: 7, to: existing_node_id,
edge_type: "test".to_string(),
data: serde_json::json!({"test": "source_missing"}),
});
assert!(
result.is_err(),
"Edge insertion to non-existent source node should fail"
);
let error_msg = result.unwrap_err().to_string();
assert!(
error_msg.contains("not found") || error_msg.contains("7"),
"Error should mention missing node, got: {}",
error_msg
);
let result = graph.insert_edge(EdgeSpec {
from: existing_node_id,
to: 8, edge_type: "test".to_string(),
data: serde_json::json!({"test": "target_missing"}),
});
assert!(
result.is_err(),
"Edge insertion to non-existent target node should fail"
);
let error_msg = result.unwrap_err().to_string();
assert!(
error_msg.contains("not found") || error_msg.contains("8"),
"Error should mention missing node, got: {}",
error_msg
);
let result = graph.insert_edge(EdgeSpec {
from: 9, to: 10, edge_type: "test".to_string(),
data: serde_json::json!({"test": "both_missing"}),
});
assert!(
result.is_err(),
"Edge insertion between two non-existent nodes should fail"
);
let error_msg = result.unwrap_err().to_string();
assert!(
error_msg.contains("not found") || error_msg.contains("9"),
"Error should mention missing source node, got: {}",
error_msg
);
let result = graph.insert_edge(EdgeSpec {
from: existing_node_id,
to: node_ids[0], edge_type: "valid".to_string(),
data: serde_json::json!({"test": "both_exist"}),
});
assert!(
result.is_ok(),
"Edge insertion between two existing nodes should succeed"
);
println!("✅ Graph layer correctly enforces node existence before edge insertion");
println!("✅ All invalid edge insertions fail deterministically");
println!("✅ Valid edge insertions succeed as expected");
}