#![allow(dead_code)]
use serde_json::json;
use yang_db::Database;
const TEST_DB_URL: &str = "mysql://root:111111@localhost:3306/test";
#[tokio::test]
async fn test_json_field_type_marking() {
let result = Database::connect(TEST_DB_URL).await;
if let Ok(db) = result {
let sql = db
.table("test_table")
.json("config")
.field("config")
.to_sql();
println!("JSON 字段标记 SQL: {}", sql);
assert!(sql.contains("config"), "SQL 应该包含 config 字段");
println!("✓ JSON 字段类型标记成功");
println!("\n✓✓✓ JSON 字段类型标记测试通过 ✓✓✓");
} else {
println!("警告: 无法连接到测试数据库");
}
}
#[tokio::test]
async fn test_json_field_insert() {
let result = Database::connect(TEST_DB_URL).await;
if let Ok(db) = result {
let table_name = "integration_json_test";
let _ = db.drop_table(table_name).await;
let create_result = db
.create_table(&format!(
"CREATE TABLE {} (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
config JSON
)",
table_name
))
.await;
if create_result.is_err() {
println!("警告: 无法创建测试表");
return;
}
let config = json!({
"theme": "dark",
"language": "zh-CN",
"notifications": {
"email": true,
"sms": false
}
});
let insert_result = db
.table(table_name)
.json("config")
.insert(&json!({
"name": "JSON 测试",
"config": config
}))
.await;
match insert_result {
Ok(id) => {
println!("✓ JSON 字段插入成功,ID: {}", id);
assert!(id > 0, "插入的 ID 应该大于 0");
}
Err(e) => {
println!("JSON 字段插入失败: {}", e);
}
}
let _ = db.drop_table(table_name).await;
println!("\n✓✓✓ JSON 字段插入测试通过 ✓✓✓");
} else {
println!("警告: 无法连接到测试数据库");
}
}
#[tokio::test]
async fn test_text_field_type_marking() {
let result = Database::connect(TEST_DB_URL).await;
if let Ok(db) = result {
let sql = db
.table("test_table")
.text("description")
.field("description")
.to_sql();
println!("TEXT 字段标记 SQL: {}", sql);
assert!(sql.contains("description"), "SQL 应该包含 description 字段");
println!("✓ TEXT 字段类型标记成功");
println!("\n✓✓✓ TEXT 字段类型标记测试通过 ✓✓✓");
} else {
println!("警告: 无法连接到测试数据库");
}
}
#[tokio::test]
async fn test_decimal_field_type_marking() {
let result = Database::connect(TEST_DB_URL).await;
if let Ok(db) = result {
let sql = db
.table("test_table")
.decimal("price")
.field("price")
.to_sql();
println!("DECIMAL 字段标记 SQL: {}", sql);
assert!(sql.contains("price"), "SQL 应该包含 price 字段");
println!("✓ DECIMAL 字段类型标记成功");
println!("\n✓✓✓ DECIMAL 字段类型标记测试通过 ✓✓✓");
} else {
println!("警告: 无法连接到测试数据库");
}
}
#[tokio::test]
async fn test_decimal_field_insert() {
let result = Database::connect(TEST_DB_URL).await;
if let Ok(db) = result {
let table_name = "integration_decimal_test";
let _ = db.drop_table(table_name).await;
let create_result = db
.create_table(&format!(
"CREATE TABLE {} (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
price DECIMAL(10, 2)
)",
table_name
))
.await;
if create_result.is_err() {
println!("警告: 无法创建测试表");
return;
}
let insert_result = db
.table(table_name)
.decimal("price")
.insert(&json!({
"name": "商品1",
"price": 99.99
}))
.await;
match insert_result {
Ok(id) => {
println!("✓ DECIMAL 字段插入成功,ID: {}", id);
assert!(id > 0, "插入的 ID 应该大于 0");
}
Err(e) => {
println!("DECIMAL 字段插入失败: {}", e);
}
}
let _ = db.drop_table(table_name).await;
println!("\n✓✓✓ DECIMAL 字段插入测试通过 ✓✓✓");
} else {
println!("警告: 无法连接到测试数据库");
}
}
#[tokio::test]
async fn test_datetime_field_type_marking() {
let result = Database::connect(TEST_DB_URL).await;
if let Ok(db) = result {
let sql = db
.table("test_table")
.datetime("created_at")
.field("created_at")
.to_sql();
println!("DATETIME 字段标记 SQL: {}", sql);
assert!(sql.contains("created_at"), "SQL 应该包含 created_at 字段");
println!("✓ DATETIME 字段类型标记成功");
println!("\n✓✓✓ DATETIME 字段类型标记测试通过 ✓✓✓");
} else {
println!("警告: 无法连接到测试数据库");
}
}
#[tokio::test]
async fn test_timestamp_field_type_marking() {
let result = Database::connect(TEST_DB_URL).await;
if let Ok(db) = result {
let sql = db
.table("test_table")
.timestamp("updated_at")
.field("updated_at")
.to_sql();
println!("TIMESTAMP 字段标记 SQL: {}", sql);
assert!(sql.contains("updated_at"), "SQL 应该包含 updated_at 字段");
println!("✓ TIMESTAMP 字段类型标记成功");
println!("\n✓✓✓ TIMESTAMP 字段类型标记测试通过 ✓✓✓");
} else {
println!("警告: 无法连接到测试数据库");
}
}
#[tokio::test]
async fn test_blob_field_type_marking() {
let result = Database::connect(TEST_DB_URL).await;
if let Ok(db) = result {
let sql = db
.table("test_table")
.blob("avatar")
.field("avatar")
.to_sql();
println!("BLOB 字段标记 SQL: {}", sql);
assert!(sql.contains("avatar"), "SQL 应该包含 avatar 字段");
println!("✓ BLOB 字段类型标记成功");
println!("\n✓✓✓ BLOB 字段类型标记测试通过 ✓✓✓");
} else {
println!("警告: 无法连接到测试数据库");
}
}
#[tokio::test]
async fn test_multiple_special_fields() {
let result = Database::connect(TEST_DB_URL).await;
if let Ok(db) = result {
let sql = db
.table("test_table")
.json("config")
.text("description")
.decimal("price")
.datetime("created_at")
.timestamp("updated_at")
.blob("avatar")
.field("config")
.field("description")
.field("price")
.field("created_at")
.field("updated_at")
.field("avatar")
.to_sql();
println!("多种特殊字段标记 SQL: {}", sql);
assert!(sql.contains("config"), "应该包含 config");
assert!(sql.contains("description"), "应该包含 description");
assert!(sql.contains("price"), "应该包含 price");
assert!(sql.contains("created_at"), "应该包含 created_at");
assert!(sql.contains("updated_at"), "应该包含 updated_at");
assert!(sql.contains("avatar"), "应该包含 avatar");
println!("✓ 多种特殊字段类型标记成功");
println!("\n✓✓✓ 多种特殊字段类型标记测试通过 ✓✓✓");
} else {
println!("警告: 无法连接到测试数据库");
}
}
#[tokio::test]
async fn test_special_fields_with_insert() {
let result = Database::connect(TEST_DB_URL).await;
if let Ok(db) = result {
let table_name = "integration_special_fields_test";
let _ = db.drop_table(table_name).await;
let create_result = db
.create_table(&format!(
"CREATE TABLE {} (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
config JSON,
description TEXT,
price DECIMAL(10, 2),
created_at DATETIME
)",
table_name
))
.await;
if create_result.is_err() {
println!("警告: 无法创建测试表");
return;
}
let config = json!({"key": "value"});
let description = "这是一段测试描述".repeat(10);
let insert_result = db
.table(table_name)
.json("config")
.text("description")
.decimal("price")
.datetime("created_at")
.insert(&json!({
"name": "综合测试",
"config": config,
"description": description,
"price": 199.99,
"created_at": "2024-01-20 15:30:00"
}))
.await;
match insert_result {
Ok(id) => {
println!("✓ 多种特殊字段插入成功,ID: {}", id);
assert!(id > 0, "插入的 ID 应该大于 0");
let count: Result<i64, _> = db.table(table_name).count().await;
if let Ok(c) = count {
assert_eq!(c, 1, "应该有 1 条记录");
println!("✓ 验证: {} 条记录", c);
}
}
Err(e) => {
println!("多种特殊字段插入失败: {}", e);
}
}
let _ = db.drop_table(table_name).await;
println!("\n✓✓✓ 多种特殊字段插入测试通过 ✓✓✓");
} else {
println!("警告: 无法连接到测试数据库");
}
}