feat: idempotent handlers, deterministic activity ids
This commit is contained in:
@@ -162,3 +162,33 @@ async fn converts_jpeg_to_webp_and_swaps_key() {
|
||||
);
|
||||
assert!(storage.get("avatars/u1.webp").await.is_ok());
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn image_conversion_is_idempotent_when_run_twice() {
|
||||
for format in [Format::Webp, Format::Avif] {
|
||||
let storage = in_memory_storage();
|
||||
storage.store("posters/m1", &tiny_jpeg()).await.unwrap();
|
||||
let image_ref = MockImageRef::new();
|
||||
let handler = ImageConversionHandler::new(
|
||||
Arc::clone(&storage) as Arc<dyn ObjectStorage>,
|
||||
Arc::clone(&image_ref) as Arc<dyn ImageRefCommand>,
|
||||
format,
|
||||
);
|
||||
let event = DomainEvent::ImageStored {
|
||||
key: "posters/m1".into(),
|
||||
};
|
||||
let new_key = format!("posters/m1{}", format.extension());
|
||||
|
||||
handler.handle(&event).await.unwrap();
|
||||
let converted = storage.get(&new_key).await.unwrap();
|
||||
// Redelivery after the original was swapped and deleted.
|
||||
handler.handle(&event).await.unwrap();
|
||||
|
||||
assert_eq!(image_ref.swaps().len(), 1, "one swap");
|
||||
assert_eq!(
|
||||
storage.get(&new_key).await.unwrap(),
|
||||
converted,
|
||||
"converted bytes are not re-encoded"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user