use fraiseql_server::validation::{ComplexityValidationError, RequestValidator};
use proptest::prelude::*;
fn strict_validator(max_depth: usize, max_complexity: usize) -> RequestValidator {
RequestValidator::new()
.with_max_depth(max_depth)
.with_complexity_validation(true)
.with_max_complexity(max_complexity)
.with_depth_validation(true)
}
proptest! {
#[test]
fn validate_query_never_panics(query in "\\PC*") {
let validator = RequestValidator::new();
let _ = validator.validate_query(&query); }
#[test]
fn empty_query_always_fails(ws in "[ \t\n\r]*") {
let validator = RequestValidator::new();
let result = validator.validate_query(&ws);
prop_assert!(
matches!(result, Err(ComplexityValidationError::MalformedQuery(_))),
"expected MalformedQuery for whitespace-only input, got: {result:?}"
);
}
#[test]
fn relaxed_depth_limit_never_rejects_passing_query(
max_depth in 1usize..=20,
extra in 1usize..=20,
) {
let query = "{ user { id name } }";
let strict = strict_validator(max_depth, 1000);
let relaxed = strict_validator(max_depth + extra, 1000);
let strict_ok = strict.validate_query(query).is_ok();
let relaxed_ok = relaxed.validate_query(query).is_ok();
if strict_ok {
prop_assert!(
relaxed_ok,
"relaxed limit ({}) must accept query that strict limit ({max_depth}) accepted",
max_depth + extra
);
}
}
#[test]
fn relaxed_complexity_limit_never_rejects_passing_query(
max_complexity in 1usize..=100,
extra in 1usize..=100,
) {
let query = "{ user { id } }";
let strict = strict_validator(50, max_complexity);
let relaxed = strict_validator(50, max_complexity + extra);
let strict_ok = strict.validate_query(query).is_ok();
let relaxed_ok = relaxed.validate_query(query).is_ok();
if strict_ok {
prop_assert!(
relaxed_ok,
"relaxed complexity ({}) must accept query that strict ({max_complexity}) accepted",
max_complexity + extra
);
}
}
#[test]
fn disabled_validation_passes_any_non_empty_string(query in "[a-z{ }]{1,50}") {
let validator = RequestValidator::new()
.with_depth_validation(false)
.with_complexity_validation(false);
let _ = validator.validate_query(&query); }
}