szal 1.2.0

Workflow engine — step/flow execution with branching, retry, rollback, and parallel stages
Documentation
use crate::*;

#[test]
fn full_sequential_flow() {
    let mut flow = flow::FlowDef::new("deploy-pipeline", flow::FlowMode::Sequential);
    flow.add_step(step::StepDef::new("build").with_timeout(60_000));
    flow.add_step(step::StepDef::new("test").with_retries(2, 1000));
    flow.add_step(step::StepDef::new("deploy").with_rollback());
    assert_eq!(flow.steps.len(), 3);
    assert!(flow.validate().is_ok());
}

#[test]
fn dag_flow_with_diamond() {
    let build = step::StepDef::new("build");
    let test_unit = step::StepDef::new("unit-test").depends_on(build.id);
    let test_integ = step::StepDef::new("integ-test").depends_on(build.id);
    let deploy = step::StepDef::new("deploy")
        .depends_on(test_unit.id)
        .depends_on(test_integ.id);

    let mut flow = flow::FlowDef::new("diamond", flow::FlowMode::Dag);
    flow.add_step(build);
    flow.add_step(test_unit);
    flow.add_step(test_integ);
    flow.add_step(deploy);
    assert!(flow.validate().is_ok());
}

#[test]
fn workflow_state_lifecycle() {
    let s = state::WorkflowState::Created;
    assert!(s.valid_transition(&state::WorkflowState::Running));
    assert!(!s.is_terminal());
}

#[test]
fn error_display() {
    let err = SzalError::RetryExhausted {
        step: "deploy".into(),
        attempts: 3,
    };
    assert!(err.to_string().contains("deploy"));
    assert!(err.to_string().contains("3"));
}