use anyhow::Result;
use uni_db::{DataType, Uni};
#[tokio::test]
async fn test_reader_isolation_lifecycle() -> Result<()> {
let db = Uni::in_memory().build().await?;
db.schema()
.label("Person")
.property("name", DataType::String)
.apply()
.await?;
let session = db.session();
let tx = session.tx().await?;
tx.execute("CREATE (:Person {name: 'Alice'})").await?;
tx.commit().await?;
let result = db
.session()
.query("MATCH (n:Person {name: 'Alice'}) RETURN n.name AS name")
.await?;
assert_eq!(result.len(), 1, "Should find Alice after commit");
assert_eq!(result.rows()[0].get::<String>("name")?, "Alice");
db.flush().await?;
let result = db
.session()
.query("MATCH (n:Person {name: 'Alice'}) RETURN n.name AS name")
.await?;
assert_eq!(result.len(), 1, "Should find Alice after flush");
let session = db.session();
let tx = session.tx().await?;
tx.execute("MATCH (n:Person {name: 'Alice'}) DELETE n")
.await?;
tx.commit().await?;
let result = db
.session()
.query("MATCH (n:Person {name: 'Alice'}) RETURN n.name")
.await?;
assert_eq!(result.len(), 0, "Should NOT find Alice (L0 tombstone)");
db.flush().await?;
let result = db
.session()
.query("MATCH (n:Person {name: 'Alice'}) RETURN n.name")
.await?;
assert_eq!(
result.len(),
0,
"Should NOT find Alice (deleted in storage)"
);
Ok(())
}