use std::sync::Arc; use application::testing::{InMemoryUserRepository, StubPasswordHasher}; use application::use_cases::RegisterUser; use domain::errors::DomainError; #[tokio::test] async fn registers_new_user() { let repo = Arc::new(InMemoryUserRepository::new()); let uc = RegisterUser::new(repo.clone(), Arc::new(StubPasswordHasher)); let user = uc.execute("testuser", "test@example.com", "password123").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 uc = RegisterUser::new(repo.clone(), Arc::new(StubPasswordHasher)); uc.execute("user1", "test@example.com", "password123").await.unwrap(); let result = uc.execute("user2", "test@example.com", "different1").await; assert!(matches!(result, Err(DomainError::Conflict(_)))); } #[tokio::test] async fn rejects_duplicate_username() { let repo = Arc::new(InMemoryUserRepository::new()); let uc = RegisterUser::new(repo.clone(), Arc::new(StubPasswordHasher)); uc.execute("sameuser", "a@example.com", "password123").await.unwrap(); let result = uc.execute("sameuser", "b@example.com", "password123").await; assert!(matches!(result, Err(DomainError::Conflict(_)))); } #[tokio::test] async fn rejects_short_password() { let repo = Arc::new(InMemoryUserRepository::new()); let uc = RegisterUser::new(repo, Arc::new(StubPasswordHasher)); let result = uc.execute("user", "test@example.com", "short").await; assert!(matches!(result, Err(DomainError::Validation(_)))); } #[tokio::test] async fn rejects_empty_username() { let repo = Arc::new(InMemoryUserRepository::new()); let uc = RegisterUser::new(repo, Arc::new(StubPasswordHasher)); let result = uc.execute("", "test@example.com", "password123").await; assert!(matches!(result, Err(DomainError::Validation(_)))); }