use super::*;
#[tokio::test]
async fn test_runner_fork_simple() {
let output = run_workflow_from_yaml(&testdata("fork_simple.yaml"), json!({}))
.await
.unwrap();
let colors = output["colors"].as_array().unwrap();
assert!(colors.contains(&json!("red")));
assert!(colors.contains(&json!("blue")));
}
#[tokio::test]
async fn test_runner_fork_wait() {
let output = run_workflow_from_yaml(&testdata("fork_wait.yaml"), json!({}))
.await
.unwrap();
assert!(output.is_object());
assert_eq!(output.as_object().unwrap().len(), 2);
}
#[tokio::test]
async fn test_runner_fork_compete() {
let output = run_workflow_from_yaml(&testdata("fork_compete.yaml"), json!({}))
.await
.unwrap();
assert!(output["patientId"].is_string());
assert!(output["room"].is_number());
}
#[tokio::test]
async fn test_runner_fork_compete_timed() {
let output = run_workflow_from_yaml(&testdata("fork_compete_timed.yaml"), json!({}))
.await
.unwrap();
assert_eq!(output["winner"], json!("fast"));
}
#[tokio::test]
async fn test_runner_fork_no_compete() {
let output = run_workflow_from_yaml(&testdata("fork_no_compete.yaml"), json!({}))
.await
.unwrap();
assert!(output.is_object());
assert_eq!(output.as_object().unwrap().len(), 2);
}
#[tokio::test]
async fn test_runner_fork_no_compete_with_names() {
let output = run_workflow_from_yaml(&testdata("fork_no_compete.yaml"), json!({}))
.await
.unwrap();
assert!(output.is_object());
assert!(output.get("callNurse").is_some());
assert!(output.get("callDoctor").is_some());
}
#[tokio::test]
async fn test_runner_fork_compete_returns_first() {
let output = run_workflow_from_yaml(&testdata("fork_compete.yaml"), json!({}))
.await
.unwrap();
assert!(output["patientId"].is_string());
assert!(output["room"].is_number());
}
#[tokio::test]
async fn test_runner_fork_compete_output_as() {
let yaml_str = r#"
document:
dsl: '1.0.0'
namespace: test
name: fork-compete-output-as
version: '0.1.0'
do:
- race:
fork:
compete: true
branches:
- branch1:
do:
- setResult:
set:
winner: branch1
- branch2:
do:
- setResult:
set:
winner: branch2
output:
as: .winner
"#;
let output = run_workflow_yaml(&yaml_str, json!({})).await.unwrap();
assert!(output == json!("branch1") || output == json!("branch2"));
}
#[tokio::test]
async fn test_runner_fork_single_branch() {
let yaml_str = r#"
document:
dsl: '1.0.0'
namespace: test
name: fork-single
version: '0.1.0'
do:
- singleFork:
fork:
compete: false
branches:
- onlyBranch:
do:
- setResult:
set:
value: 42
"#;
let output = run_workflow_yaml(&yaml_str, json!({})).await.unwrap();
assert_eq!(output["onlyBranch"]["value"], json!(42));
}
#[tokio::test]
async fn test_runner_fork_compete_with_output_as() {
let yaml_str = r#"
document:
dsl: '1.0.0'
namespace: test
name: fork-compete-output-as
version: '0.1.0'
do:
- race:
fork:
compete: true
branches:
- fastBranch:
do:
- setResult:
set:
winner: fast
- slowBranch:
do:
- waitABit:
wait:
milliseconds: 5
- setResult:
set:
winner: slow
output:
as: .winner
"#;
let output = run_workflow_yaml(&yaml_str, json!({})).await.unwrap();
assert_eq!(output, json!("fast"));
}
#[tokio::test]
async fn test_runner_fork_compete_winner_output() {
let yaml_str = r#"
document:
dsl: '1.0.0'
namespace: test
name: fork-compete-winner
version: '0.1.0'
do:
- race:
fork:
compete: true
branches:
- fastBranch:
do:
- setFast:
set:
winner: fast
time: 10
- slowBranch:
do:
- waitABit:
wait: PT0.1S
- setSlow:
set:
winner: slow
time: 100
"#;
let output = run_workflow_yaml(&yaml_str, json!({})).await.unwrap();
assert_eq!(output["winner"], json!("fast"));
}
#[tokio::test]
async fn test_runner_fork_branch_output_as() {
let yaml_str = r#"
document:
dsl: '1.0.0'
namespace: test
name: fork-branch-output-as
version: '0.1.0'
do:
- parallel:
fork:
compete: true
branches:
- branchA:
do:
- computeA:
set:
winner: fast
time: 10
- branchB:
do:
- waitABit:
wait: PT0.1S
- computeB:
set:
winner: slow
time: 100
output:
as: "${ {winner: .winner, elapsed: .time} }"
"#;
let output = run_workflow_yaml(&yaml_str, json!({})).await.unwrap();
assert_eq!(output["winner"], json!("fast"));
assert_eq!(output["elapsed"], json!(10));
}
#[tokio::test]
async fn test_runner_fork_try_catch_branch() {
let yaml_str = r#"
document:
dsl: '1.0.0'
namespace: test
name: fork-try-catch-branch
version: '0.1.0'
do:
- parallel:
fork:
compete: false
branches:
- safeBranch:
do:
- guarded:
try:
- failStep:
raise:
error:
type: validation
title: Branch Error
status: 400
catch:
errors:
with:
type: validation
do:
- recover:
set:
recovered: true
"#;
let output = run_workflow_yaml(&yaml_str, json!({})).await.unwrap();
assert_eq!(output["safeBranch"]["recovered"], json!(true));
}
#[tokio::test]
async fn test_runner_fork_single_behaves_sequential() {
let yaml_str = r#"
document:
dsl: '1.0.0'
namespace: test
name: fork-single-sequential
version: '0.1.0'
do:
- parallel:
fork:
compete: false
branches:
- onlyBranch:
do:
- step1:
set:
value: 42
"#;
let output = run_workflow_yaml(&yaml_str, json!({})).await.unwrap();
assert_eq!(output["onlyBranch"]["value"], json!(42));
}
#[tokio::test]
async fn test_runner_fork_two_branches() {
let yaml_str = r#"
document:
dsl: '1.0.0'
namespace: test
name: fork-two-branches
version: '0.1.0'
do:
- parallel:
fork:
compete: false
branches:
- branchA:
set:
a: 1
- branchB:
set:
b: 2
"#;
let output = run_workflow_yaml(&yaml_str, json!({})).await.unwrap();
assert!(output.is_object());
assert_eq!(output.as_object().unwrap().len(), 2);
}
#[tokio::test]
async fn test_runner_fork_compete_error_branch() {
let yaml_str = r#"
document:
dsl: '1.0.0'
namespace: test
name: fork-compete-error-branch
version: '0.1.0'
do:
- race:
fork:
compete: true
branches:
- fail:
raise:
error:
type: runtime
title: Fail
status: 500
- succeed:
set:
winner: true
"#;
let output = run_workflow_yaml(&yaml_str, json!({})).await.unwrap();
assert_eq!(output["winner"], json!(true));
}
#[tokio::test]
async fn test_runner_fork_compete_speed() {
let yaml_str = r#"
document:
dsl: '1.0.0'
namespace: test
name: fork-compete-speed
version: '0.1.0'
do:
- race:
fork:
compete: true
branches:
- fails:
raise:
error:
type: runtime
title: Fail
status: 500
- succeeds:
set:
winner: fast
"#;
let output = run_workflow_yaml(&yaml_str, json!({})).await.unwrap();
assert_eq!(output["winner"], json!("fast"));
}
#[tokio::test]
async fn test_runner_fork_compete_with_set_branches() {
let yaml_str = r#"
document:
dsl: '1.0.0'
namespace: test
name: fork-compete-set
version: '0.1.0'
do:
- callSomeone:
fork:
compete: true
branches:
- callNurse:
set:
patientId: John
room: 1
- callDoctor:
set:
patientId: Smith
room: 2
"#;
let output = run_workflow_yaml(&yaml_str, json!({})).await.unwrap();
let patient_id = output["patientId"].as_str();
assert!(patient_id == Some("John") || patient_id == Some("Smith"));
}
#[tokio::test]
async fn test_runner_fork_compete_with_timing() {
let yaml_str = r#"
document:
dsl: '1.0.0'
namespace: test
name: fork-compete-timing
version: '0.1.0'
do:
- raceTask:
fork:
compete: true
branches:
- fastBranch:
do:
- quickSet:
set:
winner: fast
- slowBranch:
do:
- delay:
wait: PT0.05S
- lateSet:
set:
winner: slow
"#;
let output = run_workflow_yaml(&yaml_str, json!({})).await.unwrap();
assert_eq!(output["winner"], json!("fast"));
}
#[tokio::test]
async fn test_runner_fork_non_compete_named_branches() {
let yaml_str = r#"
document:
dsl: '1.0.0'
namespace: test
name: fork-no-compete-named
version: '0.1.0'
do:
- parallelTask:
fork:
compete: false
branches:
- callNurse:
set:
patientId: John
room: 1
- callDoctor:
set:
patientId: Smith
room: 2
"#;
let output = run_workflow_yaml(&yaml_str, json!({})).await.unwrap();
if output.is_object() {
assert_eq!(output.as_object().unwrap().len(), 2);
assert!(output.get("callNurse").is_some());
assert!(output.get("callDoctor").is_some());
assert_eq!(output["callNurse"]["patientId"], json!("John"));
assert_eq!(output["callDoctor"]["patientId"], json!("Smith"));
}
}
#[tokio::test]
async fn test_runner_fork_simple_non_compete() {
let yaml_str = r#"
document:
dsl: '1.0.0'
namespace: test
name: fork-simple
version: '1.0.0'
do:
- forkColors:
fork:
compete: false
branches:
- addRed:
set:
color: red
- addBlue:
set:
color: blue
"#;
let output = run_workflow_yaml(&yaml_str, json!({})).await.unwrap();
assert!(output.is_object());
assert_eq!(output.as_object().unwrap().len(), 2);
}
#[tokio::test]
async fn test_e2e_fork_simple() {
let yaml_str = r#"
document:
dsl: '1.0.0'
namespace: test
name: fork-example
version: '0.1.0'
do:
- branchColors:
fork:
compete: false
branches:
- setRed:
set:
color1: red
- setBlue:
set:
color2: blue
- joinResult:
set:
colors: "${ [to_entries[].value[]] }"
"#;
let output = run_workflow_yaml(&yaml_str, json!({})).await.unwrap();
let colors = output["colors"].as_array().unwrap();
assert_eq!(colors.len(), 2);
assert!(colors.contains(&json!("red")));
assert!(colors.contains(&json!("blue")));
}
#[tokio::test]
async fn test_e2e_fork_no_compete_with_wait() {
let yaml_str = r#"
document:
dsl: '1.0.0'
namespace: test
name: fork-example
version: '0.1.0'
do:
- callSomeone:
fork:
compete: false
branches:
- callNurse:
do:
- waitForNurse:
wait:
milliseconds: 5
- nurseArrived:
set:
patientId: John
room: 1
- callDoctor:
do:
- waitForDoctor:
wait:
milliseconds: 5
- doctorArrived:
set:
patientId: Smith
room: 2
"#;
let output = run_workflow_yaml(&yaml_str, json!({})).await.unwrap();
assert!(output.is_object());
assert!(output.get("callNurse").is_some());
assert!(output.get("callDoctor").is_some());
assert_eq!(output["callNurse"]["room"], json!(1));
assert_eq!(output["callDoctor"]["room"], json!(2));
}
#[tokio::test]
async fn test_e2e_fork_wait() {
let yaml_str = r#"
document:
dsl: '1.0.0'
namespace: test
name: fork-wait
version: '0.1.0'
do:
- incrParallel:
fork:
compete: false
branches:
- helloBranch:
do:
- waitABit:
wait:
milliseconds: 5
- set:
set:
value: 1
- byeBranch:
do:
- waitABit:
wait:
milliseconds: 5
- set:
set:
value: 2
"#;
let output = run_workflow_yaml(&yaml_str, json!({})).await.unwrap();
assert!(output.is_object());
assert!(output.get("helloBranch").is_some());
assert!(output.get("byeBranch").is_some());
assert_eq!(output["helloBranch"]["value"], json!(1));
assert_eq!(output["byeBranch"]["value"], json!(2));
}