#![allow(dead_code)]
use yang_db::Database;
const TEST_DB_URL: &str = "mysql://root:111111@localhost:3306/test";
#[tokio::test]
async fn test_inner_join_sql_generation() {
let result = Database::connect(TEST_DB_URL).await;
if let Ok(db) = result {
let sql = db
.table("users")
.field("users.name")
.field("orders.product")
.join("orders", "users.id = orders.user_id")
.to_sql();
println!("生成的 INNER JOIN SQL: {}", sql);
assert!(sql.contains("INNER JOIN"), "SQL 应该包含 INNER JOIN");
assert!(sql.contains("orders"), "SQL 应该包含订单表");
assert!(
sql.contains("users.id = orders.user_id"),
"SQL 应该包含连接条件"
);
println!("✓ INNER JOIN SQL 生成正确");
println!("\n✓✓✓ INNER JOIN 测试通过 ✓✓✓");
} else {
println!("警告: 无法连接到测试数据库");
}
}
#[tokio::test]
async fn test_left_join_sql_generation() {
let result = Database::connect(TEST_DB_URL).await;
if let Ok(db) = result {
let sql = db
.table("users")
.field("users.name")
.field("orders.product")
.left_join("orders", "users.id = orders.user_id")
.to_sql();
println!("生成的 LEFT JOIN SQL: {}", sql);
assert!(sql.contains("LEFT JOIN"), "SQL 应该包含 LEFT JOIN");
assert!(sql.contains("orders"), "SQL 应该包含订单表");
println!("✓ LEFT JOIN SQL 生成正确");
println!("\n✓✓✓ LEFT JOIN 测试通过 ✓✓✓");
} else {
println!("警告: 无法连接到测试数据库");
}
}
#[tokio::test]
async fn test_right_join_sql_generation() {
let result = Database::connect(TEST_DB_URL).await;
if let Ok(db) = result {
let sql = db
.table("users")
.field("users.name")
.field("orders.product")
.right_join("orders", "users.id = orders.user_id")
.to_sql();
println!("生成的 RIGHT JOIN SQL: {}", sql);
assert!(sql.contains("RIGHT JOIN"), "SQL 应该包含 RIGHT JOIN");
assert!(sql.contains("orders"), "SQL 应该包含订单表");
println!("✓ RIGHT JOIN SQL 生成正确");
println!("\n✓✓✓ RIGHT JOIN 测试通过 ✓✓✓");
} else {
println!("警告: 无法连接到测试数据库");
}
}
#[tokio::test]
async fn test_multiple_joins() {
let result = Database::connect(TEST_DB_URL).await;
if let Ok(db) = result {
let sql = db
.table("users")
.field("users.name")
.field("orders.product")
.field("products.price")
.join("orders", "users.id = orders.user_id")
.join("products", "orders.product_id = products.id")
.to_sql();
println!("生成的多表 JOIN SQL: {}", sql);
let join_count = sql.matches("INNER JOIN").count();
assert_eq!(join_count, 2, "SQL 应该包含 2 个 INNER JOIN");
assert!(sql.contains("orders"), "SQL 应该包含订单表");
assert!(sql.contains("products"), "SQL 应该包含产品表");
println!("✓ 多表 JOIN SQL 生成正确");
println!("\n✓✓✓ 多表 JOIN 测试通过 ✓✓✓");
} else {
println!("警告: 无法连接到测试数据库");
}
}
#[tokio::test]
async fn test_join_with_where() {
let result = Database::connect(TEST_DB_URL).await;
if let Ok(db) = result {
let sql = db
.table("users")
.field("users.name")
.field("orders.product")
.join("orders", "users.id = orders.user_id")
.where_and("orders.amount", ">", 100.0)
.to_sql();
println!("生成的 JOIN + WHERE SQL: {}", sql);
assert!(sql.contains("INNER JOIN"), "应该包含 INNER JOIN");
assert!(sql.contains("WHERE"), "应该包含 WHERE 子句");
println!("✓ JOIN + WHERE SQL 生成正确");
println!("\n✓✓✓ JOIN + WHERE 测试通过 ✓✓✓");
} else {
println!("警告: 无法连接到测试数据库");
}
}
#[tokio::test]
async fn test_join_with_order() {
let result = Database::connect(TEST_DB_URL).await;
if let Ok(db) = result {
let sql = db
.table("users")
.field("users.name")
.field("orders.product")
.join("orders", "users.id = orders.user_id")
.order("orders.created_at", false)
.to_sql();
println!("生成的 JOIN + ORDER BY SQL: {}", sql);
assert!(sql.contains("INNER JOIN"), "应该包含 INNER JOIN");
assert!(sql.contains("ORDER BY"), "应该包含 ORDER BY 子句");
println!("✓ JOIN + ORDER BY SQL 生成正确");
println!("\n✓✓✓ JOIN + ORDER BY 测试通过 ✓✓✓");
} else {
println!("警告: 无法连接到测试数据库");
}
}
#[tokio::test]
async fn test_join_with_table_alias() {
let result = Database::connect(TEST_DB_URL).await;
if let Ok(db) = result {
let sql = db
.table("users AS u")
.field("u.name")
.field("o.product")
.join("orders AS o", "u.id = o.user_id")
.to_sql();
println!("生成的带别名的 JOIN SQL: {}", sql);
assert!(sql.contains("users AS u"), "应该包含用户表别名");
assert!(sql.contains("orders AS o"), "应该包含订单表别名");
assert!(sql.contains("u.id = o.user_id"), "应该使用别名连接");
println!("✓ 表别名 JOIN SQL 生成正确");
println!("\n✓✓✓ 表别名测试通过 ✓✓✓");
} else {
println!("警告: 无法连接到测试数据库");
}
}
#[tokio::test]
async fn test_join_with_limit() {
let result = Database::connect(TEST_DB_URL).await;
if let Ok(db) = result {
let sql = db
.table("users")
.field("users.name")
.field("orders.product")
.join("orders", "users.id = orders.user_id")
.limit(10)
.to_sql();
println!("生成的 JOIN + LIMIT SQL: {}", sql);
assert!(sql.contains("INNER JOIN"), "应该包含 INNER JOIN");
assert!(sql.contains("LIMIT"), "应该包含 LIMIT");
println!("✓ JOIN + LIMIT SQL 生成正确");
println!("\n✓✓✓ JOIN + LIMIT 测试通过 ✓✓✓");
} else {
println!("警告: 无法连接到测试数据库");
}
}
#[tokio::test]
async fn test_complex_join_query() {
let result = Database::connect(TEST_DB_URL).await;
if let Ok(db) = result {
let sql = db
.table("users AS u")
.field("u.name")
.field("o.product")
.field("p.price")
.join("orders AS o", "u.id = o.user_id")
.left_join("products AS p", "o.product_id = p.id")
.where_and("u.status", "=", "active")
.where_and("o.amount", ">", 50.0)
.order("o.created_at", false)
.limit(20)
.to_sql();
println!("生成的复杂 JOIN SQL: {}", sql);
assert!(sql.contains("INNER JOIN"), "应该包含 INNER JOIN");
assert!(sql.contains("LEFT JOIN"), "应该包含 LEFT JOIN");
assert!(sql.contains("WHERE"), "应该包含 WHERE");
assert!(sql.contains("ORDER BY"), "应该包含 ORDER BY");
assert!(sql.contains("LIMIT"), "应该包含 LIMIT");
println!("✓ 复杂 JOIN 查询 SQL 生成正确");
println!("\n✓✓✓ 复杂 JOIN 查询测试通过 ✓✓✓");
} else {
println!("警告: 无法连接到测试数据库");
}
}