sz-orm-core 4.9.0

Core ORM engine: Model trait, ActiveRecord, QueryBuilder, Pool, Transaction, migration, and SQL dialect abstraction
Documentation
//! M4-T2: Redshift 方言测试
//!
//! 验证 RedshiftDialect 的 Dialect trait 实现和特有特性。
//! Redshift 委派 PostgreSqlDialect,基础行为应与 PG 一致。

#![cfg(feature = "dialect-redshift")]

use sz_orm_core::dialect::{ColumnDef, Dialect, PostgreSqlDialect, RedshiftDialect};
use sz_orm_core::DbType;

#[test]
fn test_redshift_db_type() {
    let dialect = RedshiftDialect;
    assert_eq!(dialect.db_type(), DbType::Redshift);
}

#[test]
fn test_redshift_quote() {
    let dialect = RedshiftDialect;
    // Redshift 委派 PG,使用双引号
    assert_eq!(dialect.quote("users"), "\"users\"");
    assert_eq!(dialect.quote("user\"id"), "\"user\"\"id\"");
}

#[test]
fn test_redshift_escape_string() {
    let dialect = RedshiftDialect;
    // Redshift 委派 PG,使用双单引号转义
    assert_eq!(dialect.escape_string("hello"), "hello");
    assert_eq!(dialect.escape_string("it's"), "it''s");
}

#[test]
fn test_redshift_supports_returning() {
    let dialect = RedshiftDialect;
    // Redshift 不支持 RETURNING(与 PG 8.0.2 一致)
    // 但委派 PG 实现,这里验证委派行为
    let pg = PostgreSqlDialect;
    assert_eq!(dialect.supports_returning(), pg.supports_returning());
}

#[test]
fn test_redshift_pagination() {
    let dialect = RedshiftDialect;
    let sql = dialect.build_pagination("SELECT * FROM users", 2, 10);
    // Redshift 委派 PG,使用 LIMIT count OFFSET offset
    assert_eq!(sql, "SELECT * FROM users LIMIT 10 OFFSET 10");
}

#[test]
fn test_redshift_json_type() {
    let dialect = RedshiftDialect;
    // Redshift 委派 PG
    assert_eq!(dialect.json_type(), "JSONB");
}

#[test]
fn test_redshift_json_extract() {
    let dialect = RedshiftDialect;
    let sql = dialect.json_extract("data", "name");
    // Redshift 委派 PG 的 #>> 语法
    assert!(sql.contains("#>>"));
    assert!(sql.contains("data"));
}

#[test]
fn test_redshift_concat() {
    let dialect = RedshiftDialect;
    let sql = dialect.concat(&["a", "b", "c"]);
    assert_eq!(sql, "CONCAT(a, b, c)");
}

#[test]
fn test_redshift_auto_increment() {
    let dialect = RedshiftDialect;
    // Redshift 委派 PG
    assert_eq!(
        dialect.auto_increment_keyword(),
        "GENERATED BY DEFAULT AS IDENTITY"
    );
}

#[test]
fn test_redshift_build_create_table() {
    let dialect = RedshiftDialect;
    let columns = vec![ColumnDef {
        name: "id".to_string(),
        sql_type: "BIGINT".to_string(),
        nullable: false,
        default: None,
        auto_increment: false,
        primary_key: true,
    }];
    let sql = dialect.build_create_table("users", &columns);
    assert!(sql.contains("CREATE TABLE"));
    assert!(sql.contains("\"users\""));
    assert!(sql.contains("\"id\""));
    assert!(sql.contains("NOT NULL"));
    assert!(sql.contains("PRIMARY KEY"));
}

#[test]
fn test_redshift_copy() {
    let dialect = RedshiftDialect;
    let sql = dialect.build_copy(
        "mytable",
        "s3://bucket/data.csv",
        "aws_iam_role=arn:aws:iam::123",
    );
    assert!(sql.contains("COPY"));
    assert!(sql.contains("\"mytable\""));
    assert!(sql.contains("s3://bucket/data.csv"));
    assert!(sql.contains("FORMAT AS CSV"));
}

#[test]
fn test_redshift_unload() {
    let dialect = RedshiftDialect;
    let sql = dialect.build_unload(
        "SELECT * FROM users",
        "s3://bucket/output/",
        "aws_iam_role=arn:aws:iam::123",
    );
    assert!(sql.contains("UNLOAD"));
    assert!(sql.contains("SELECT * FROM users"));
    assert!(sql.contains("s3://bucket/output/"));
}

#[test]
fn test_redshift_clone_box() {
    let dialect = RedshiftDialect;
    let cloned = dialect.clone_box();
    assert_eq!(cloned.db_type(), DbType::Redshift);
}

#[test]
fn test_redshift_get_dialect() {
    use sz_orm_core::get_dialect;
    let dialect = get_dialect(DbType::Redshift).unwrap();
    assert_eq!(dialect.db_type(), DbType::Redshift);
    assert_eq!(dialect.quote("users"), "\"users\"");
}

#[test]
fn test_redshift_pg_consistency() {
    // 验证 Redshift 与 PG 基础行为一致
    let redshift = RedshiftDialect;
    let pg = PostgreSqlDialect;

    assert_eq!(redshift.quote("table"), pg.quote("table"));
    assert_eq!(redshift.escape_string("test's"), pg.escape_string("test's"));
    assert_eq!(
        redshift.build_pagination("SELECT 1", 1, 10),
        pg.build_pagination("SELECT 1", 1, 10)
    );
    assert_eq!(redshift.json_type(), pg.json_type());
    assert_eq!(redshift.concat(&["a", "b"]), pg.concat(&["a", "b"]));
}