#[actix_rt::test]
async fn test_quality_gate_supervisor_new() {
let analyzer = AnalyzerActor::default().start();
let transformer = TransformerActor::default().start();
let validator = ValidatorActor::default().start();
let _supervisor = QualityGateSupervisor::new(analyzer, transformer, validator);
}
#[actix_rt::test]
async fn test_quality_gate_supervisor_starts() {
let analyzer = AnalyzerActor::default().start();
let transformer = TransformerActor::default().start();
let validator = ValidatorActor::default().start();
let supervisor = QualityGateSupervisor::new(analyzer, transformer, validator);
let addr = supervisor.start();
assert!(addr.connected());
}
#[actix_rt::test]
async fn test_quality_gate_supervisor_multiple_instances() {
let analyzer1 = AnalyzerActor::default().start();
let transformer1 = TransformerActor::default().start();
let validator1 = ValidatorActor::default().start();
let supervisor1 = QualityGateSupervisor::new(analyzer1, transformer1, validator1);
let addr1 = supervisor1.start();
let analyzer2 = AnalyzerActor::default().start();
let transformer2 = TransformerActor::default().start();
let validator2 = ValidatorActor::default().start();
let supervisor2 = QualityGateSupervisor::new(analyzer2, transformer2, validator2);
let addr2 = supervisor2.start();
assert!(addr1.connected());
assert!(addr2.connected());
}
#[actix_rt::test]
async fn test_supervisor_as_supervised_actor() {
let analyzer = AnalyzerActor::default().start();
let transformer = TransformerActor::default().start();
let validator = ValidatorActor::default().start();
let supervisor = QualityGateSupervisor::new(analyzer, transformer, validator);
let addr = supervisor.start();
assert!(addr.connected());
}
#[actix_rt::test]
async fn test_validate_code_simple_function() {
let analyzer = AnalyzerActor::default().start();
let transformer = TransformerActor::default().start();
let validator = ValidatorActor::default().start();
let supervisor = QualityGateSupervisor::new(analyzer, transformer, validator);
let addr = supervisor.start();
let msg = ValidateCode {
code: "fn main() { println!(\"Hello\"); }".to_string(),
thresholds: Thresholds::default(),
};
let result = addr.send(msg).await;
assert!(result.is_ok());
let inner_result = result.unwrap();
assert!(inner_result.is_ok());
let validation_result = inner_result.unwrap();
assert!(validation_result.passed);
assert_eq!(validation_result.metrics.functions, 1);
}
#[actix_rt::test]
async fn test_validate_code_with_struct() {
let analyzer = AnalyzerActor::default().start();
let transformer = TransformerActor::default().start();
let validator = ValidatorActor::default().start();
let supervisor = QualityGateSupervisor::new(analyzer, transformer, validator);
let addr = supervisor.start();
let msg = ValidateCode {
code: r#"
struct Foo {
bar: i32,
}
fn main() {}
"#
.to_string(),
thresholds: Thresholds::default(),
};
let result = addr.send(msg).await;
assert!(result.is_ok());
let inner_result = result.unwrap();
assert!(inner_result.is_ok());
let validation_result = inner_result.unwrap();
assert_eq!(validation_result.metrics.classes, 1);
assert_eq!(validation_result.metrics.functions, 1);
}
#[actix_rt::test]
async fn test_validate_code_with_imports() {
let analyzer = AnalyzerActor::default().start();
let transformer = TransformerActor::default().start();
let validator = ValidatorActor::default().start();
let supervisor = QualityGateSupervisor::new(analyzer, transformer, validator);
let addr = supervisor.start();
let msg = ValidateCode {
code: r#"
use std::collections::HashMap;
use std::io::Read;
fn main() {}
"#
.to_string(),
thresholds: Thresholds::default(),
};
let result = addr.send(msg).await;
assert!(result.is_ok());
let inner_result = result.unwrap();
assert!(inner_result.is_ok());
let validation_result = inner_result.unwrap();
assert_eq!(validation_result.metrics.imports, 2);
}
#[actix_rt::test]
async fn test_validate_code_exceeds_function_threshold() {
let analyzer = AnalyzerActor::default().start();
let transformer = TransformerActor::default().start();
let validator = ValidatorActor::default().start();
let supervisor = QualityGateSupervisor::new(analyzer, transformer, validator);
let addr = supervisor.start();
let mut code = String::new();
for i in 0..55 {
code.push_str(&format!("fn func{}() {{}}\n", i));
}
let msg = ValidateCode {
code,
thresholds: Thresholds {
max_complexity: 100,
max_functions: 50,
max_lines: 1000,
min_test_coverage: 0.0,
},
};
let result = addr.send(msg).await;
assert!(result.is_ok());
let inner_result = result.unwrap();
assert!(inner_result.is_ok());
let validation_result = inner_result.unwrap();
assert!(!validation_result.validation.violations.is_empty());
assert!(validation_result
.validation
.violations
.iter()
.any(|v| v.rule == "functions"));
}
#[actix_rt::test]
async fn test_validate_code_invalid_syntax() {
let analyzer = AnalyzerActor::default().start();
let transformer = TransformerActor::default().start();
let validator = ValidatorActor::default().start();
let supervisor = QualityGateSupervisor::new(analyzer, transformer, validator);
let addr = supervisor.start();
let msg = ValidateCode {
code: "this is not valid rust code {{{{".to_string(),
thresholds: Thresholds::default(),
};
let result = addr.send(msg).await;
assert!(result.is_ok());
let inner_result = result.unwrap();
assert!(inner_result.is_err());
}
#[actix_rt::test]
async fn test_supervisor_handles_concurrent_requests() {
let analyzer = AnalyzerActor::default().start();
let transformer = TransformerActor::default().start();
let validator = ValidatorActor::default().start();
let supervisor = QualityGateSupervisor::new(analyzer, transformer, validator);
let addr = supervisor.start();
let msg1 = ValidateCode {
code: "fn a() {}".to_string(),
thresholds: Thresholds::default(),
};
let msg2 = ValidateCode {
code: "fn b() {}".to_string(),
thresholds: Thresholds::default(),
};
let msg3 = ValidateCode {
code: "fn c() {}".to_string(),
thresholds: Thresholds::default(),
};
let (r1, r2, r3) = tokio::join!(addr.send(msg1), addr.send(msg2), addr.send(msg3));
assert!(r1.is_ok());
assert!(r2.is_ok());
assert!(r3.is_ok());
assert!(r1.unwrap().is_ok());
assert!(r2.unwrap().is_ok());
assert!(r3.unwrap().is_ok());
}
#[actix_rt::test]
async fn test_supervisor_handles_many_concurrent_requests() {
let analyzer = AnalyzerActor::default().start();
let transformer = TransformerActor::default().start();
let validator = ValidatorActor::default().start();
let supervisor = QualityGateSupervisor::new(analyzer, transformer, validator);
let addr = supervisor.start();
let mut futures = Vec::new();
for i in 0..10 {
let msg = ValidateCode {
code: format!("fn func_{}() {{}}", i),
thresholds: Thresholds::default(),
};
futures.push(addr.send(msg));
}
let results = futures::future::join_all(futures).await;
for result in results {
assert!(result.is_ok());
assert!(result.unwrap().is_ok());
}
}
#[actix_rt::test]
async fn test_validate_empty_code() {
let analyzer = AnalyzerActor::default().start();
let transformer = TransformerActor::default().start();
let validator = ValidatorActor::default().start();
let supervisor = QualityGateSupervisor::new(analyzer, transformer, validator);
let addr = supervisor.start();
let msg = ValidateCode {
code: String::new(),
thresholds: Thresholds::default(),
};
let result = addr.send(msg).await;
assert!(result.is_ok());
let inner_result = result.unwrap();
assert!(inner_result.is_ok());
}
#[actix_rt::test]
async fn test_validate_whitespace_only_code() {
let analyzer = AnalyzerActor::default().start();
let transformer = TransformerActor::default().start();
let validator = ValidatorActor::default().start();
let supervisor = QualityGateSupervisor::new(analyzer, transformer, validator);
let addr = supervisor.start();
let msg = ValidateCode {
code: " \n\n\t\t \n".to_string(),
thresholds: Thresholds::default(),
};
let result = addr.send(msg).await;
assert!(result.is_ok());
let inner_result = result.unwrap();
assert!(inner_result.is_ok());
}
#[actix_rt::test]
#[ignore = "Flaky: validation fails on comments-only code"]
async fn test_validate_code_with_comments_only() {
let analyzer = AnalyzerActor::default().start();
let transformer = TransformerActor::default().start();
let validator = ValidatorActor::default().start();
let supervisor = QualityGateSupervisor::new(analyzer, transformer, validator);
let addr = supervisor.start();
let msg = ValidateCode {
code: r#"
// This is a comment
/* This is a block comment */
/// This is a doc comment
"#
.to_string(),
thresholds: Thresholds::default(),
};
let result = addr.send(msg).await;
assert!(result.is_ok());
let inner_result = result.unwrap();
assert!(inner_result.is_ok());
let validation_result = inner_result.unwrap();
assert_eq!(validation_result.metrics.functions, 0);
}
#[actix_rt::test]
async fn test_validate_code_with_strict_thresholds() {
let analyzer = AnalyzerActor::default().start();
let transformer = TransformerActor::default().start();
let validator = ValidatorActor::default().start();
let supervisor = QualityGateSupervisor::new(analyzer, transformer, validator);
let addr = supervisor.start();
let msg = ValidateCode {
code: r#"
fn main() {}
fn test() {}
"#
.to_string(),
thresholds: Thresholds {
max_complexity: 1,
max_functions: 1,
max_lines: 1,
min_test_coverage: 1.0,
},
};
let result = addr.send(msg).await;
assert!(result.is_ok());
let inner_result = result.unwrap();
assert!(inner_result.is_ok());
let validation_result = inner_result.unwrap();
assert!(!validation_result.validation.violations.is_empty());
}
#[actix_rt::test]
async fn test_validate_code_with_enum() {
let analyzer = AnalyzerActor::default().start();
let transformer = TransformerActor::default().start();
let validator = ValidatorActor::default().start();
let supervisor = QualityGateSupervisor::new(analyzer, transformer, validator);
let addr = supervisor.start();
let msg = ValidateCode {
code: r#"
enum Status {
Active,
Inactive,
Pending,
}
fn main() {}
"#
.to_string(),
thresholds: Thresholds::default(),
};
let result = addr.send(msg).await;
assert!(result.is_ok());
let inner_result = result.unwrap();
assert!(inner_result.is_ok());
let validation_result = inner_result.unwrap();
assert!(validation_result.passed);
assert_eq!(validation_result.metrics.functions, 1);
}
#[actix_rt::test]
async fn test_validate_code_with_impl_block() {
let analyzer = AnalyzerActor::default().start();
let transformer = TransformerActor::default().start();
let validator = ValidatorActor::default().start();
let supervisor = QualityGateSupervisor::new(analyzer, transformer, validator);
let addr = supervisor.start();
let msg = ValidateCode {
code: r#"
struct Foo;
impl Foo {
fn new() -> Self { Foo }
fn method(&self) {}
}
"#
.to_string(),
thresholds: Thresholds::default(),
};
let result = addr.send(msg).await;
assert!(result.is_ok());
let inner_result = result.unwrap();
assert!(inner_result.is_ok());
let validation_result = inner_result.unwrap();
assert!(validation_result.passed);
assert_eq!(validation_result.metrics.classes, 1);
}
#[actix_rt::test]
async fn test_validate_code_with_trait() {
let analyzer = AnalyzerActor::default().start();
let transformer = TransformerActor::default().start();
let validator = ValidatorActor::default().start();
let supervisor = QualityGateSupervisor::new(analyzer, transformer, validator);
let addr = supervisor.start();
let msg = ValidateCode {
code: r#"
trait Animal {
fn speak(&self);
}
"#
.to_string(),
thresholds: Thresholds::default(),
};
let result = addr.send(msg).await;
assert!(result.is_ok());
let inner_result = result.unwrap();
assert!(inner_result.is_ok());
let validation_result = inner_result.unwrap();
assert!(validation_result.passed);
}