#[cfg(feature = "mysql")]
mod mysql_tests {
use sqlw::*;
use sqlw_backend::mysql::MySqlExecutor;
#[derive(FromRow, Debug, PartialEq)]
struct User {
pub id: i64,
pub name: String,
pub email: String,
}
#[tokio::test]
#[ignore = "requires MySQL server"]
async fn test_mysql_basic_query() -> Result<(), Box<dyn std::error::Error>> {
let executor =
MySqlExecutor::from_url("mysql://root:password@localhost:3307/test_db").await?;
executor
.query_void(query!("DROP TABLE IF EXISTS users"))
.await?;
executor
.query_void(query!(
"CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT, name TEXT, email TEXT)"
))
.await?;
let name = "Alice";
let email = "alice@example.com";
executor
.query_void(query!("INSERT INTO users (name, email) VALUES (?, ?)"))
.await?;
let user: Option<User> = executor
.query_one(query!("SELECT id, name, email FROM users WHERE name = ?"))
.await?;
assert!(user.is_some());
assert_eq!(user.unwrap().name, "Alice");
Ok(())
}
#[tokio::test]
#[ignore = "requires MySQL server"]
async fn test_mysql_query_list() -> Result<(), Box<dyn std::error::Error>> {
let executor =
MySqlExecutor::from_url("mysql://root:password@localhost:3307/test_db").await?;
executor
.query_void(query!("DROP TABLE IF EXISTS users"))
.await?;
executor
.query_void(query!(
"CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT, name TEXT, email TEXT)"
))
.await?;
for i in 1..=3 {
let name = format!("User{}", i);
let email = format!("user{}@example.com", i);
let insert = Query::new(
"INSERT INTO users (name, email) VALUES (?, ?)".to_string(),
vec![name.into(), email.into()],
);
executor.query_void(insert).await?;
}
let users: Vec<User> = executor
.query_list(query!("SELECT id, name, email FROM users"))
.await?;
assert_eq!(users.len(), 3);
Ok(())
}
#[tokio::test]
#[ignore = "requires MySQL server"]
async fn test_mysql_from_url() -> Result<(), Box<dyn std::error::Error>> {
let executor =
MySqlExecutor::from_url("mysql://root:password@localhost:3307/test_db").await?;
executor
.query_void(query!("DROP TABLE IF EXISTS test_table"))
.await?;
executor
.query_void(query!(
"CREATE TABLE test_table (id INT PRIMARY KEY, value TEXT)"
))
.await?;
let insert = Query::new(
"INSERT INTO test_table (id, value) VALUES (?, ?)".to_string(),
vec![1i64.into(), "test".into()],
);
executor.query_void(insert).await?;
let query = Query::new(
"SELECT value FROM test_table WHERE id = ?".to_string(),
vec![1i64.into()],
);
#[derive(FromRow)]
struct TestRow {
value: String,
}
let result: Option<TestRow> = executor.query_one(query).await?;
assert!(result.is_some());
assert_eq!(result.unwrap().value, "test");
Ok(())
}
}