use sz_orm_core::{get_dialect, DbType};
#[test]
fn test_mysql_dialect_quotes_with_backticks_contract() {
let d = get_dialect(DbType::MySQL).unwrap();
assert_eq!(d.quote("users"), "`users`");
}
#[test]
fn test_postgres_dialect_quotes_with_double_quotes_contract() {
let d = get_dialect(DbType::PostgreSQL).unwrap();
assert_eq!(d.quote("users"), "\"users\"");
}
#[test]
fn test_sqlite_dialect_quotes_with_double_quotes_contract() {
let d = get_dialect(DbType::Sqlite).unwrap();
assert_eq!(d.quote("users"), "\"users\"");
}
#[test]
fn test_oracle_dialect_quotes_with_double_quotes_contract() {
let d = get_dialect(DbType::Oracle).unwrap();
assert_eq!(d.quote("users"), "\"users\"");
}
#[test]
fn test_dialect_escape_string_contract() {
let mysql_d = get_dialect(DbType::MySQL).unwrap();
let mysql_escaped = mysql_d.escape_string("it's a test");
assert!(
mysql_escaped.contains("it\\'s a test"),
"MySQL escape_string failed: {}",
mysql_escaped
);
for db in [
DbType::PostgreSQL,
DbType::Sqlite,
DbType::Oracle,
DbType::SqlServer,
] {
let d = get_dialect(db).unwrap();
let escaped = d.escape_string("it's a test");
assert!(
escaped.contains("it''s a test"),
"{:?} escape_string failed: {}",
db,
escaped
);
}
}
#[test]
fn test_auto_increment_keyword_contract() {
assert_eq!(
get_dialect(DbType::MySQL).unwrap().auto_increment_keyword(),
"AUTO_INCREMENT"
);
let pg_kw = get_dialect(DbType::PostgreSQL)
.unwrap()
.auto_increment_keyword();
assert!(!pg_kw.is_empty());
let oracle_kw = get_dialect(DbType::Oracle)
.unwrap()
.auto_increment_keyword();
assert!(!oracle_kw.is_empty());
}
#[test]
fn test_json_extract_mysql_contract() {
let d = get_dialect(DbType::MySQL).unwrap();
let sql = d.json_extract("data", "$.name");
assert!(
sql.contains("JSON_EXTRACT"),
"MySQL 应使用 JSON_EXTRACT, got: {}",
sql
);
assert!(sql.contains("data"));
assert!(sql.contains("$.name"));
}
#[test]
fn test_json_extract_sqlite_contract() {
let d = get_dialect(DbType::Sqlite).unwrap();
let sql = d.json_extract("data", "$.name");
assert!(
sql.contains("json_extract"),
"SQLite 应使用 json_extract, got: {}",
sql
);
}
#[test]
fn test_json_extract_oracle_contract() {
let d = get_dialect(DbType::Oracle).unwrap();
let sql = d.json_extract("data", "$.name");
assert!(
sql.contains("JSON_VALUE"),
"Oracle 应使用 JSON_VALUE, got: {}",
sql
);
}
#[test]
fn test_get_dialect_returns_ok_for_sql_dbs_contract() {
for db in [
DbType::MySQL,
DbType::PostgreSQL,
DbType::Sqlite,
DbType::Oracle,
DbType::SqlServer,
] {
assert!(get_dialect(db).is_ok(), "{:?} 应返回 Ok", db);
}
}
#[test]
fn test_get_dialect_returns_err_for_nosql_dbs_contract() {
for db in [
DbType::Redis,
DbType::MongoDB,
DbType::VectorDb,
DbType::PureJsDb,
] {
let result = get_dialect(db);
match result {
Err(_e) => { }
Ok(_) => panic!("{:?} 应返回 Err(无方言)", db),
}
}
}
#[test]
fn test_get_dialect_clickhouse_now_supported_contract() {
let d = get_dialect(DbType::ClickHouse).unwrap();
assert_eq!(d.db_type(), DbType::ClickHouse);
assert_eq!(d.quote("users"), "`users`");
assert!(!d.supports_returning());
}
#[test]
fn test_get_dialect_new_chinese_dbs_supported_contract() {
let supported_dbs = [
DbType::Dameng,
DbType::Kingbase,
DbType::Db2,
DbType::MariaDB,
DbType::TiDB,
DbType::PolarDB,
DbType::GaussDB,
DbType::GBase,
DbType::Sybase,
];
for db in supported_dbs {
let result = get_dialect(db);
assert!(result.is_ok(), "{:?} 应支持方言", db);
let d = result.unwrap();
assert_eq!(d.db_type(), db, "方言 db_type() 应与请求的 DbType 一致");
}
}
#[test]
fn test_get_dialect_oceanbase_returns_mysql_contract() {
let d = get_dialect(DbType::OceanBase).unwrap();
assert_eq!(d.db_type(), DbType::MySQL);
assert_eq!(d.quote("users"), "`users`");
}
#[test]
fn test_dialect_db_type_returns_correct_type_contract() {
assert_eq!(get_dialect(DbType::MySQL).unwrap().db_type(), DbType::MySQL);
assert_eq!(
get_dialect(DbType::PostgreSQL).unwrap().db_type(),
DbType::PostgreSQL
);
assert_eq!(
get_dialect(DbType::Sqlite).unwrap().db_type(),
DbType::Sqlite
);
assert_eq!(
get_dialect(DbType::Oracle).unwrap().db_type(),
DbType::Oracle
);
}