domain: add Media Catalog ports and MetadataResolver service
This commit is contained in:
45
crates/domain/tests/services/metadata_resolver.rs
Normal file
45
crates/domain/tests/services/metadata_resolver.rs
Normal file
@@ -0,0 +1,45 @@
|
||||
use domain::entities::{AssetMetadata, MetadataSource};
|
||||
use domain::services::metadata_resolver::{get_field_source, resolve_metadata};
|
||||
use domain::value_objects::{MetadataValue, StructuredData, SystemId};
|
||||
|
||||
fn layer(source: MetadataSource, entries: &[(&str, &str)]) -> AssetMetadata {
|
||||
let mut data = StructuredData::new();
|
||||
for (k, v) in entries {
|
||||
data.insert(*k, MetadataValue::String(v.to_string()));
|
||||
}
|
||||
AssetMetadata::new(SystemId::new(), source, data)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn user_edited_overrides_exif() {
|
||||
let exif = layer(MetadataSource::ExifExtracted, &[("title", "DSC_0001")]);
|
||||
let user = layer(MetadataSource::UserEdited, &[("title", "Sunset")]);
|
||||
let result = resolve_metadata(&[exif, user]);
|
||||
assert_eq!(result.get_string("title"), Some("Sunset"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ai_overrides_exif_but_not_user() {
|
||||
let exif = layer(MetadataSource::ExifExtracted, &[("desc", "raw"), ("camera", "Nikon")]);
|
||||
let ai = layer(MetadataSource::AiGenerated, &[("desc", "ai-desc")]);
|
||||
let user = layer(MetadataSource::UserEdited, &[("desc", "user-desc")]);
|
||||
let result = resolve_metadata(&[exif, ai, user]);
|
||||
assert_eq!(result.get_string("desc"), Some("user-desc"));
|
||||
assert_eq!(result.get_string("camera"), Some("Nikon"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn get_field_source_returns_highest_priority() {
|
||||
let exif = layer(MetadataSource::ExifExtracted, &[("iso", "100")]);
|
||||
let ai = layer(MetadataSource::AiGenerated, &[("iso", "200")]);
|
||||
let layers = [exif, ai];
|
||||
let (src, val) = get_field_source(&layers, "iso").unwrap();
|
||||
assert_eq!(src, MetadataSource::AiGenerated);
|
||||
assert_eq!(val, &MetadataValue::String("200".to_string()));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn empty_layers_returns_empty() {
|
||||
let result = resolve_metadata(&[]);
|
||||
assert!(result.is_empty());
|
||||
}
|
||||
@@ -1,2 +1,3 @@
|
||||
mod permission_service;
|
||||
mod quota_checker;
|
||||
mod metadata_resolver;
|
||||
|
||||
Reference in New Issue
Block a user