use durare::{DurableContext, DurableEngine, Error, InMemoryProvider, Result, WorkflowOptions};
use std::sync::Arc;
use std::time::Duration;
async fn engine_with_quick() -> Result<DurableEngine> {
let mut engine = DurableEngine::new(Arc::new(InMemoryProvider::new())).await?;
engine.register("quick", |_ctx: DurableContext, n: i64| async move {
Ok::<_, Error>(n + 1)
});
engine.launch().await?;
Ok(engine)
}
#[tokio::test]
async fn handle_awaits_directly() -> Result<()> {
let engine = engine_with_quick().await?;
let handle = engine
.start::<_, i64>("quick", 1_i64, WorkflowOptions::default())
.await?;
let out: i64 = handle.await?;
assert_eq!(out, 2);
engine.shutdown(Duration::from_secs(1)).await?;
Ok(())
}
#[tokio::test]
async fn result_takes_shared_ref_and_is_reusable() -> Result<()> {
let engine = engine_with_quick().await?;
let handle = engine
.start::<_, i64>("quick", 41_i64, WorkflowOptions::default())
.await?;
let first: i64 = handle.result().await?;
let second: i64 = handle.result().await?;
assert_eq!(first, 42);
assert_eq!(second, 42);
engine.shutdown(Duration::from_secs(1)).await?;
Ok(())
}
#[tokio::test]
async fn handle_clones_and_is_send_across_spawn() -> Result<()> {
let engine = engine_with_quick().await?;
let handle = engine
.start::<_, i64>("quick", 10_i64, WorkflowOptions::default())
.await?;
let observer = handle.clone();
let spawned = tokio::spawn(async move { observer.await });
let here: i64 = handle.await?;
let there: i64 = spawned.await.expect("spawned task panicked")?;
assert_eq!(here, 11);
assert_eq!(there, 11);
engine.shutdown(Duration::from_secs(1)).await?;
Ok(())
}