app: add sidecar sync commands (export, detect, import, resolve, full export/import)
This commit is contained in:
54
crates/application/tests/sidecar/commands/import_sidecar.rs
Normal file
54
crates/application/tests/sidecar/commands/import_sidecar.rs
Normal file
@@ -0,0 +1,54 @@
|
||||
use std::sync::Arc;
|
||||
use application::sidecar::{ImportSidecarCommand, ImportSidecarHandler};
|
||||
use application::testing::{InMemoryAssetMetadataRepository, InMemorySidecarRepository, InMemorySidecarWriter};
|
||||
use domain::catalog::entities::MetadataSource;
|
||||
use domain::entities::{SidecarRecord, SyncStatus};
|
||||
use domain::errors::DomainError;
|
||||
use domain::ports::{SidecarRepository, SidecarWriterPort};
|
||||
use domain::value_objects::{MetadataValue, StructuredData, SystemId};
|
||||
|
||||
#[tokio::test]
|
||||
async fn imports_pending_read_sidecar() {
|
||||
let sidecar_repo = Arc::new(InMemorySidecarRepository::new());
|
||||
let writer = Arc::new(InMemorySidecarWriter::new());
|
||||
let meta_repo = Arc::new(InMemoryAssetMetadataRepository::new());
|
||||
|
||||
let asset_id = SystemId::new();
|
||||
let path = format!("sidecars/{}.xmp", asset_id);
|
||||
|
||||
// Create PendingRead record
|
||||
let mut record = SidecarRecord::new(asset_id, &path);
|
||||
record.mark_pending_read();
|
||||
sidecar_repo.save(&record).await.unwrap();
|
||||
|
||||
// Write sidecar file data
|
||||
let mut data = StructuredData::new();
|
||||
data.insert("camera", MetadataValue::String("Canon".into()));
|
||||
writer.write_sidecar(&data, &path).await.unwrap();
|
||||
|
||||
let handler = ImportSidecarHandler::new(sidecar_repo.clone(), writer, meta_repo);
|
||||
let metadata = handler.execute(ImportSidecarCommand { asset_id }).await.unwrap();
|
||||
|
||||
assert_eq!(metadata.metadata_source, MetadataSource::ExifExtracted);
|
||||
assert_eq!(metadata.data.get_string("camera"), Some("Canon"));
|
||||
|
||||
let updated = sidecar_repo.find_by_asset(&asset_id).await.unwrap().unwrap();
|
||||
assert_eq!(updated.sync_status, SyncStatus::InSync);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn rejects_non_pending_read() {
|
||||
let sidecar_repo = Arc::new(InMemorySidecarRepository::new());
|
||||
let writer = Arc::new(InMemorySidecarWriter::new());
|
||||
let meta_repo = Arc::new(InMemoryAssetMetadataRepository::new());
|
||||
|
||||
let asset_id = SystemId::new();
|
||||
let record = SidecarRecord::new(asset_id, "sidecars/x.xmp");
|
||||
// Default status is PendingWrite, not PendingRead
|
||||
sidecar_repo.save(&record).await.unwrap();
|
||||
|
||||
let handler = ImportSidecarHandler::new(sidecar_repo, writer, meta_repo);
|
||||
let result = handler.execute(ImportSidecarCommand { asset_id }).await;
|
||||
|
||||
assert!(matches!(result, Err(DomainError::Validation(_))));
|
||||
}
|
||||
Reference in New Issue
Block a user