mirror of
https://github.com/bahdotsh/wrkflw.git
synced 2025-12-16 19:57:44 +01:00
121 lines
3.0 KiB
Rust
121 lines
3.0 KiB
Rust
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"));
|
|
}
|
|
|
|
|