mod state;
mod subworkflow;
pub use state::{
PermissionAlias, StartWorkflowState, StartWorkflowStateBuilder, WorkflowState,
WorkflowStateBuilder,
};
pub use subworkflow::{SubWorkflow, SubWorkflowBuilder};
pub struct Workflow {
subworkflow: Vec<SubWorkflow>,
}
impl Workflow {
pub fn new(subworkflow: Vec<SubWorkflow>) -> Self {
Self { subworkflow }
}
pub fn subworkflow(&self, name: &str) -> Option<SubWorkflow> {
for sub_wf in &self.subworkflow {
if sub_wf.name() == name {
return Some(sub_wf.clone());
}
}
None
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_permission_alias() {
let mut permission = PermissionAlias::new("po::seller");
permission.add_permission("can-create-po");
permission.add_permission("can-update-po");
permission.add_transition("confirm");
assert_eq!("po::seller", permission.name());
assert_eq!(
&["can-create-po".to_string(), "can-update-po".to_string()],
permission.permissions()
);
assert_eq!(&["confirm".to_string()], permission.transitions());
}
#[test]
fn test_workflow_state() {
let mut permission = PermissionAlias::new("po::seller");
permission.add_permission("can-create-po");
permission.add_permission("can-update-po");
permission.add_transition("confirm");
let state = WorkflowStateBuilder::new("create")
.add_constraint("active=None")
.add_transition("issued")
.add_transition("confirm")
.add_permission_alias(permission)
.build();
assert_eq!(
vec!["can-create-po".to_string(), "can-update-po".to_string()],
state.expand_permissions(&vec!["po::seller".to_string()]),
);
assert_eq!(
true,
state.can_transition("confirm".to_string(), &["po::seller".to_string()]),
);
assert_eq!(
false,
state.can_transition("issued".to_string(), &["po::seller".to_string()]),
);
}
#[test]
fn test_subworkflow() {
let mut permission = PermissionAlias::new("po::seller");
permission.add_permission("can-create-po");
permission.add_permission("can-update-po");
permission.add_transition("confirm");
let state = WorkflowStateBuilder::new("issued")
.add_constraint("active=None")
.add_transition("issued")
.add_transition("confirm")
.add_permission_alias(permission.clone())
.build();
let start_state = StartWorkflowStateBuilder::default()
.add_permission_alias(permission)
.add_transition("issued")
.build();
let subworkflow = SubWorkflowBuilder::new("po")
.with_start_state(start_state.clone())
.add_state(state)
.build();
assert_eq!("po", subworkflow.name());
assert!(subworkflow.start_state().is_some());
assert!(subworkflow.state("issued").is_some());
}
#[test]
fn test_workflow() {
let mut permission = PermissionAlias::new("po::seller");
permission.add_permission("can-create-po");
permission.add_permission("can-update-po");
permission.add_transition("confirm");
let state = WorkflowStateBuilder::new("issued")
.add_constraint("active=None")
.add_transition("issued")
.add_transition("confirm")
.add_permission_alias(permission.clone())
.build();
let start_state = StartWorkflowStateBuilder::default()
.add_permission_alias(permission)
.add_transition("issued")
.build();
let subworkflow = SubWorkflowBuilder::new("po")
.with_start_state(start_state)
.add_state(state)
.build();
let workflow = Workflow::new(vec![subworkflow]);
assert!(workflow.subworkflow("po").is_some());
}
}