Skip to main content

stormchaser_cli/commands/
run.rs

1use crate::utils::{handle_run_response, parse_key_val_list, require_token};
2use anyhow::Result;
3use serde_json::json;
4use std::fs;
5use std::path::PathBuf;
6
7pub async fn handle(
8    url: &str,
9    token: Option<&str>,
10    http_client: &reqwest_middleware::ClientWithMiddleware,
11    file: PathBuf,
12    input: Vec<String>,
13    tail: bool,
14    watch: bool,
15) -> Result<()> {
16    let dsl = fs::read_to_string(file)?;
17    let inputs = parse_key_val_list(input);
18    let token = require_token(token)?;
19
20    let res = http_client
21        .post(format!("{}/api/v1/runs/direct", url))
22        .header(reqwest::header::AUTHORIZATION, format!("Bearer {}", token))
23        .json(&json!({ "dsl": dsl, "inputs": inputs }))
24        .send()
25        .await?;
26
27    handle_run_response(http_client, url, token, res, tail, watch).await
28}
29
30#[cfg(test)]
31mod tests {
32    use super::*;
33    use reqwest_middleware::ClientBuilder;
34    use std::io::Write;
35    use stormchaser_model::RunStatus;
36    use tempfile::NamedTempFile;
37    use wiremock::matchers::{header, method, path};
38    use wiremock::{Mock, MockServer, ResponseTemplate};
39
40    #[tokio::test]
41    async fn test_run_handle() {
42        let server = MockServer::start().await;
43        Mock::given(method("POST"))
44            .and(path("/api/v1/runs/direct"))
45            .and(header(reqwest::header::AUTHORIZATION, "Bearer test-token"))
46            .respond_with(ResponseTemplate::new(200).set_body_json(json!({
47                "id": "12345678-1234-1234-1234-123456789012",
48                "status": RunStatus::Queued
49            })))
50            .mount(&server)
51            .await;
52
53        let client = ClientBuilder::new(reqwest::Client::new()).build();
54
55        let mut temp_file = NamedTempFile::new().unwrap();
56        writeln!(temp_file, "workflow \"test\" {{}}").unwrap();
57
58        let input = vec!["param=value".to_string()];
59
60        let result = handle(
61            &server.uri(),
62            Some("test-token"),
63            &client,
64            temp_file.path().to_path_buf(),
65            input,
66            false,
67            false,
68        )
69        .await;
70
71        assert!(result.is_ok());
72    }
73}