use serde::Deserialize;
use serde::Serialize;
use crate::common::domain::Group;
use crate::common::domain::utils::new_type::new_type;
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
#[cfg_attr(any(test, feature = "fake"), derive(fake::Dummy))]
pub struct User {
pub id: UserId,
pub name: UserName,
pub email: EmailAddress,
pub groups: Vec<Group>,
}
impl User {
pub fn is_admin(&self) -> bool {
self.groups.contains(&Group::new("admin"))
}
}
#[cfg(any(test, feature = "fake"))]
impl User {
pub fn dummy_admin() -> Self {
use fake::Fake;
use fake::Faker;
use crate::common::domain::Group;
Self {
groups: [Group::new("admin"), Faker.fake()].into(),
..Faker.fake()
}
}
}
new_type![
#[derive(Deserialize, Serialize)]
UserName(
#[cfg_attr(any(test, feature = "fake"), dummy(faker = "fake::faker::name::en::Name()"))]
String
)
];
new_type![
#[derive(Deserialize, Serialize)]
EmailAddress(
#[cfg_attr(any(test, feature = "fake"), dummy(faker = "fake::faker::internet::en::FreeEmail()"))]
String
)
];
new_type![
#[derive(Deserialize, Serialize)]
UserId(String)
];
#[cfg(test)]
mod user_tests {
use fake::Fake;
use fake::Faker;
use super::*;
mod is_admin {
use super::*;
#[test]
fn should_return_true_if_user_is_part_of_admin_group() {
let user = User::dummy_admin();
let res = user.is_admin();
assert!(res);
}
#[test]
fn should_return_false_if_user_is_not_part_of_admin_group() {
let user = User { ..Faker.fake() };
let res = user.is_admin();
assert!(!res);
}
}
}