#![allow(dead_code)]
use serde_json::Value;
pub fn assert_aggregate_result(result: &Value, query_name: &str) {
assert!(result["data"].is_object(), "Expected 'data' object");
assert!(result["data"][query_name].is_array(), "Expected '{}' array", query_name);
}
pub fn assert_aggregate_row_has_fields(row: &Value, fields: &[&str]) {
for field in fields {
assert!(row.get(field).is_some(), "Expected field '{}' in row: {:?}", field, row);
}
}
pub fn assert_result_count(result: &Value, query_name: &str, expected: usize) {
let actual = result["data"][query_name].as_array().unwrap().len();
assert_eq!(actual, expected, "Expected {} results, got {}", expected, actual);
}
pub fn assert_numeric_close(actual: f64, expected: f64, epsilon: f64) {
assert!(
(actual - expected).abs() < epsilon,
"Expected {} ± {}, got {}",
expected,
epsilon,
actual
);
}
pub fn assert_sql_contains(sql: &str, expected: &[&str]) {
for clause in expected {
assert!(
sql.contains(clause),
"Expected SQL to contain '{}'\nActual SQL: {}",
clause,
sql
);
}
}
pub fn assert_sorted_asc<T: PartialOrd + std::fmt::Debug>(values: &[T]) {
for i in 1..values.len() {
assert!(values[i] >= values[i - 1], "Array not sorted ascending: {:?}", values);
}
}
pub fn assert_sorted_desc<T: PartialOrd + std::fmt::Debug>(values: &[T]) {
for i in 1..values.len() {
assert!(values[i] <= values[i - 1], "Array not sorted descending: {:?}", values);
}
}