app: add core use cases (RegisterUser, CreateAlbum) with TDD

This commit is contained in:
2026-05-31 04:25:47 +02:00
parent 294626db72
commit 51fa62fdef
19 changed files with 168 additions and 154 deletions

View File

@@ -0,0 +1 @@
mod register_user;

View File

@@ -0,0 +1,48 @@
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(_))));
}