use super::*;
#[tokio::test]
async fn test_runner_schedule_after() {
let start = std::time::Instant::now();
let output = run_workflow_from_yaml(&testdata("schedule_after.yaml"), json!({}))
.await
.unwrap();
let elapsed = start.elapsed();
assert!(
elapsed.as_millis() >= 5,
"Expected at least 5ms delay, got {}ms",
elapsed.as_millis()
);
assert_eq!(output["phase"], json!("completed"));
}
#[tokio::test]
async fn test_runner_cron_start() {
let output = run_workflow_from_yaml(&testdata("cron_start.yaml"), json!({}))
.await
.unwrap();
assert_eq!(output["phase"], json!("started"));
}
#[tokio::test]
async fn test_runner_every_start() {
let output = run_workflow_from_yaml(&testdata("every_start.yaml"), json!({}))
.await
.unwrap();
assert_eq!(output["phase"], json!("started"));
}
#[tokio::test]
async fn test_runner_schedule_after_delay() {
let yaml_str = r#"
document:
dsl: '1.0.0'
namespace: test
name: schedule-after-delay
version: '0.1.0'
do:
- delayedStart:
set:
started: true
schedule:
after:
milliseconds: 1
"#;
let runner = WorkflowRunner::new(serde_yaml::from_str(&yaml_str).unwrap()).unwrap();
let start = std::time::Instant::now();
let output = runner.run(json!({})).await.unwrap();
let elapsed = start.elapsed();
assert_eq!(output["started"], json!(true));
assert!(
elapsed.as_millis() < 500,
"Should complete within 500ms, got {}ms",
elapsed.as_millis()
);
}
#[tokio::test]
async fn test_runner_schedule_after_java_pattern() {
let yaml_str = r#"
document:
dsl: '1.0.0'
namespace: test
name: after-schedule
version: '0.1.0'
schedule:
after:
milliseconds: 10
do:
- recovered:
set:
recovered: true
"#;
let output = run_workflow_yaml(&yaml_str, json!({})).await.unwrap();
assert_eq!(output["recovered"], json!(true));
}
#[tokio::test]
async fn test_runner_schedule_cron() {
let yaml_str = r#"
document:
dsl: '1.0.0'
namespace: test
name: cron-schedule
version: '0.1.0'
schedule:
cron: '0 0 * * *'
do:
- setTask:
set:
ran: true
"#;
let output = run_workflow_yaml(&yaml_str, json!({})).await.unwrap();
assert_eq!(output["ran"], json!(true));
}
#[tokio::test]
async fn test_runner_schedule_every() {
let yaml_str = r#"
document:
dsl: '1.0.0'
namespace: test
name: every-schedule
version: '0.1.0'
schedule:
every:
milliseconds: 10
do:
- setTask:
set:
ran: true
"#;
let output = run_workflow_yaml(&yaml_str, json!({})).await.unwrap();
assert_eq!(output["ran"], json!(true));
}
#[tokio::test]
async fn test_suspend_resume_workflow() {
let workflow: WorkflowDefinition = serde_yaml::from_str(
r#"
document:
dsl: '1.0.0'
namespace: test
name: suspend-test
version: '0.1.0'
do:
- step1:
set:
value: 1
- step2:
set:
value: 2
- step3:
set:
value: 3
"#,
)
.unwrap();
let runner = WorkflowRunner::new(workflow).unwrap();
let handle = runner.handle();
let run_handle = tokio::spawn(async move { runner.run(json!({})).await.unwrap() });
assert!(handle.suspend());
assert!(!handle.suspend());
assert!(handle.is_suspended());
tokio::time::sleep(std::time::Duration::from_millis(2)).await;
assert!(handle.resume());
assert!(!handle.is_suspended());
let output = run_handle.await.unwrap();
assert_eq!(output["value"], json!(3));
}
#[tokio::test]
async fn test_context_suspend_resume() {
let workflow = WorkflowDefinition::default();
let ctx = WorkflowContext::new(&workflow).unwrap();
assert!(!ctx.is_suspended());
assert!(ctx.suspend());
assert!(ctx.is_suspended());
assert!(!ctx.suspend());
assert!(ctx.resume());
assert!(!ctx.is_suspended());
assert!(!ctx.resume());
}
#[tokio::test]
async fn test_schedule_every() {
use std::sync::atomic::{AtomicU32, Ordering};
let workflow: WorkflowDefinition = serde_yaml::from_str(
r#"
document:
dsl: '1.0.0'
namespace: test
name: schedule-every
version: '0.1.0'
schedule:
every:
milliseconds: 10
do:
- step1:
set:
value: 42
"#,
)
.unwrap();
let counter = Arc::new(AtomicU32::new(0));
let counter_clone = counter.clone();
let runner = WorkflowRunner::new(workflow).unwrap();
let scheduled = runner.schedule(json!({}));
tokio::time::sleep(std::time::Duration::from_millis(2)).await;
counter_clone.fetch_add(1, Ordering::SeqCst);
scheduled.cancel();
let count = counter.load(Ordering::SeqCst);
assert!(
count >= 1,
"scheduled workflow should have run at least once, got {}",
count
);
}
#[tokio::test]
async fn test_schedule_no_schedule_runs_once() {
let workflow: WorkflowDefinition = serde_yaml::from_str(
r#"
document:
dsl: '1.0.0'
namespace: test
name: schedule-none
version: '0.1.0'
do:
- step1:
set:
value: hello
"#,
)
.unwrap();
let runner = WorkflowRunner::new(workflow).unwrap();
let scheduled = runner.schedule(json!({}));
tokio::time::sleep(std::time::Duration::from_millis(2)).await;
scheduled.cancel();
}