use application::organization::{ CreateAlbumCommand, CreateAlbumHandler, GetAlbumHandler, GetAlbumQuery, }; use application::testing::InMemoryAlbumRepository; use domain::errors::DomainError; use domain::value_objects::SystemId; use std::sync::Arc; #[tokio::test] async fn returns_album() { let repo = Arc::new(InMemoryAlbumRepository::new()); let creator = SystemId::new(); let create_handler = CreateAlbumHandler::new(repo.clone()); let album = create_handler .execute(CreateAlbumCommand { title: "My Album".into(), creator_id: creator, }) .await .unwrap(); let query_handler = GetAlbumHandler::new(repo); let found = query_handler .execute(GetAlbumQuery { album_id: album.album_id, user_id: creator, }) .await .unwrap(); assert_eq!(found.album_id, album.album_id); assert_eq!(found.title, "My Album"); } #[tokio::test] async fn rejects_nonexistent() { let repo = Arc::new(InMemoryAlbumRepository::new()); let handler = GetAlbumHandler::new(repo); let result = handler .execute(GetAlbumQuery { album_id: SystemId::new(), user_id: SystemId::new(), }) .await; assert!(matches!(result, Err(DomainError::NotFound(_)))); } #[tokio::test] async fn rejects_forbidden_access() { let repo = Arc::new(InMemoryAlbumRepository::new()); let creator = SystemId::new(); let create_handler = CreateAlbumHandler::new(repo.clone()); let album = create_handler .execute(CreateAlbumCommand { title: "Private Album".into(), creator_id: creator, }) .await .unwrap(); let query_handler = GetAlbumHandler::new(repo); let other_user = SystemId::new(); let result = query_handler .execute(GetAlbumQuery { album_id: album.album_id, user_id: other_user, }) .await; assert!(matches!(result, Err(DomainError::Forbidden(_)))); }