#![allow(deprecated)]
use crate::{SimpleUser, User};
use async_trait::async_trait;
use uuid::Uuid;
#[async_trait]
pub trait UserRepository: Send + Sync {
async fn get_user_by_id(&self, user_id: &str) -> Result<Option<Box<dyn User>>, String>;
}
pub struct SimpleUserRepository;
#[async_trait]
impl UserRepository for SimpleUserRepository {
async fn get_user_by_id(&self, user_id: &str) -> Result<Option<Box<dyn User>>, String> {
Ok(Some(Box::new(SimpleUser {
id: Uuid::new_v5(&Uuid::NAMESPACE_URL, user_id.as_bytes()),
username: user_id.to_string(),
email: String::new(),
is_active: true,
is_admin: false,
is_staff: false,
is_superuser: false,
})))
}
}
#[cfg(test)]
mod tests {
use super::*;
use rstest::rstest;
#[rstest]
#[tokio::test]
async fn test_simple_user_repo_returns_user() {
let repo = SimpleUserRepository;
let user_id = "test_user_42";
let result = repo.get_user_by_id(user_id).await;
let user = result
.expect("get_user_by_id should not return Err")
.expect("get_user_by_id should return Some for any input");
assert_eq!(user.username(), user_id);
assert!(user.is_active());
assert!(user.is_authenticated());
}
#[rstest]
#[tokio::test]
async fn test_simple_user_repo_deterministic_uuid() {
let repo = SimpleUserRepository;
let user_id = "deterministic_id_input";
let expected_uuid = Uuid::new_v5(&Uuid::NAMESPACE_URL, user_id.as_bytes());
let first_result = repo.get_user_by_id(user_id).await;
let second_result = repo.get_user_by_id(user_id).await;
let first_user = first_result.unwrap().unwrap();
let second_user = second_result.unwrap().unwrap();
assert_eq!(first_user.id(), expected_uuid.to_string());
assert_eq!(first_user.id(), second_user.id());
}
}