use tracing::instrument;
use crate::error::OxidizedError;
use crate::oxidized::{OxidizedBackend, OxidizedClient};
use super::{ToolResult, enrich_node_not_found};
#[instrument(skip(backend), fields(node = %node))]
pub async fn fetch_node_config(
backend: &OxidizedClient,
node: &str,
) -> Result<ToolResult, OxidizedError> {
match backend.trigger_backup(node).await {
Ok(()) => {
tracing::info!(node = %node, "Backup triggered successfully");
Ok(ToolResult::success(
node,
format!(
"Backup triggered for node '{}'. Fresh configuration will be available shortly.",
node
),
))
}
Err(OxidizedError::NodeNotFound(node_name, _)) => {
Err(enrich_node_not_found(backend, node_name).await)
}
Err(e) => Err(e),
}
}
#[cfg(test)]
mod tests {
use super::*;
fn expected_message(node: &str) -> String {
format!(
"Backup triggered for node '{}'. Fresh configuration will be available shortly.",
node
)
}
#[test]
fn test_success_message_exact_format() {
let node = "SW-Core-01";
let result = ToolResult::success(node, expected_message(node));
assert!(result.success);
assert_eq!(result.node, node);
assert_eq!(
result.message,
"Backup triggered for node 'SW-Core-01'. Fresh configuration will be available shortly."
);
}
#[test]
fn test_success_message_with_special_characters() {
let node = "router-site_1.example.com";
let result = ToolResult::success(node, expected_message(node));
assert!(result.success);
assert_eq!(result.node, node);
assert!(
result.message.contains(node),
"Message should contain the exact node name with special chars"
);
}
#[test]
fn test_success_message_with_unicode() {
let node = "router-日本語";
let result = ToolResult::success(node, expected_message(node));
assert!(result.success);
assert_eq!(result.node, node);
assert!(result.message.contains(node));
}
#[test]
fn test_tool_result_json_serialization() {
let node = "test-node";
let result = ToolResult::success(node, expected_message(node));
let json = serde_json::to_string(&result).expect("Should serialize to JSON");
assert!(json.contains("\"success\":true"));
assert!(json.contains("\"node\":\"test-node\""));
assert!(json.contains("\"message\":"));
let value: serde_json::Value = serde_json::from_str(&json).expect("Should parse as JSON");
assert_eq!(value["success"], true);
assert_eq!(value["node"], "test-node");
}
#[test]
fn test_tool_result_json_escapes_special_chars() {
let node = "node\"with'quotes";
let result = ToolResult::success(node, expected_message(node));
let json = serde_json::to_string(&result).expect("Should serialize to JSON");
let value: serde_json::Value =
serde_json::from_str(&json).expect("Should parse as valid JSON");
assert_eq!(value["node"], node);
}
}