sql-orm-sqlserver 0.2.0-rc.1

SQL Server query compilation for sql-orm.
Documentation
use insta::assert_snapshot;
use sql_orm_core::{ReferentialAction, SqlServerType};
use sql_orm_migrate::{
    AddColumn, AddForeignKey, ColumnSnapshot, DropColumn, DropForeignKey, ForeignKeySnapshot,
    MigrationOperation, RenameColumn, RenameTable,
};
use sql_orm_sqlserver::SqlServerCompiler;

#[test]
fn snapshots_foreign_key_migration_sql() {
    let operations = vec![
        MigrationOperation::AddForeignKey(AddForeignKey::new(
            "sales",
            "orders",
            ForeignKeySnapshot::new(
                "fk_orders_customer_id_customers",
                vec!["customer_id".to_string()],
                "sales",
                "customers",
                vec!["id".to_string()],
                ReferentialAction::Cascade,
                ReferentialAction::NoAction,
            ),
        )),
        MigrationOperation::DropForeignKey(DropForeignKey::new(
            "sales",
            "orders",
            "fk_orders_customer_id_customers",
        )),
    ];

    let sql = SqlServerCompiler::compile_migration_operations(&operations).unwrap();

    assert_snapshot!("foreign_key_migration_sql", render_statements(&sql));
}

#[test]
fn snapshots_advanced_foreign_key_migration_sql() {
    let operations = vec![
        MigrationOperation::AddForeignKey(AddForeignKey::new(
            "sales",
            "order_allocations",
            ForeignKeySnapshot::new(
                "fk_order_allocations_customer_branch_customers",
                vec!["customer_id".to_string(), "branch_id".to_string()],
                "sales",
                "customers",
                vec!["id".to_string(), "branch_id".to_string()],
                ReferentialAction::SetDefault,
                ReferentialAction::Cascade,
            ),
        )),
        MigrationOperation::DropForeignKey(DropForeignKey::new(
            "sales",
            "order_allocations",
            "fk_order_allocations_customer_branch_customers",
        )),
    ];

    let sql = SqlServerCompiler::compile_migration_operations(&operations).unwrap();

    assert_snapshot!(
        "advanced_foreign_key_migration_sql",
        render_statements(&sql)
    );
}

#[test]
fn snapshots_computed_column_migration_sql() {
    let operations = vec![
        MigrationOperation::AddColumn(AddColumn::new(
            "sales",
            "order_lines",
            ColumnSnapshot::new(
                "line_total",
                sql_orm_core::SqlServerType::Decimal,
                false,
                false,
                None,
                None,
                Some("[unit_price] * [quantity]".to_string()),
                false,
                false,
                false,
                None,
                Some(18),
                Some(2),
            ),
        )),
        MigrationOperation::DropColumn(DropColumn::new("sales", "order_lines", "line_total")),
    ];

    let sql = SqlServerCompiler::compile_migration_operations(&operations).unwrap();

    assert_snapshot!("computed_column_migration_sql", render_statements(&sql));
}

#[test]
fn snapshots_audit_column_migration_sql() {
    let operations = vec![
        MigrationOperation::AddColumn(AddColumn::new(
            "audit",
            "audited_entities",
            ColumnSnapshot::new(
                "created_at",
                SqlServerType::DateTime2,
                false,
                false,
                None,
                Some("SYSUTCDATETIME()".to_string()),
                None,
                false,
                false,
                false,
                None,
                None,
                None,
            ),
        )),
        MigrationOperation::AddColumn(AddColumn::new(
            "audit",
            "audited_entities",
            ColumnSnapshot::new(
                "created_by_user_id",
                SqlServerType::BigInt,
                true,
                false,
                None,
                None,
                None,
                false,
                true,
                true,
                None,
                None,
                None,
            ),
        )),
        MigrationOperation::AddColumn(AddColumn::new(
            "audit",
            "audited_entities",
            ColumnSnapshot::new(
                "updated_at",
                SqlServerType::DateTime2,
                true,
                false,
                None,
                Some("SYSUTCDATETIME()".to_string()),
                None,
                false,
                false,
                true,
                None,
                None,
                None,
            ),
        )),
        MigrationOperation::AddColumn(AddColumn::new(
            "audit",
            "audited_entities",
            ColumnSnapshot::new(
                "updated_by",
                SqlServerType::NVarChar,
                true,
                false,
                None,
                None,
                None,
                false,
                true,
                true,
                Some(120),
                None,
                None,
            ),
        )),
    ];

    let sql = SqlServerCompiler::compile_migration_operations(&operations).unwrap();

    assert_snapshot!("audit_column_migration_sql", render_statements(&sql));
}

#[test]
fn snapshots_soft_delete_column_migration_sql() {
    let operations = vec![
        MigrationOperation::AddColumn(AddColumn::new(
            "audit",
            "soft_deleted_entities",
            ColumnSnapshot::new(
                "deleted_at",
                SqlServerType::DateTime2,
                true,
                false,
                None,
                None,
                None,
                false,
                false,
                true,
                None,
                None,
                None,
            ),
        )),
        MigrationOperation::AddColumn(AddColumn::new(
            "audit",
            "soft_deleted_entities",
            ColumnSnapshot::new(
                "deleted_by",
                SqlServerType::NVarChar,
                true,
                false,
                None,
                None,
                None,
                false,
                false,
                true,
                Some(120),
                None,
                None,
            ),
        )),
    ];

    let sql = SqlServerCompiler::compile_migration_operations(&operations).unwrap();

    assert_snapshot!("soft_delete_column_migration_sql", render_statements(&sql));
}

#[test]
fn snapshots_rename_column_migration_sql() {
    let operations = vec![MigrationOperation::RenameColumn(RenameColumn::new(
        "sales",
        "customers",
        "email",
        "email_address",
    ))];

    let sql = SqlServerCompiler::compile_migration_operations(&operations).unwrap();

    assert_snapshot!("rename_column_migration_sql", render_statements(&sql));
}

#[test]
fn snapshots_rename_table_migration_sql() {
    let operations = vec![MigrationOperation::RenameTable(RenameTable::new(
        "sales",
        "customers",
        "clients",
    ))];

    let sql = SqlServerCompiler::compile_migration_operations(&operations).unwrap();

    assert_snapshot!("rename_table_migration_sql", render_statements(&sql));
}

fn render_statements(statements: &[String]) -> String {
    statements.join("\nGO\n")
}