#![cfg(feature = "postgresql")]
use crate::_test_common::postgresql_config;
use ormer::abstract_layer::postgresql_backend::{
create_database_sql, create_extension_sql, drop_database_sql,
};
#[test]
fn test_database_admin_sql_shape() {
assert_eq!(
create_database_sql("ormer_tmp_test").unwrap(),
"CREATE DATABASE ormer_tmp_test"
);
assert_eq!(
drop_database_sql("ormer_tmp_test").unwrap(),
"DROP DATABASE IF EXISTS ormer_tmp_test WITH (FORCE)"
);
assert_eq!(
create_extension_sql("plpgsql").unwrap(),
"CREATE EXTENSION IF NOT EXISTS plpgsql CASCADE"
);
assert_eq!(
create_database_sql("OrmerTmpDB").unwrap(),
"CREATE DATABASE \"OrmerTmpDB\""
);
assert_eq!(
drop_database_sql("OrmerTmpDB").unwrap(),
"DROP DATABASE IF EXISTS \"OrmerTmpDB\" WITH (FORCE)"
);
assert_eq!(
create_extension_sql("My$Ext").unwrap(),
"CREATE EXTENSION IF NOT EXISTS \"My$Ext\" CASCADE"
);
assert_eq!(
create_database_sql("select").unwrap(),
"CREATE DATABASE \"select\""
);
}
#[test]
fn test_database_admin_sql_rejects_unsafe_identifiers() {
let bad = ["", "1abc", "bad-name", "bad;name", "bad\"name", "bad name", "drop--x"];
for name in bad {
assert!(create_database_sql(name).is_err(), "create: {name:?}");
assert!(drop_database_sql(name).is_err(), "drop: {name:?}");
assert!(create_extension_sql(name).is_err(), "extension: {name:?}");
}
}
#[tokio::test]
async fn test_database_admin_roundtrip() -> Result<(), Box<dyn std::error::Error>> {
let config = postgresql_config();
let db = ormer::Database::connect(config.0, config.1).await?;
db.drop_database("ormer_tmp_test").await?;
assert!(!db.database_exists("ormer_tmp_test").await?);
db.create_database("ormer_tmp_test").await?;
assert!(db.database_exists("ormer_tmp_test").await?);
db.create_database("ormer_tmp_test").await?;
assert!(db.database_exists("ormer_tmp_test").await?);
db.apply_extension("ormer_tmp_test", "plpgsql").await?;
db.apply_extension("ormer_tmp_test", "plpgsql").await?;
assert!(db
.apply_extension("ormer_tmp_test_missing", "plpgsql")
.await
.is_err());
db.drop_database("ormer_tmp_test").await?;
assert!(!db.database_exists("ormer_tmp_test").await?);
db.drop_database("ormer_tmp_test").await?;
assert!(db.database_exists("bad-name").await.is_err());
assert!(db.create_database("bad;name").await.is_err());
assert!(db.drop_database("1abc").await.is_err());
Ok(())
}