mod common;
use common::TestServer;
use hyperdb_api_core::client::{AsyncClient, Config};
async fn async_client(server: &TestServer) -> AsyncClient {
let config: Config = server.config();
AsyncClient::connect(&config).await.expect("connect async")
}
#[tokio::test(flavor = "current_thread")]
async fn explicit_close_returns_ok_and_suppresses_drop() {
let server = TestServer::new().expect("test server");
let client = async_client(&server).await;
let stmt = client.prepare("SELECT 42 AS v").await.expect("prepare");
stmt.close(&client).await.expect("close");
let rows = client
.query("SELECT 1 AS v")
.await
.expect("post-close query");
assert_eq!(rows.len(), 1);
client.close().await.expect("close client");
}
#[tokio::test(flavor = "current_thread")]
async fn drop_without_explicit_close_keeps_connection_usable() {
let server = TestServer::new().expect("test server");
let client = async_client(&server).await;
{
let _stmt = client.prepare("SELECT 100 AS v").await.expect("prepare");
}
tokio::task::yield_now().await;
tokio::task::yield_now().await;
let stmt2 = client
.prepare("SELECT 200 AS v")
.await
.expect("second prepare");
let _ = client
.execute_prepared(&stmt2, &[] as &[Option<Vec<u8>>])
.await
.expect("execute after drop");
stmt2.close(&client).await.expect("close stmt2");
client.close().await.expect("close client");
}
#[tokio::test(flavor = "current_thread")]
async fn many_drops_in_sequence() {
let server = TestServer::new().expect("test server");
let client = async_client(&server).await;
for _ in 0..20 {
let _stmt = client.prepare("SELECT 1 AS v").await.expect("prepare");
}
for _ in 0..5 {
tokio::task::yield_now().await;
}
let rows = client
.query("SELECT 99 AS v")
.await
.expect("query after drops");
assert_eq!(rows.len(), 1);
client.close().await.expect("close client");
}