use anyhow::{Context, Result};
use serde::Serialize;
#[derive(Debug, Serialize)]
struct DryRunRequest {
dry_run: bool,
method: &'static str,
path: String,
#[serde(skip_serializing_if = "Option::is_none")]
body: Option<serde_json::Value>,
}
pub fn dry_run_request_yaml(
method: &'static str,
path: String,
body: Option<serde_json::Value>,
) -> Result<String> {
let req = DryRunRequest {
dry_run: true,
method,
path,
body,
};
serde_yaml::to_string(&req).context("Failed to serialize dry-run preview as YAML")
}
#[cfg(test)]
#[allow(clippy::unwrap_used, clippy::expect_used)]
mod tests {
use super::*;
#[test]
fn renders_method_path_and_body() {
let yaml = dry_run_request_yaml(
"POST",
"/rest/api/3/issue".to_string(),
Some(serde_json::json!({ "fields": { "summary": "Hi" } })),
)
.unwrap();
assert!(yaml.contains("dry_run: true"));
assert!(yaml.contains("method: POST"));
assert!(yaml.contains("path: /rest/api/3/issue"));
assert!(yaml.contains("summary: Hi"));
}
#[test]
fn omits_body_when_none() {
let yaml =
dry_run_request_yaml("DELETE", "/rest/api/3/issueLink/42".to_string(), None).unwrap();
assert!(yaml.contains("method: DELETE"));
assert!(yaml.contains("path: /rest/api/3/issueLink/42"));
assert!(!yaml.contains("body"));
}
}