use super::validate_name;
#[derive(Debug, Clone, PartialEq)]
pub enum DefaultRoleSpec {
RoleList(Vec<String>),
All,
None,
}
#[derive(Debug, Clone, Default)]
pub struct SetDefaultRoleStatement {
pub role_spec: Option<DefaultRoleSpec>,
pub user_names: Vec<String>,
}
impl SetDefaultRoleStatement {
pub fn new() -> Self {
Self::default()
}
pub fn roles(mut self, spec: DefaultRoleSpec) -> Self {
self.role_spec = Some(spec);
self
}
pub fn user(mut self, name: impl Into<String>) -> Self {
self.user_names.push(name.into());
self
}
pub fn users(mut self, names: Vec<String>) -> Self {
self.user_names = names;
self
}
pub fn validate(&self) -> Result<(), String> {
if self.role_spec.is_none() {
return Err("Role specification must be set".to_string());
}
if self.user_names.is_empty() {
return Err("At least one user must be specified".to_string());
}
for user_name in &self.user_names {
validate_name(user_name, "User name")?;
}
if let Some(DefaultRoleSpec::RoleList(roles)) = &self.role_spec
&& roles.is_empty()
{
return Err("Role list cannot be empty".to_string());
}
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_set_default_role_new() {
let stmt = SetDefaultRoleStatement::new();
assert!(stmt.role_spec.is_none());
assert!(stmt.user_names.is_empty());
}
#[test]
fn test_set_default_role_basic() {
let stmt = SetDefaultRoleStatement::new()
.roles(DefaultRoleSpec::All)
.user("app_user@localhost");
assert!(matches!(stmt.role_spec, Some(DefaultRoleSpec::All)));
assert_eq!(stmt.user_names.len(), 1);
assert!(stmt.validate().is_ok());
}
#[test]
fn test_set_default_role_role_list() {
let stmt = SetDefaultRoleStatement::new()
.roles(DefaultRoleSpec::RoleList(vec!["role1".to_string()]))
.user("app_user");
assert!(matches!(stmt.role_spec, Some(DefaultRoleSpec::RoleList(_))));
assert!(stmt.validate().is_ok());
}
#[test]
fn test_set_default_role_none() {
let stmt = SetDefaultRoleStatement::new()
.roles(DefaultRoleSpec::None)
.user("app_user");
assert!(matches!(stmt.role_spec, Some(DefaultRoleSpec::None)));
assert!(stmt.validate().is_ok());
}
#[test]
fn test_set_default_role_multiple_users() {
let stmt = SetDefaultRoleStatement::new()
.roles(DefaultRoleSpec::All)
.user("user1")
.user("user2");
assert_eq!(stmt.user_names.len(), 2);
}
#[test]
fn test_set_default_role_validation_no_spec() {
let stmt = SetDefaultRoleStatement::new().user("app_user");
assert!(stmt.validate().is_err());
}
#[test]
fn test_set_default_role_validation_no_users() {
let stmt = SetDefaultRoleStatement::new().roles(DefaultRoleSpec::All);
assert!(stmt.validate().is_err());
}
#[test]
fn test_set_default_role_validation_empty_role_list() {
let stmt = SetDefaultRoleStatement::new()
.roles(DefaultRoleSpec::RoleList(vec![]))
.user("app_user");
assert!(stmt.validate().is_err());
}
}