use sz_orm_sqlx::{
BenchmarkComparison, DistributedDbCompatReport, DistributedDbType, SqlCompatResult,
TxBehaviorResult,
};
#[test]
fn test_distributed_db_compat_report_creation() {
let report = DistributedDbCompatReport::new(DistributedDbType::CockroachDb);
assert_eq!(report.db_type, DistributedDbType::CockroachDb);
assert!(report.sql_compat_results.is_empty());
assert!(report.distributed_tx_behavior.is_empty());
assert!(report.benchmark_vs_pg.is_empty());
}
#[test]
fn test_sql_compat_result_compatible() {
let result = SqlCompatResult {
sql: "SELECT * FROM users WHERE id = $1".to_string(),
is_compatible: true,
reason: None,
alternative_sql: None,
};
assert!(result.is_compatible);
assert!(result.reason.is_none());
assert!(result.alternative_sql.is_none());
}
#[test]
fn test_sql_compat_result_incompatible() {
let result = SqlCompatResult {
sql: "SELECT * FROM users LIMIT 10 OFFSET 5".to_string(),
is_compatible: false,
reason: Some("CockroachDB 不支持 OFFSET without LIMIT in certain contexts".to_string()),
alternative_sql: Some("SELECT * FROM users LIMIT 10 OFFSET 5".to_string()),
};
assert!(!result.is_compatible);
assert!(result.reason.is_some());
assert!(result.alternative_sql.is_some());
}
#[test]
fn test_tx_behavior_result() {
let result = TxBehaviorResult {
isolation_level: "SERIALIZABLE".to_string(),
timeout: "30s".to_string(),
retry_behavior: "automatic retry up to 5 times".to_string(),
consistency_with_pg: true,
};
assert_eq!(result.isolation_level, "SERIALIZABLE");
assert!(result.consistency_with_pg);
}
#[test]
fn test_benchmark_comparison() {
let comparison = BenchmarkComparison {
pg_baseline: 10000.0,
distributed_result: 8500.0,
throughput_ratio: 0.85,
latency_ratio: 1.18,
};
assert!((comparison.throughput_ratio - 0.85).abs() < 1e-6);
assert!((comparison.latency_ratio - 1.18).abs() < 1e-6);
}
#[test]
fn test_report_add_sql_compat() {
let mut report = DistributedDbCompatReport::new(DistributedDbType::YugabyteDb);
report.add_sql_compat(SqlCompatResult {
sql: "SELECT 1".to_string(),
is_compatible: true,
reason: None,
alternative_sql: None,
});
report.add_sql_compat(SqlCompatResult {
sql: "SELECT * FROM t LIMIT 10".to_string(),
is_compatible: true,
reason: None,
alternative_sql: None,
});
report.add_sql_compat(SqlCompatResult {
sql: "SELECT * FROM t OFFSET 5".to_string(),
is_compatible: false,
reason: Some("not supported".to_string()),
alternative_sql: Some("SELECT * FROM t LIMIT 1000000 OFFSET 5".to_string()),
});
assert_eq!(report.sql_compat_results.len(), 3);
let rate = report.overall_sql_compat_rate();
assert!((rate - 2.0 / 3.0).abs() < 1e-6);
}
#[test]
fn test_report_add_tx_behavior() {
let mut report = DistributedDbCompatReport::new(DistributedDbType::CockroachDb);
report.add_tx_behavior(TxBehaviorResult {
isolation_level: "SERIALIZABLE".to_string(),
timeout: "30s".to_string(),
retry_behavior: "auto retry".to_string(),
consistency_with_pg: true,
});
report.add_tx_behavior(TxBehaviorResult {
isolation_level: "READ COMMITTED".to_string(),
timeout: "30s".to_string(),
retry_behavior: "no retry".to_string(),
consistency_with_pg: false,
});
assert_eq!(report.distributed_tx_behavior.len(), 2);
assert!(report.distributed_tx_behavior[0].consistency_with_pg);
assert!(!report.distributed_tx_behavior[1].consistency_with_pg);
}
#[test]
fn test_report_add_benchmark() {
let mut report = DistributedDbCompatReport::new(DistributedDbType::PostgreSql);
report.add_benchmark(BenchmarkComparison {
pg_baseline: 10000.0,
distributed_result: 10000.0,
throughput_ratio: 1.0,
latency_ratio: 1.0,
});
assert_eq!(report.benchmark_vs_pg.len(), 1);
assert!((report.benchmark_vs_pg[0].throughput_ratio - 1.0).abs() < 1e-6);
}
#[test]
fn test_report_to_json() {
let mut report = DistributedDbCompatReport::new(DistributedDbType::CockroachDb);
report.add_sql_compat(SqlCompatResult {
sql: "SELECT 1".to_string(),
is_compatible: true,
reason: None,
alternative_sql: None,
});
let json = report.to_json().unwrap();
assert!(json.contains("CockroachDb"));
assert!(json.contains("SELECT 1"));
assert!(json.contains("is_compatible"));
assert!(json.contains("true"));
}
#[test]
fn test_overall_sql_compat_rate_empty() {
let report = DistributedDbCompatReport::new(DistributedDbType::YugabyteDb);
assert_eq!(report.overall_sql_compat_rate(), 0.0);
}
#[test]
fn test_all_db_types() {
let crdb = DistributedDbCompatReport::new(DistributedDbType::CockroachDb);
let yb = DistributedDbCompatReport::new(DistributedDbType::YugabyteDb);
let pg = DistributedDbCompatReport::new(DistributedDbType::PostgreSql);
assert_eq!(crdb.db_type, DistributedDbType::CockroachDb);
assert_eq!(yb.db_type, DistributedDbType::YugabyteDb);
assert_eq!(pg.db_type, DistributedDbType::PostgreSql);
assert_ne!(crdb.db_type, yb.db_type);
assert_ne!(yb.db_type, pg.db_type);
}