mod common;
use linkrs_core::types::{EdgeTypeInfo, PropertyDef, VertexId};
use linkrs_core::DataType;
use linkrs_core::Value;
use linkrs_storage::{StorageReader, StorageSchemaOps, StorageWriter};
#[test]
fn test_schema_vertex_edge_full_lifecycle() {
let mut storage = common::create_in_memory_storage();
common::setup_basic_schema(&mut storage);
common::insert_test_data(&mut storage, "test_space");
common::verify_test_data(&storage, "test_space");
assert!(storage.space_exists("test_space"));
assert_eq!(storage.list_spaces().unwrap().len(), 1);
assert!(storage.get_tag("test_space", "Person").unwrap().is_some());
assert!(storage
.get_edge_type("test_space", "KNOWS")
.unwrap()
.is_some());
}
#[test]
fn test_index_created_after_data_insertion() {
let mut storage = common::create_in_memory_storage();
common::setup_basic_schema(&mut storage);
common::insert_test_data(&mut storage, "test_space");
common::create_person_name_index(&mut storage, "test_space");
storage
.rebuild_tag_index("test_space", "person_name_idx")
.unwrap();
let alice = storage
.lookup_index("test_space", "person_name_idx", &Value::string("Alice"))
.unwrap();
assert_eq!(
alice,
vec![Value::from(
VertexId::try_from_int64(1).expect("test vertex id")
)]
);
let bob = storage
.lookup_index("test_space", "person_name_idx", &Value::string("Bob"))
.unwrap();
assert_eq!(
bob,
vec![Value::from(
VertexId::try_from_int64(2).expect("test vertex id")
)]
);
}
#[test]
fn test_space_isolation() {
let mut storage = common::create_in_memory_storage();
common::create_space(&mut storage, "alpha");
common::create_space(&mut storage, "beta");
common::create_person_tag(&mut storage, "alpha");
common::create_person_tag(&mut storage, "beta");
let knows = EdgeTypeInfo::new("KNOWS".to_string())
.with_src_tag("Person".to_string())
.with_dst_tag("Person".to_string())
.with_properties(vec![PropertyDef::new("since".to_string(), DataType::Int)]);
storage.create_edge_type("alpha", &knows).unwrap();
let alice = common::create_person_vertex(1, "Alice", 30);
storage.insert_vertex("alpha", alice).unwrap();
let bob = common::create_person_vertex(1, "Bob", 25);
storage.insert_vertex("beta", bob).unwrap();
let alpha_vertex = storage
.get_vertex(
"alpha",
"Person",
&VertexId::try_from_int64(1).expect("test vertex id"),
)
.unwrap()
.unwrap();
let beta_vertex = storage
.get_vertex(
"beta",
"Person",
&VertexId::try_from_int64(1).expect("test vertex id"),
)
.unwrap()
.unwrap();
assert_eq!(
alpha_vertex.properties().get("name"),
Some(&Value::string("Alice"))
);
assert_eq!(
beta_vertex.properties().get("name"),
Some(&Value::string("Bob"))
);
assert!(storage.get_edge_type("alpha", "KNOWS").unwrap().is_some());
assert!(storage.get_edge_type("beta", "KNOWS").unwrap().is_none());
}
#[test]
fn test_drop_index_keeps_data_intact() {
let mut storage = common::create_in_memory_storage();
common::setup_basic_schema(&mut storage);
common::insert_test_data(&mut storage, "test_space");
common::create_person_name_index(&mut storage, "test_space");
storage
.rebuild_tag_index("test_space", "person_name_idx")
.unwrap();
storage
.drop_tag_index("test_space", "person_name_idx")
.unwrap();
let vertices = storage.scan_vertices("test_space").unwrap();
assert_eq!(vertices.len(), 2);
let names: Vec<&str> = vertices
.iter()
.filter_map(|v| {
v.properties().get("name").and_then(|v| match v {
Value::String(s) => Some(s.as_str()),
_ => None,
})
})
.collect();
assert!(names.contains(&"Alice"));
assert!(names.contains(&"Bob"));
}
#[test]
fn test_scan_vertices_by_property_match() {
let mut storage = common::create_in_memory_storage();
common::setup_basic_schema(&mut storage);
for i in 1..=5 {
let vertex = common::create_person_vertex(i, &format!("Person{}", i), 20 + i);
storage.insert_vertex("test_space", vertex).unwrap();
}
let result = storage
.scan_vertices_by_prop("test_space", "Person", "name", &Value::string("Person3"))
.unwrap();
assert_eq!(result.len(), 1);
assert_eq!(
result[0].properties().get("name"),
Some(&Value::string("Person3"))
);
let age_result = storage
.scan_vertices_by_prop("test_space", "Person", "age", &Value::BigInt(23))
.unwrap();
assert_eq!(age_result.len(), 1);
let empty_result = storage
.scan_vertices_by_prop("test_space", "Person", "name", &Value::string("Nobody"))
.unwrap();
assert!(empty_result.is_empty());
}