use std::fs; use tempfile::tempdir; use wrkflw::executor::engine::{execute_workflow, ExecutionConfig, RuntimeType}; fn write_file(path: &std::path::Path, content: &str) { fs::write(path, content).expect("failed to write file"); } #[tokio::test] async fn test_local_reusable_workflow_execution_success() { // Create temp workspace let dir = tempdir().unwrap(); let called_path = dir.path().join("called.yml"); let caller_path = dir.path().join("caller.yml"); // Minimal called workflow with one successful job let called = r#" name: Called on: workflow_dispatch jobs: inner: runs-on: ubuntu-latest steps: - run: echo "hello from called" "#; write_file(&called_path, called); // Caller workflow that uses the called workflow via absolute local path let caller = format!( r#" name: Caller on: workflow_dispatch jobs: call: uses: {} with: foo: bar secrets: token: testsecret "#, called_path.display() ); write_file(&caller_path, &caller); // Execute caller workflow with emulation runtime let cfg = ExecutionConfig { runtime_type: RuntimeType::Emulation, verbose: false, preserve_containers_on_failure: false, }; let result = execute_workflow(&caller_path, cfg) .await .expect("workflow execution failed"); // Expect a single caller job summarized assert_eq!(result.jobs.len(), 1, "expected one caller job result"); let job = &result.jobs[0]; assert_eq!(job.name, "call"); assert_eq!(format!("{:?}", job.status), "Success"); // Summary step should include reference to called workflow and inner job status assert!(job .logs .contains("Called workflow:"), "expected summary logs to include called workflow path"); assert!(job.logs.contains("- inner: Success"), "expected inner job success in summary"); } #[tokio::test] async fn test_local_reusable_workflow_execution_failure_propagates() { // Create temp workspace let dir = tempdir().unwrap(); let called_path = dir.path().join("called.yml"); let caller_path = dir.path().join("caller.yml"); // Called workflow with failing job let called = r#" name: Called on: workflow_dispatch jobs: inner: runs-on: ubuntu-latest steps: - run: false "#; write_file(&called_path, called); // Caller workflow let caller = format!( r#" name: Caller on: workflow_dispatch jobs: call: uses: {} "#, called_path.display() ); write_file(&caller_path, &caller); // Execute caller workflow let cfg = ExecutionConfig { runtime_type: RuntimeType::Emulation, verbose: false, preserve_containers_on_failure: false, }; let result = execute_workflow(&caller_path, cfg) .await .expect("workflow execution failed"); assert_eq!(result.jobs.len(), 1); let job = &result.jobs[0]; assert_eq!(job.name, "call"); assert_eq!(format!("{:?}", job.status), "Failure"); assert!(job.logs.contains("- inner: Failure")); }