use std::sync::Arc; use application::testing::InMemoryAlbumRepository; use application::organization::{ AlbumAction, CreateAlbumCommand, CreateAlbumHandler, ManageAlbumEntriesCommand, ManageAlbumEntriesHandler, }; use domain::errors::DomainError; use domain::value_objects::SystemId; async fn setup_album(repo: &Arc, creator: SystemId) -> SystemId { let handler = CreateAlbumHandler::new(repo.clone()); let album = handler.execute(CreateAlbumCommand { title: "Test Album".into(), creator_id: creator, }).await.unwrap(); album.album_id } #[tokio::test] async fn adds_asset_to_album() { let repo = Arc::new(InMemoryAlbumRepository::new()); let user = SystemId::new(); let album_id = setup_album(&repo, user).await; let asset_id = SystemId::new(); let handler = ManageAlbumEntriesHandler::new(repo.clone()); let album = handler.execute(ManageAlbumEntriesCommand { album_id, action: AlbumAction::Add { asset_id }, user_id: user, }).await.unwrap(); assert_eq!(album.asset_count(), 1); assert_eq!(album.entries[0].asset_id, asset_id); } #[tokio::test] async fn removes_asset_from_album() { let repo = Arc::new(InMemoryAlbumRepository::new()); let user = SystemId::new(); let album_id = setup_album(&repo, user).await; let asset_id = SystemId::new(); let handler = ManageAlbumEntriesHandler::new(repo.clone()); handler.execute(ManageAlbumEntriesCommand { album_id, action: AlbumAction::Add { asset_id }, user_id: user, }).await.unwrap(); let album = handler.execute(ManageAlbumEntriesCommand { album_id, action: AlbumAction::Remove { asset_id }, user_id: user, }).await.unwrap(); assert_eq!(album.asset_count(), 0); } #[tokio::test] async fn rejects_nonexistent_album() { let repo = Arc::new(InMemoryAlbumRepository::new()); let handler = ManageAlbumEntriesHandler::new(repo); let result = handler.execute(ManageAlbumEntriesCommand { album_id: SystemId::new(), action: AlbumAction::Add { asset_id: SystemId::new() }, user_id: SystemId::new(), }).await; assert!(matches!(result, Err(DomainError::NotFound(_)))); } #[tokio::test] async fn rejects_duplicate_add() { let repo = Arc::new(InMemoryAlbumRepository::new()); let user = SystemId::new(); let album_id = setup_album(&repo, user).await; let asset_id = SystemId::new(); let handler = ManageAlbumEntriesHandler::new(repo.clone()); handler.execute(ManageAlbumEntriesCommand { album_id, action: AlbumAction::Add { asset_id }, user_id: user, }).await.unwrap(); let result = handler.execute(ManageAlbumEntriesCommand { album_id, action: AlbumAction::Add { asset_id }, user_id: user, }).await; assert!(matches!(result, Err(DomainError::Conflict(_)))); }