mod common;
use common::pgwire_harness::TestServer;
#[tokio::test]
async fn show_lineage_three_deep_chain() {
let server = TestServer::start().await;
let client = &*server.client;
client
.simple_query("CREATE DATABASE lineage_a")
.await
.expect("CREATE DATABASE lineage_a");
client
.simple_query("USE DATABASE lineage_a")
.await
.expect("USE lineage_a");
client
.simple_query(
"CREATE COLLECTION nodes (id STRING PRIMARY KEY, label STRING) WITH (engine='kv')",
)
.await
.expect("CREATE COLLECTION nodes");
client
.simple_query("INSERT INTO nodes (id, label) VALUES ('n1', 'root')")
.await
.expect("INSERT n1");
client
.simple_query("USE DATABASE default")
.await
.expect("USE default");
client
.simple_query("CLONE DATABASE lineage_b FROM lineage_a")
.await
.expect("CLONE lineage_b FROM lineage_a");
client
.simple_query("CLONE DATABASE lineage_c FROM lineage_b")
.await
.expect("CLONE lineage_c FROM lineage_b");
let rows = client
.simple_query("SHOW DATABASE LINEAGE FOR lineage_c")
.await
.expect("SHOW DATABASE LINEAGE FOR lineage_c");
let data_rows: Vec<String> = rows
.iter()
.filter_map(|m| {
if let tokio_postgres::SimpleQueryMessage::Row(r) = m {
Some(r.get("name").unwrap_or("").to_string())
} else {
None
}
})
.collect();
assert!(
data_rows.contains(&"lineage_c".to_string()),
"lineage_c missing from lineage output: {data_rows:?}"
);
assert!(
data_rows.contains(&"lineage_b".to_string()),
"lineage_b missing from lineage output: {data_rows:?}"
);
assert!(
data_rows.contains(&"lineage_a".to_string()),
"lineage_a missing from lineage output: {data_rows:?}"
);
assert_eq!(
data_rows.first().map(String::as_str),
Some("lineage_c"),
"first row must be the queried database (lineage_c), got: {data_rows:?}"
);
assert_eq!(
data_rows.last().map(String::as_str),
Some("lineage_a"),
"last row must be the root (lineage_a), got: {data_rows:?}"
);
}
#[tokio::test]
async fn show_lineage_root_database_returns_one_row() {
let server = TestServer::start().await;
let client = &*server.client;
client
.simple_query("CREATE DATABASE lineage_root_only")
.await
.expect("CREATE DATABASE lineage_root_only");
let rows = client
.simple_query("SHOW DATABASE LINEAGE FOR lineage_root_only")
.await
.expect("SHOW DATABASE LINEAGE FOR lineage_root_only");
let data_rows: Vec<String> = rows
.iter()
.filter_map(|m| {
if let tokio_postgres::SimpleQueryMessage::Row(r) = m {
Some(r.get("name").unwrap_or("").to_string())
} else {
None
}
})
.collect();
assert_eq!(
data_rows.len(),
1,
"root-only database must return exactly 1 row, got: {data_rows:?}"
);
assert_eq!(data_rows[0], "lineage_root_only");
}