use ormdantic_core::BackendFeature;
use ormdantic_dialects::{
Dialect, MariaDbDialect, MsSqlDialect, MySqlDialect, OracleDialect, PostgresDialect,
SqliteDialect,
};
use ormdantic_schema::{ColumnDef, FieldKind};
#[test]
fn feature_sets_include_backend_capabilities() {
assert!(PostgresDialect.supports_feature(BackendFeature::Returning));
assert!(PostgresDialect.supports_feature(BackendFeature::NativeUuid));
assert!(PostgresDialect.supports_feature(BackendFeature::NativeJson));
assert!(MariaDbDialect.supports_feature(BackendFeature::Returning));
assert!(!MySqlDialect.supports_feature(BackendFeature::Returning));
assert!(!MsSqlDialect.supports_feature(BackendFeature::Returning));
assert!(!OracleDialect.supports_feature(BackendFeature::Returning));
assert!(!MsSqlDialect.supports_feature(BackendFeature::NativeJson));
assert!(SqliteDialect.supports_feature(BackendFeature::Savepoints));
}
#[test]
fn column_types_follow_backend_capabilities() {
assert_eq!(
PostgresDialect.render_column_type(&ColumnDef::new("id", FieldKind::Uuid)),
"UUID"
);
assert_eq!(
SqliteDialect.render_column_type(&ColumnDef::new("id", FieldKind::Uuid)),
"TEXT"
);
assert_eq!(
MySqlDialect.render_column_type(&ColumnDef::new("id", FieldKind::Uuid).primary_key(true)),
"VARCHAR(36)"
);
assert_eq!(
MariaDbDialect.render_column_type(&ColumnDef::new("id", FieldKind::Uuid).primary_key(true)),
"VARCHAR(36)"
);
assert_eq!(
OracleDialect.render_column_type(&ColumnDef::new("parent_id", FieldKind::Uuid)),
"VARCHAR2(36)"
);
assert_eq!(
MySqlDialect.render_column_type(&ColumnDef::new("payload", FieldKind::Json)),
"JSON"
);
assert_eq!(
MsSqlDialect.render_column_type(&ColumnDef::new("payload", FieldKind::Json)),
"TEXT"
);
assert_eq!(
PostgresDialect.render_column_type(&ColumnDef::new("name", FieldKind::String)),
"TEXT"
);
assert_eq!(
SqliteDialect.render_column_type(&ColumnDef::new("name", FieldKind::String)),
"TEXT"
);
assert_eq!(
MySqlDialect.render_column_type(&ColumnDef::new("name", FieldKind::String)),
"TEXT"
);
assert_eq!(
MariaDbDialect.render_column_type(&ColumnDef::new("name", FieldKind::String)),
"TEXT"
);
assert_eq!(
MsSqlDialect.render_column_type(&ColumnDef::new("name", FieldKind::String)),
"NVARCHAR(255)"
);
assert_eq!(
OracleDialect.render_column_type(&ColumnDef::new("name", FieldKind::String)),
"VARCHAR2(255)"
);
assert_eq!(
MySqlDialect.render_column_type(&ColumnDef::new("id", FieldKind::String).primary_key(true)),
"VARCHAR(255)"
);
assert_eq!(
MariaDbDialect
.render_column_type(&ColumnDef::new("id", FieldKind::String).primary_key(true)),
"VARCHAR(255)"
);
assert_eq!(
MsSqlDialect.render_column_type(&ColumnDef::new("id", FieldKind::String).primary_key(true)),
"NVARCHAR(255)"
);
assert_eq!(
OracleDialect
.render_column_type(&ColumnDef::new("id", FieldKind::String).primary_key(true)),
"VARCHAR2(255)"
);
assert_eq!(
MySqlDialect.render_column_type(&ColumnDef::new(
"parent_id",
FieldKind::ForeignKey {
target_table: "parent".to_string()
}
)),
"VARCHAR(255)"
);
assert_eq!(
MsSqlDialect.render_column_type(&ColumnDef::new(
"parent_id",
FieldKind::ForeignKey {
target_table: "parent".to_string()
}
)),
"NVARCHAR(255)"
);
assert_eq!(
OracleDialect.render_column_type(&ColumnDef::new(
"parent_id",
FieldKind::ForeignKey {
target_table: "parent".to_string()
}
)),
"VARCHAR2(255)"
);
assert_eq!(
PostgresDialect
.render_column_type(&ColumnDef::new("name", FieldKind::String).with_max_length(255)),
"VARCHAR(255)"
);
assert_eq!(
MySqlDialect
.render_column_type(&ColumnDef::new("name", FieldKind::String).with_max_length(255)),
"VARCHAR(255)"
);
assert_eq!(
MsSqlDialect
.render_column_type(&ColumnDef::new("name", FieldKind::String).with_max_length(255)),
"NVARCHAR(255)"
);
assert_eq!(
OracleDialect
.render_column_type(&ColumnDef::new("name", FieldKind::String).with_max_length(255)),
"VARCHAR2(255)"
);
assert_eq!(
PostgresDialect
.render_column_type(&ColumnDef::new("amount", FieldKind::Decimal).numeric(9, 2)),
"NUMERIC(9, 2)"
);
assert_eq!(
SqliteDialect
.render_column_type(&ColumnDef::new("amount", FieldKind::Decimal).numeric(9, 2)),
"DECIMAL_TEXT(9, 2)"
);
assert_eq!(
SqliteDialect.render_column_type(&ColumnDef::new("amount", FieldKind::Decimal)),
"DECIMAL_TEXT"
);
assert_eq!(
PostgresDialect.render_column_type(&ColumnDef::new("amount", FieldKind::Decimal)),
"NUMERIC"
);
assert_eq!(
PostgresDialect.render_column_type(&ColumnDef::new("count", FieldKind::Integer)),
"INTEGER"
);
assert_eq!(
PostgresDialect.render_column_type(&ColumnDef::new("ratio", FieldKind::Float)),
"REAL"
);
assert_eq!(
PostgresDialect.render_column_type(&ColumnDef::new("active", FieldKind::Boolean)),
"BOOLEAN"
);
assert_eq!(
PostgresDialect.render_column_type(&ColumnDef::new("served_on", FieldKind::Date)),
"DATE"
);
assert_eq!(
PostgresDialect.render_column_type(&ColumnDef::new("served_at", FieldKind::DateTime)),
"TIMESTAMP"
);
assert_eq!(
PostgresDialect.render_column_type(&ColumnDef::new("payload", FieldKind::Binary)),
"BLOB"
);
assert_eq!(
PostgresDialect.render_column_type(&ColumnDef::new("legacy", FieldKind::Unknown)),
"TEXT"
);
assert_eq!(
PostgresDialect.render_column_type(&ColumnDef::new(
"flavor",
FieldKind::Enum {
name: Some("ddl_flavor".to_string()),
schema: None
}
)),
r#""ddl_flavor""#
);
assert_eq!(
PostgresDialect.render_column_type(&ColumnDef::new(
"flavor",
FieldKind::Enum {
name: Some("ddl_flavor".to_string()),
schema: Some("inventory".to_string())
}
)),
r#""inventory"."ddl_flavor""#
);
assert_eq!(
SqliteDialect.render_column_type(&ColumnDef::new(
"flavor",
FieldKind::Enum {
name: Some("ddl_flavor".to_string()),
schema: None
}
)),
"TEXT"
);
assert_eq!(
PostgresDialect.render_column_type(&ColumnDef::new(
"legacy_flavor",
FieldKind::Enum {
name: None,
schema: None
}
)),
"TEXT"
);
}