use crate::types::{DynIden, IntoIden, ZoneConfig};
#[derive(Debug, Clone)]
#[allow(dead_code)]
pub struct DatabaseDef {
pub(crate) name: DynIden,
pub(crate) if_not_exists: bool,
pub(crate) owner: Option<DynIden>,
pub(crate) template: Option<DynIden>,
pub(crate) encoding: Option<String>,
pub(crate) lc_collate: Option<String>,
pub(crate) lc_ctype: Option<String>,
pub(crate) character_set: Option<String>,
pub(crate) collate: Option<String>,
}
impl DatabaseDef {
pub fn new<N: IntoIden>(name: N) -> Self {
Self {
name: name.into_iden(),
if_not_exists: false,
owner: None,
template: None,
encoding: None,
lc_collate: None,
lc_ctype: None,
character_set: None,
collate: None,
}
}
pub fn if_not_exists(mut self, if_not_exists: bool) -> Self {
self.if_not_exists = if_not_exists;
self
}
pub fn owner<O: IntoIden>(mut self, owner: O) -> Self {
self.owner = Some(owner.into_iden());
self
}
pub fn template<T: IntoIden>(mut self, template: T) -> Self {
self.template = Some(template.into_iden());
self
}
pub fn encoding<S: Into<String>>(mut self, encoding: S) -> Self {
self.encoding = Some(encoding.into());
self
}
pub fn lc_collate<S: Into<String>>(mut self, lc_collate: S) -> Self {
self.lc_collate = Some(lc_collate.into());
self
}
pub fn lc_ctype<S: Into<String>>(mut self, lc_ctype: S) -> Self {
self.lc_ctype = Some(lc_ctype.into());
self
}
pub fn character_set<S: Into<String>>(mut self, charset: S) -> Self {
self.character_set = Some(charset.into());
self
}
pub fn collate<S: Into<String>>(mut self, collate: S) -> Self {
self.collate = Some(collate.into());
self
}
}
#[derive(Debug, Clone)]
pub enum DatabaseOperation {
RenameDatabase(DynIden),
OwnerTo(DynIden),
AddRegion(String),
DropRegion(String),
SetPrimaryRegion(String),
ConfigureZone(ZoneConfig),
}
#[cfg(test)]
mod tests {
use super::*;
use crate::types::IntoIden;
use rstest::*;
#[rstest]
fn test_database_def_basic() {
let db = DatabaseDef::new("mydb");
assert_eq!(db.name.to_string(), "mydb");
assert!(!db.if_not_exists);
assert!(db.owner.is_none());
assert!(db.template.is_none());
assert!(db.encoding.is_none());
assert!(db.lc_collate.is_none());
assert!(db.lc_ctype.is_none());
assert!(db.character_set.is_none());
assert!(db.collate.is_none());
}
#[rstest]
fn test_database_def_if_not_exists() {
let db = DatabaseDef::new("mydb").if_not_exists(true);
assert_eq!(db.name.to_string(), "mydb");
assert!(db.if_not_exists);
}
#[rstest]
fn test_database_def_with_owner() {
let db = DatabaseDef::new("mydb").owner("alice");
assert_eq!(db.name.to_string(), "mydb");
assert_eq!(db.owner.as_ref().unwrap().to_string(), "alice");
}
#[rstest]
fn test_database_def_with_template() {
let db = DatabaseDef::new("mydb").template("template0");
assert_eq!(db.name.to_string(), "mydb");
assert_eq!(db.template.as_ref().unwrap().to_string(), "template0");
}
#[rstest]
fn test_database_def_with_encoding() {
let db = DatabaseDef::new("mydb").encoding("UTF8");
assert_eq!(db.name.to_string(), "mydb");
assert_eq!(db.encoding.as_ref().unwrap(), "UTF8");
}
#[rstest]
fn test_database_def_with_lc_collate() {
let db = DatabaseDef::new("mydb").lc_collate("en_US.UTF-8");
assert_eq!(db.name.to_string(), "mydb");
assert_eq!(db.lc_collate.as_ref().unwrap(), "en_US.UTF-8");
}
#[rstest]
fn test_database_def_with_lc_ctype() {
let db = DatabaseDef::new("mydb").lc_ctype("en_US.UTF-8");
assert_eq!(db.name.to_string(), "mydb");
assert_eq!(db.lc_ctype.as_ref().unwrap(), "en_US.UTF-8");
}
#[rstest]
fn test_database_def_with_character_set() {
let db = DatabaseDef::new("mydb").character_set("utf8mb4");
assert_eq!(db.name.to_string(), "mydb");
assert_eq!(db.character_set.as_ref().unwrap(), "utf8mb4");
}
#[rstest]
fn test_database_def_with_collate() {
let db = DatabaseDef::new("mydb").collate("utf8mb4_unicode_ci");
assert_eq!(db.name.to_string(), "mydb");
assert_eq!(db.collate.as_ref().unwrap(), "utf8mb4_unicode_ci");
}
#[rstest]
fn test_database_def_postgresql_full() {
let db = DatabaseDef::new("mydb")
.if_not_exists(true)
.owner("alice")
.template("template0")
.encoding("UTF8")
.lc_collate("en_US.UTF-8")
.lc_ctype("en_US.UTF-8");
assert_eq!(db.name.to_string(), "mydb");
assert!(db.if_not_exists);
assert_eq!(db.owner.as_ref().unwrap().to_string(), "alice");
assert_eq!(db.template.as_ref().unwrap().to_string(), "template0");
assert_eq!(db.encoding.as_ref().unwrap(), "UTF8");
assert_eq!(db.lc_collate.as_ref().unwrap(), "en_US.UTF-8");
assert_eq!(db.lc_ctype.as_ref().unwrap(), "en_US.UTF-8");
}
#[rstest]
fn test_database_def_mysql_full() {
let db = DatabaseDef::new("mydb")
.if_not_exists(true)
.character_set("utf8mb4")
.collate("utf8mb4_unicode_ci");
assert_eq!(db.name.to_string(), "mydb");
assert!(db.if_not_exists);
assert_eq!(db.character_set.as_ref().unwrap(), "utf8mb4");
assert_eq!(db.collate.as_ref().unwrap(), "utf8mb4_unicode_ci");
}
#[rstest]
fn test_rename_database_operation() {
let op = DatabaseOperation::RenameDatabase("new_db".into_iden());
assert!(matches!(op, DatabaseOperation::RenameDatabase(_)));
}
#[rstest]
fn test_owner_to_operation() {
let op = DatabaseOperation::OwnerTo("new_owner".into_iden());
assert!(matches!(op, DatabaseOperation::OwnerTo(_)));
}
#[rstest]
fn test_add_region_operation() {
let op = DatabaseOperation::AddRegion("us-east-1".to_string());
match op {
DatabaseOperation::AddRegion(region) => {
assert_eq!(region, "us-east-1");
}
_ => panic!("Expected AddRegion operation"),
}
}
#[rstest]
fn test_drop_region_operation() {
let op = DatabaseOperation::DropRegion("us-west-1".to_string());
match op {
DatabaseOperation::DropRegion(region) => {
assert_eq!(region, "us-west-1");
}
_ => panic!("Expected DropRegion operation"),
}
}
#[rstest]
fn test_set_primary_region_operation() {
let op = DatabaseOperation::SetPrimaryRegion("us-east-1".to_string());
match op {
DatabaseOperation::SetPrimaryRegion(region) => {
assert_eq!(region, "us-east-1");
}
_ => panic!("Expected SetPrimaryRegion operation"),
}
}
#[rstest]
fn test_configure_zone_operation() {
let zone = ZoneConfig::new()
.num_replicas(3)
.add_constraint("+region=us-east-1");
let op = DatabaseOperation::ConfigureZone(zone);
match op {
DatabaseOperation::ConfigureZone(config) => {
assert_eq!(config.num_replicas, Some(3));
assert_eq!(config.constraints.len(), 1);
}
_ => panic!("Expected ConfigureZone operation"),
}
}
}