use application::identity::{RegisterUserCommand, RegisterUserHandler}; use application::testing::{InMemoryUserRepository, StubPasswordHasher}; use domain::errors::DomainError; use std::sync::Arc; #[tokio::test] async fn registers_new_user() { let repo = Arc::new(InMemoryUserRepository::new()); let handler = RegisterUserHandler::new(repo.clone(), Arc::new(StubPasswordHasher)); let cmd = RegisterUserCommand { username: "testuser".into(), email: "test@example.com".into(), password: "password123".into(), }; let user = handler.execute(cmd).await.unwrap(); assert_eq!(user.username, "testuser"); assert_eq!(user.email.as_str(), "test@example.com"); assert_eq!(repo.all().await.len(), 1); } #[tokio::test] async fn rejects_duplicate_email() { let repo = Arc::new(InMemoryUserRepository::new()); let handler = RegisterUserHandler::new(repo.clone(), Arc::new(StubPasswordHasher)); handler .execute(RegisterUserCommand { username: "user1".into(), email: "test@example.com".into(), password: "password123".into(), }) .await .unwrap(); let result = handler .execute(RegisterUserCommand { username: "user2".into(), email: "test@example.com".into(), password: "different1".into(), }) .await; assert!(matches!(result, Err(DomainError::Conflict(_)))); } #[tokio::test] async fn rejects_duplicate_username() { let repo = Arc::new(InMemoryUserRepository::new()); let handler = RegisterUserHandler::new(repo.clone(), Arc::new(StubPasswordHasher)); handler .execute(RegisterUserCommand { username: "sameuser".into(), email: "a@example.com".into(), password: "password123".into(), }) .await .unwrap(); let result = handler .execute(RegisterUserCommand { username: "sameuser".into(), email: "b@example.com".into(), password: "password123".into(), }) .await; assert!(matches!(result, Err(DomainError::Conflict(_)))); } #[tokio::test] async fn rejects_short_password() { let repo = Arc::new(InMemoryUserRepository::new()); let handler = RegisterUserHandler::new(repo, Arc::new(StubPasswordHasher)); let result = handler .execute(RegisterUserCommand { username: "user".into(), email: "test@example.com".into(), password: "short".into(), }) .await; assert!(matches!(result, Err(DomainError::Validation(_)))); } #[tokio::test] async fn rejects_empty_username() { let repo = Arc::new(InMemoryUserRepository::new()); let handler = RegisterUserHandler::new(repo, Arc::new(StubPasswordHasher)); let result = handler .execute(RegisterUserCommand { username: "".into(), email: "test@example.com".into(), password: "password123".into(), }) .await; assert!(matches!(result, Err(DomainError::Validation(_)))); }