use uni_db::Uni;
#[tokio::test]
async fn test_locy_register_persists_rules() -> anyhow::Result<()> {
let db = Uni::in_memory().build().await?;
db.schema()
.label("Node")
.property("name", uni_common::core::schema::DataType::String)
.property_nullable("val", uni_common::core::schema::DataType::Int64)
.edge_type("EDGE", &["Node"], &["Node"])
.done()
.apply()
.await?;
let tx = db.session().tx().await?;
tx.execute(
"CREATE (a:Node {name: 'A', val: 1})-[:EDGE]->(b:Node {name: 'B', val: 2})-[:EDGE]->(c:Node {name: 'C', val: 3})",
)
.await?;
tx.commit().await?;
db.flush().await?;
db.rules().register(
"CREATE RULE reach AS
MATCH (a:Node)-[:EDGE]->(b:Node)
YIELD KEY a, KEY b",
)?;
let result = db.session().locy("QUERY reach WHERE a.name = 'A'").await?;
assert!(
result.derived.contains_key("reach"),
"Should have 'reach' derived relation"
);
let facts = &result.derived["reach"];
assert!(
facts.len() >= 2,
"Should find at least 2 facts (A→B, A→C), got {}",
facts.len()
);
Ok(())
}
#[tokio::test]
async fn test_locy_clear_removes_registered_rules() -> anyhow::Result<()> {
let db = Uni::in_memory().build().await?;
db.schema()
.label("Node")
.property("name", uni_common::core::schema::DataType::String)
.edge_type("EDGE", &["Node"], &["Node"])
.done()
.apply()
.await?;
let tx = db.session().tx().await?;
tx.execute("CREATE (:Node {name: 'A'})-[:EDGE]->(:Node {name: 'B'})")
.await?;
tx.commit().await?;
db.flush().await?;
db.rules().register(
"CREATE RULE reach AS
MATCH (a:Node)-[:EDGE]->(b:Node)
YIELD KEY a, KEY b",
)?;
db.rules().clear();
let result = db.session().locy("QUERY reach WHERE a.name = 'A'").await;
assert!(result.is_err(), "Should fail when querying a cleared rule");
Ok(())
}