use super::tools::*;
use super::*;
use crate::agents::analyzer_actor::AnalyzerActor;
use crate::agents::registry::AgentRegistry;
use crate::agents::transformer_actor::TransformerActor;
use crate::agents::validator_actor::ValidatorActor;
use actix::prelude::*;
use serde_json::json;
use std::sync::Arc;
#[actix::test]
async fn red_analyze_tool_must_communicate_with_analyzer_actor() {
let analyzer = AnalyzerActor::default().start();
let registry = Arc::new(AgentRegistry::new());
let tool = AnalyzeTool::new_with_actor(registry, analyzer.clone());
let params = json!({
"code": "fn main() { println!(\"test\"); }",
"language": "rust"
});
let result = tool.execute(params).await;
assert!(result.is_ok(), "Expected Ok but got: {:?}", result);
let response = result.unwrap();
let text = response["text"].as_str().unwrap();
assert!(!text.contains("not yet implemented"));
}
#[actix::test]
async fn red_analyze_tool_must_handle_actor_errors() {
let analyzer = AnalyzerActor::default().start();
let registry = Arc::new(AgentRegistry::new());
let tool = AnalyzeTool::new_with_actor(registry, analyzer);
let params = json!({
"invalid": "params"
});
let result = tool.execute(params).await;
assert!(result.is_err());
let error = result.unwrap_err();
assert_eq!(error.code, error_codes::INVALID_PARAMS);
}
#[actix::test]
async fn red_analyze_tool_must_return_metrics_in_mcp_format() {
let analyzer = AnalyzerActor::default().start();
let registry = Arc::new(AgentRegistry::new());
let tool = AnalyzeTool::new_with_actor(registry, analyzer);
let params = json!({
"code": "fn add(a: i32, b: i32) -> i32 { a + b }",
"language": "rust"
});
let result = tool.execute(params).await.unwrap();
assert!(result.is_object());
assert_eq!(result["type"].as_str(), Some("text"));
assert!(result["text"].is_string());
}
#[actix::test]
async fn red_analyze_tool_must_forward_priority_to_actor() {
let analyzer = AnalyzerActor::default().start();
let registry = Arc::new(AgentRegistry::new());
let tool = AnalyzeTool::new_with_actor(registry, analyzer.clone());
let params = json!({
"code": "fn test() {}",
"language": "rust",
"priority": "high"
});
let result = tool.execute(params).await;
assert!(result.is_ok(), "Expected Ok but got: {:?}", result);
}
#[actix::test]
async fn red_analyze_tool_constructor_must_accept_actor_address() {
let analyzer = AnalyzerActor::default().start();
let registry = Arc::new(AgentRegistry::new());
let _tool = AnalyzeTool::new_with_actor(registry, analyzer);
}
#[test]
fn red_analyze_tool_metadata_must_include_all_parameters() {
let registry = Arc::new(AgentRegistry::new());
let tool = AnalyzeTool::new(registry);
let metadata = tool.metadata();
let schema = &metadata.input_schema;
assert!(schema["properties"]["code"].is_object());
assert_eq!(schema["required"][0], "code");
assert!(schema["properties"]["language"].is_object());
assert_eq!(schema["required"][1], "language");
assert!(schema["properties"]["metrics"].is_object());
}
#[actix::test]
async fn red_transform_tool_must_communicate_with_transformer_actor() {
let transformer = TransformerActor::default().start();
let registry = Arc::new(AgentRegistry::new());
let tool = TransformTool::new_with_actor(registry, transformer.clone());
let params = json!({
"code": "fn test() { let x = 1 + 2; }",
"language": "rust",
"transformation": "optimize"
});
let result = tool.execute(params).await;
assert!(result.is_ok(), "Expected Ok but got: {:?}", result);
let response = result.unwrap();
let text = response["text"].as_str().unwrap();
assert!(!text.contains("not yet implemented"));
}
#[actix::test]
async fn red_transform_tool_must_handle_actor_errors() {
let transformer = TransformerActor::default().start();
let registry = Arc::new(AgentRegistry::new());
let tool = TransformTool::new_with_actor(registry, transformer);
let params = json!({
"invalid": "params"
});
let result = tool.execute(params).await;
assert!(result.is_err());
let error = result.unwrap_err();
assert_eq!(error.code, error_codes::INVALID_PARAMS);
}
#[actix::test]
async fn red_transform_tool_must_return_results_in_mcp_format() {
let transformer = TransformerActor::default().start();
let registry = Arc::new(AgentRegistry::new());
let tool = TransformTool::new_with_actor(registry, transformer);
let params = json!({
"code": "fn main() { }",
"language": "rust",
"transformation": "beautify"
});
let result = tool.execute(params).await.unwrap();
assert!(result.is_object());
assert_eq!(result["type"].as_str(), Some("text"));
assert!(result["text"].is_string());
}
#[actix::test]
async fn red_transform_tool_must_forward_priority_to_actor() {
let transformer = TransformerActor::default().start();
let registry = Arc::new(AgentRegistry::new());
let tool = TransformTool::new_with_actor(registry, transformer.clone());
let params = json!({
"code": "fn test() {}",
"language": "rust",
"transformation": "refactor",
"priority": "high"
});
let result = tool.execute(params).await;
assert!(result.is_ok(), "Expected Ok but got: {:?}", result);
}
#[actix::test]
async fn red_transform_tool_constructor_must_accept_actor_address() {
let transformer = TransformerActor::default().start();
let registry = Arc::new(AgentRegistry::new());
let _tool = TransformTool::new_with_actor(registry, transformer);
}
#[test]
fn red_transform_tool_metadata_must_include_all_parameters() {
let registry = Arc::new(AgentRegistry::new());
let tool = TransformTool::new(registry);
let metadata = tool.metadata();
let schema = &metadata.input_schema;
assert!(schema["properties"]["code"].is_object());
assert_eq!(schema["required"][0], "code");
assert!(schema["properties"]["language"].is_object());
assert_eq!(schema["required"][1], "language");
assert!(schema["properties"]["transformation"].is_object());
assert_eq!(schema["required"][2], "transformation");
assert!(schema["properties"]["options"].is_object());
let transformation_enum = &schema["properties"]["transformation"]["enum"];
assert!(transformation_enum.is_array());
assert!(transformation_enum
.as_array()
.unwrap()
.contains(&json!("optimize")));
assert!(transformation_enum
.as_array()
.unwrap()
.contains(&json!("minify")));
assert!(transformation_enum
.as_array()
.unwrap()
.contains(&json!("beautify")));
assert!(transformation_enum
.as_array()
.unwrap()
.contains(&json!("refactor")));
}
#[actix::test]
async fn red_validate_tool_must_communicate_with_analyzer_and_validator_actors() {
let analyzer = AnalyzerActor::default().start();
let validator = ValidatorActor::default().start();
let registry = Arc::new(AgentRegistry::new());
let tool = ValidateTool::new_with_actors(registry, analyzer.clone(), validator.clone());
let params = json!({
"code": "fn complex() { if true { if false { for i in 0..10 { } } } }",
"language": "rust"
});
let result = tool.execute(params).await;
assert!(result.is_ok(), "Expected Ok but got: {:?}", result);
let response = result.unwrap();
let text = response["text"].as_str().unwrap();
assert!(text.contains("Validation Results"));
}
#[actix::test]
async fn red_validate_tool_must_handle_actor_errors() {
let analyzer = AnalyzerActor::default().start();
let validator = ValidatorActor::default().start();
let registry = Arc::new(AgentRegistry::new());
let tool = ValidateTool::new_with_actors(registry, analyzer, validator);
let params = json!({
"invalid": "params"
});
let result = tool.execute(params).await;
assert!(result.is_err());
let error = result.unwrap_err();
assert_eq!(error.code, error_codes::INVALID_PARAMS);
}
#[actix::test]
async fn red_validate_tool_must_return_results_in_mcp_format() {
let analyzer = AnalyzerActor::default().start();
let validator = ValidatorActor::default().start();
let registry = Arc::new(AgentRegistry::new());
let tool = ValidateTool::new_with_actors(registry, analyzer, validator);
let params = json!({
"code": "fn simple() { }",
"language": "rust"
});
let result = tool.execute(params).await.unwrap();
assert!(result.is_object());
assert_eq!(result["type"].as_str(), Some("text"));
assert!(result["text"].is_string());
}
#[actix::test]
async fn red_validate_tool_must_handle_optional_rules_parameter() {
let analyzer = AnalyzerActor::default().start();
let validator = ValidatorActor::default().start();
let registry = Arc::new(AgentRegistry::new());
let tool = ValidateTool::new_with_actors(registry, analyzer.clone(), validator.clone());
let params = json!({
"code": "fn test() {}",
"language": "rust",
"rules": ["complexity", "naming"]
});
let result = tool.execute(params).await;
assert!(result.is_ok(), "Expected Ok but got: {:?}", result);
}
#[actix::test]
async fn red_validate_tool_constructor_must_accept_actor_addresses() {
let analyzer = AnalyzerActor::default().start();
let validator = ValidatorActor::default().start();
let registry = Arc::new(AgentRegistry::new());
let _tool = ValidateTool::new_with_actors(registry, analyzer, validator);
}
#[test]
fn red_validate_tool_metadata_must_include_all_parameters() {
let registry = Arc::new(AgentRegistry::new());
let tool = ValidateTool::new(registry);
let metadata = tool.metadata();
let schema = &metadata.input_schema;
assert!(schema["properties"]["code"].is_object());
assert_eq!(schema["required"][0], "code");
assert!(schema["properties"]["language"].is_object());
assert_eq!(schema["required"][1], "language");
assert!(schema["properties"]["rules"].is_object());
assert_eq!(schema["properties"]["rules"]["type"], "array");
assert!(schema["properties"]["thresholds"].is_object());
}