use application::sidecar::{ExportSidecarCommand, ExportSidecarHandler}; use application::testing::{ InMemoryAssetMetadataRepository, InMemorySidecarRepository, InMemorySidecarWriter, }; use domain::catalog::entities::{AssetMetadata, MetadataSource}; use domain::entities::SyncStatus; use domain::ports::SidecarRepository; use domain::value_objects::{MetadataValue, StructuredData, SystemId}; use std::sync::Arc; #[tokio::test] async fn exports_sidecar_marks_in_sync() { let meta_repo = Arc::new(InMemoryAssetMetadataRepository::new()); let sidecar_repo = Arc::new(InMemorySidecarRepository::new()); let writer = Arc::new(InMemorySidecarWriter::new()); let asset_id = SystemId::new(); let mut data = StructuredData::new(); data.insert("title", MetadataValue::String("Beach".into())); let metadata = AssetMetadata::new(asset_id, MetadataSource::UserEdited, data); use domain::ports::AssetMetadataRepository; meta_repo.save(&metadata).await.unwrap(); let handler = ExportSidecarHandler::new(meta_repo, sidecar_repo.clone(), writer.clone()); let record = handler .execute(ExportSidecarCommand { asset_id }) .await .unwrap(); assert_eq!(record.sync_status, SyncStatus::InSync); assert!(record.last_known_file_hash.is_some()); let written = writer.get(&record.sidecar_storage_path).await; assert!(written.is_some()); assert_eq!(written.unwrap().get_string("title"), Some("Beach")); } #[tokio::test] async fn creates_new_record_if_none_exists() { let meta_repo = Arc::new(InMemoryAssetMetadataRepository::new()); let sidecar_repo = Arc::new(InMemorySidecarRepository::new()); let writer = Arc::new(InMemorySidecarWriter::new()); let asset_id = SystemId::new(); let handler = ExportSidecarHandler::new(meta_repo, sidecar_repo.clone(), writer); let record = handler .execute(ExportSidecarCommand { asset_id }) .await .unwrap(); assert_eq!(record.asset_id, asset_id); assert_eq!(record.sync_status, SyncStatus::InSync); let saved = sidecar_repo.find_by_asset(&asset_id).await.unwrap(); assert!(saved.is_some()); }