use std::sync::Arc;
use rust_viewflow::{
CreateWorkflowRequest, DefaultWorkflowApi, DefaultWorkflowEngine, LeaveRequestWorkflow,
MemoryDatabase, WorkflowApi, WorkflowStatus,
};
#[tokio::test]
async fn leave_request_multi_stage_flow_works() {
let db = Arc::new(MemoryDatabase::new());
let engine = Arc::new(DefaultWorkflowEngine::new(db.clone()));
engine.register_workflow(Arc::new(LeaveRequestWorkflow::new(db.clone())));
let api = DefaultWorkflowApi::new(engine);
let created = api
.create_workflow(CreateWorkflowRequest {
workflow_type: "leave_request".to_string(),
data: serde_json::json!({
"employee_id": "emp-100",
"manager_id": "mgr-100",
"hr_id": "hr-100",
"start_date": "2026-03-01",
"end_date": "2026-03-03",
"reason": "medical leave",
"locale": "zh-CN"
}),
})
.await
.expect("workflow should be created");
assert_eq!(created.name, "leave_request");
let first_tasks = api
.get_tasks(&created.id)
.await
.expect("tasks should exist after create");
assert_eq!(first_tasks.len(), 1);
assert_eq!(first_tasks[0].name, "直属经理审批");
api.complete_task(
&first_tasks[0].id,
rust_viewflow::CompleteTaskRequest {
data: serde_json::json!({"approved": true, "locale": "zh-CN"}),
},
)
.await
.expect("manager task should complete");
let second_tasks = api
.get_tasks(&created.id)
.await
.expect("hr task should be created");
assert_eq!(second_tasks.len(), 2);
let hr_task = second_tasks
.iter()
.find(|task| task.name == "HR 备案")
.expect("hr task should exist");
api.complete_task(
&hr_task.id,
rust_viewflow::CompleteTaskRequest {
data: serde_json::json!({"approved": true, "locale": "zh-CN"}),
},
)
.await
.expect("hr task should complete");
let workflow = api
.get_workflow(&created.id)
.await
.expect("workflow should be queryable");
assert_eq!(workflow.status, WorkflowStatus::Completed);
}