use moniof::core::stats::{normalize_sql, QueryStats};
#[test]
fn record_counts_total_and_per_key() {
let mut s = QueryStats::new();
s.record("mongo/users/find");
s.record("mongo/users/find");
s.record("sql/select 1");
assert_eq!(s.total, 3);
assert_eq!(s.per_key["mongo/users/find"], 2);
assert_eq!(s.per_key["sql/select 1"], 1);
}
#[test]
fn record_latency_accumulates_total_and_per_key() {
let mut s = QueryStats::new();
s.record_latency("sql/a", 10);
s.record_latency("sql/a", 5);
s.record_latency("sql/b", 7);
assert_eq!(s.total_db_latency_ms, 22);
assert_eq!(s.per_key_latency_ms["sql/a"], 15);
assert_eq!(s.per_key_latency_ms["sql/b"], 7);
}
#[test]
fn record_latency_tracks_max_not_last() {
let mut s = QueryStats::new();
s.record_latency("sql/a", 10);
s.record_latency("sql/a", 3); s.record_latency("sql/a", 25);
s.record_latency("sql/a", 1);
assert_eq!(s.per_key_max_latency_ms["sql/a"], 25);
}
#[test]
fn record_and_record_latency_are_independent() {
let mut s = QueryStats::new();
s.record("mongo/users/find");
assert_eq!(s.total, 1);
assert_eq!(s.total_db_latency_ms, 0);
assert!(!s.per_key_latency_ms.contains_key("mongo/users/find"));
}
#[test]
fn elapsed_is_non_negative() {
let s = QueryStats::new();
assert!(s.elapsed().whole_milliseconds() >= 0);
}
#[test]
fn normalize_sql_collapses_whitespace_and_lowercases() {
let key = normalize_sql("SELECT id,\n\tname\n FROM Users");
assert_eq!(key, "select id, name from users");
}
#[test]
fn normalize_sql_is_stable_across_formatting() {
let a = normalize_sql("SELECT id FROM users WHERE tenant = $1");
let b = normalize_sql("select id\nfrom USERS\n where tenant = $1");
assert_eq!(a, b);
}
#[test]
fn normalize_sql_truncates_long_queries() {
let long = format!("SELECT {}", "x".repeat(500));
let key = normalize_sql(&long);
assert_eq!(key.len(), 200);
}
#[test]
fn normalize_sql_leaves_short_queries_untruncated() {
let key = normalize_sql("SELECT 1");
assert_eq!(key, "select 1");
}
#[test]
#[ignore = "known bug: normalize_sql panics on multi-byte char at the 200-byte cut"]
fn normalize_sql_should_not_panic_on_multibyte_boundary() {
let sql = format!("{}é", "a".repeat(199));
assert_eq!(sql.len(), 201, "test fixture must straddle the 200-byte cut");
let key = normalize_sql(&sql); assert!(key.len() <= 200);
}