use qail_core::prelude::{JoinKind, Operator, Qail, SortOrder, Value};
use qail_pg::driver::PgDriver;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("๐ฅ QAIL Deep Battle Test");
println!("========================\n");
let mut driver = PgDriver::connect("127.0.0.1", 5432, "orion", "qail_test_migration").await?;
println!("๏ฟฝ Setup Test Data");
println!("------------------");
let _ = driver.execute(&Qail::del("inquiries")).await;
for (name, email, service, status) in [
("Alice", "alice@test.com", "wedding", "new"),
("Bob", "bob@test.com", "corporate", "read"),
("Charlie", "charlie@test.com", "wedding", "new"),
("Diana", "diana@test.com", "birthday", "replied"),
("Eve", "eve@test.com", "wedding", "new"),
] {
let insert = Qail::add("inquiries")
.columns(["name", "email", "service", "status", "message"])
.values([name, email, service, status, "Test message"]);
driver.execute(&insert).await?;
}
println!(" โ Inserted 5 test rows");
println!("\n๐ SELECT Tests - Basic");
println!("------------------------");
let select_all = Qail::get("inquiries").select_all();
match driver.fetch_all(&select_all).await {
Ok(rows) => println!(" โ SELECT *: {} rows", rows.len()),
Err(e) => println!(" โ SELECT *: {}", e),
}
let select_cols = Qail::get("inquiries").columns(["id", "name", "email", "status"]);
match driver.fetch_all(&select_cols).await {
Ok(rows) => println!(" โ SELECT multi-column: {} rows", rows.len()),
Err(e) => println!(" โ SELECT multi-column: {}", e),
}
println!("\n๏ฟฝ WHERE Operators");
println!("------------------");
let eq = Qail::get("inquiries")
.columns(["name"])
.filter("status", Operator::Eq, "new");
match driver.fetch_all(&eq).await {
Ok(rows) => println!(" โ WHERE = : {} rows (expect 3)", rows.len()),
Err(e) => println!(" โ WHERE = : {}", e),
}
let ne = Qail::get("inquiries")
.columns(["name"])
.filter("status", Operator::Ne, "new");
match driver.fetch_all(&ne).await {
Ok(rows) => println!(" โ WHERE != : {} rows (expect 2)", rows.len()),
Err(e) => println!(" โ WHERE != : {}", e),
}
let like = Qail::get("inquiries")
.columns(["name"])
.filter("name", Operator::Like, "A%");
match driver.fetch_all(&like).await {
Ok(rows) => println!(" โ WHERE LIKE: {} rows (expect 1: Alice)", rows.len()),
Err(e) => println!(" โ WHERE LIKE: {}", e),
}
let ilike = Qail::get("inquiries")
.columns(["name"])
.filter("name", Operator::ILike, "%LI%");
match driver.fetch_all(&ilike).await {
Ok(rows) => println!(" โ WHERE ILIKE: {} rows (Alice, Charlie)", rows.len()),
Err(e) => println!(" โ WHERE ILIKE: {}", e),
}
let in_op = Qail::get("inquiries").columns(["name"]).filter(
"service",
Operator::In,
Value::Array(vec![
Value::String("wedding".into()),
Value::String("birthday".into()),
]),
);
match driver.fetch_all(&in_op).await {
Ok(rows) => println!(" โ WHERE IN: {} rows (expect 4)", rows.len()),
Err(e) => println!(" โ WHERE IN: {}", e),
}
let is_null = Qail::get("inquiries")
.columns(["name"])
.filter("phone", Operator::IsNull, "");
match driver.fetch_all(&is_null).await {
Ok(rows) => println!(" โ WHERE IS NULL: {} rows", rows.len()),
Err(e) => println!(" โ WHERE IS NULL: {}", e),
}
println!("\n๐ JOIN Tests");
println!("--------------");
let left_join = Qail::get("inquiries")
.columns(["inquiries.id", "inquiries.name"])
.join(
JoinKind::Left,
"inquiries AS i2",
"inquiries.service",
"i2.service",
)
.limit(5);
match driver.fetch_all(&left_join).await {
Ok(rows) => println!(" โ LEFT JOIN: {} rows", rows.len()),
Err(e) => println!(" โ LEFT JOIN: {}", e),
}
println!("\n๐ Pagination Tests");
println!("-------------------");
let order_desc = Qail::get("inquiries")
.columns(["id", "name"])
.order_by("id", SortOrder::Desc)
.limit(3);
match driver.fetch_all(&order_desc).await {
Ok(rows) => println!(" โ ORDER BY DESC LIMIT 3: {} rows", rows.len()),
Err(e) => println!(" โ ORDER BY DESC: {}", e),
}
let paginated = Qail::get("inquiries")
.columns(["id", "name"])
.order_by("id", SortOrder::Asc)
.limit(2)
.offset(2);
match driver.fetch_all(&paginated).await {
Ok(rows) => println!(" โ LIMIT 2 OFFSET 2: {} rows", rows.len()),
Err(e) => println!(" โ LIMIT OFFSET: {}", e),
}
println!("\nโ๏ธ UPDATE Tests");
println!("----------------");
let update_single = Qail::set("inquiries")
.columns(["status"])
.values(["archived"])
.filter("name", Operator::Eq, "Eve");
match driver.execute(&update_single).await {
Ok(_) => println!(" โ UPDATE single column: success"),
Err(e) => println!(" โ UPDATE single column: {}", e),
}
let update_multi = Qail::set("inquiries")
.columns(["status", "message"])
.values(["contacted", "Updated via QAIL"])
.filter("name", Operator::Eq, "Diana");
match driver.execute(&update_multi).await {
Ok(_) => println!(" โ UPDATE multi-column: success"),
Err(e) => println!(" โ UPDATE multi-column: {}", e),
}
let update_like = Qail::set("inquiries")
.columns(["status"])
.values(["bulk_updated"])
.filter("service", Operator::Eq, "wedding");
match driver.execute(&update_like).await {
Ok(_) => println!(" โ UPDATE with complex WHERE: success"),
Err(e) => println!(" โ UPDATE with complex WHERE: {}", e),
}
println!("\n๐๏ธ DELETE Tests");
println!("----------------");
let delete_one = Qail::del("inquiries").filter("name", Operator::Eq, "Bob");
match driver.execute(&delete_one).await {
Ok(_) => println!(" โ DELETE specific row: success"),
Err(e) => println!(" โ DELETE specific row: {}", e),
}
let verify = Qail::get("inquiries").columns(["name"]);
match driver.fetch_all(&verify).await {
Ok(rows) => println!(" โ Remaining rows: {} (expect 4)", rows.len()),
Err(e) => println!(" โ Verify: {}", e),
}
println!("\n๐ฏ DISTINCT Test");
println!("-----------------");
let mut distinct = Qail::get("inquiries").columns(["service"]);
distinct.distinct = true;
match driver.fetch_all(&distinct).await {
Ok(rows) => println!(" โ SELECT DISTINCT: {} unique services", rows.len()),
Err(e) => println!(" โ SELECT DISTINCT: {}", e),
}
println!("\n๐งน Cleanup");
println!("-----------");
let cleanup = Qail::del("inquiries");
match driver.execute(&cleanup).await {
Ok(_) => println!(" โ Cleanup: all test rows deleted"),
Err(e) => println!(" โ Cleanup: {}", e),
}
println!("\nโ
Deep battle test complete!");
Ok(())
}