Files
k-photos/crates/application/tests/sidecar/commands/import_sidecar.rs

64 lines
2.3 KiB
Rust

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};
use std::sync::Arc;
#[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(_))));
}