use durare::{
DurableContext, DurableEngine, InMemoryProvider, Result, StateProvider, WorkflowOptions,
};
use serde_json::Value;
use std::sync::Arc;
#[tokio::test]
async fn patch_new_workflow_takes_new_path() -> Result<()> {
let mut engine = DurableEngine::new(Arc::new(InMemoryProvider::new())).await?;
engine.register("wf", |ctx: DurableContext, _: ()| async move {
ctx.patch("feature").await
});
let patched: bool = engine
.start("wf", (), WorkflowOptions::with_id("fresh"))
.await?
.result()
.await?;
assert!(patched, "a brand-new workflow uses the patched code");
let steps = engine.get_workflow_steps("fresh").await?;
assert_eq!(steps.len(), 1);
assert_eq!(steps[0].step_id, 0);
assert_eq!(steps[0].name, "DBOS.patch-feature");
Ok(())
}
#[tokio::test]
async fn patch_pre_patch_workflow_takes_old_path() -> Result<()> {
let provider = Arc::new(InMemoryProvider::new());
provider
.record_step_result("old", 0, "legacy_step", Value::from(1), None, None)
.await?;
let mut engine = DurableEngine::new(provider).await?;
engine.register("wf", |ctx: DurableContext, _: ()| async move {
ctx.patch("feature").await
});
let patched: bool = engine
.start::<_, bool>("wf", (), WorkflowOptions::with_id("old"))
.await?
.result()
.await?;
assert!(
!patched,
"a workflow past this point pre-patch uses the old code"
);
Ok(())
}