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 prioritize_node(
backend: &OxidizedClient,
node: &str,
) -> Result<ToolResult, OxidizedError> {
match backend.prioritize_node(node).await {
Ok(()) => {
tracing::info!(node = %node, "Node prioritized in queue");
Ok(ToolResult::success(
node,
format!("Node '{}' has been prioritized in the backup queue.", 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!("Node '{}' has been prioritized in the backup queue.", 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,
"Node 'SW-Core-01' has been prioritized in the backup queue."
);
}
#[test]
fn test_success_message_with_special_characters() {
let node = "switch-datacenter_2.corp.local";
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 = "switch-中文";
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 = "router-1";
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\":\"router-1\""));
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"], "router-1");
}
#[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);
}
}