#![cfg(feature = "telemetry")]
#[cfg(target_arch = "wasm32")]
use wasm_bindgen_test::*;
#[cfg(target_arch = "wasm32")]
wasm_bindgen_test::wasm_bindgen_test_configure!(run_in_browser);
#[cfg(target_arch = "wasm32")]
#[wasm_bindgen_test]
async fn test_query_execution_increments_counter() {
use absurder_sql::{Database, DatabaseConfig};
let config = DatabaseConfig {
name: "test_metrics".to_string(),
..Default::default()
};
let mut db = Database::new(config)
.await
.expect("Failed to create database");
let initial_count = db
.metrics()
.expect("Metrics should be available")
.queries_total()
.get();
db.execute("SELECT 1").await.expect("Query should succeed");
let final_count = db
.metrics()
.expect("Metrics should be available")
.queries_total()
.get();
assert_eq!(final_count, initial_count + 1.0);
}
#[cfg(target_arch = "wasm32")]
#[wasm_bindgen_test]
async fn test_query_execution_records_duration() {
use absurder_sql::{Database, DatabaseConfig};
let config = DatabaseConfig {
name: "test_duration".to_string(),
..Default::default()
};
let mut db = Database::new(config)
.await
.expect("Failed to create database");
let initial_count = db
.metrics()
.expect("Metrics should be available")
.query_duration()
.get_sample_count();
db.execute("SELECT 1").await.expect("Query should succeed");
let final_count = db
.metrics()
.expect("Metrics should be available")
.query_duration()
.get_sample_count();
assert_eq!(final_count, initial_count + 1);
}
#[cfg(target_arch = "wasm32")]
#[wasm_bindgen_test]
async fn test_query_error_increments_error_counter() {
use absurder_sql::{Database, DatabaseConfig};
let config = DatabaseConfig {
name: "test_errors".to_string(),
..Default::default()
};
let mut db = Database::new(config)
.await
.expect("Failed to create database");
let initial_errors = db
.metrics()
.expect("Metrics should be available")
.errors_total()
.get();
let result = db.execute("SELECT * FROM nonexistent_table").await;
assert!(result.is_err());
let final_errors = db
.metrics()
.expect("Metrics should be available")
.errors_total()
.get();
assert_eq!(final_errors, initial_errors + 1.0);
}
#[cfg(target_arch = "wasm32")]
#[wasm_bindgen_test]
async fn test_multiple_queries_accumulate_metrics() {
use absurder_sql::{Database, DatabaseConfig};
let config = DatabaseConfig {
name: "test_multiple".to_string(),
..Default::default()
};
let mut db = Database::new(config)
.await
.expect("Failed to create database");
db.execute("CREATE TABLE test (id INTEGER PRIMARY KEY, value TEXT)")
.await
.expect("Create should succeed");
db.execute("INSERT INTO test (value) VALUES ('test1')")
.await
.expect("Insert 1 should succeed");
db.execute("INSERT INTO test (value) VALUES ('test2')")
.await
.expect("Insert 2 should succeed");
db.execute("SELECT * FROM test")
.await
.expect("Select should succeed");
assert!(
db.metrics()
.expect("Metrics should be available")
.queries_total()
.get()
>= 4.0
);
assert!(
db.metrics()
.expect("Metrics should be available")
.query_duration()
.get_sample_count()
>= 4
);
}
#[cfg(target_arch = "wasm32")]
#[wasm_bindgen_test]
async fn test_metrics_isolated_per_instance() {
use absurder_sql::{Database, DatabaseConfig};
let config1 = DatabaseConfig {
name: "test_db1".to_string(),
..Default::default()
};
let mut db1 = Database::new(config1).await.expect("Failed to create db1");
let config2 = DatabaseConfig {
name: "test_db2".to_string(),
..Default::default()
};
let db2 = Database::new(config2).await.expect("Failed to create db2");
db1.execute("SELECT 1").await.expect("Query should succeed");
assert!(
db1.metrics()
.expect("Metrics should be available")
.queries_total()
.get()
>= 1.0
);
assert!(
db2.metrics()
.expect("Metrics should be available")
.queries_total()
.get()
>= 0.0
);
}
#[cfg(target_arch = "wasm32")]
#[wasm_bindgen_test]
async fn test_parameterized_query_tracks_metrics() {
use absurder_sql::{ColumnValue, Database, DatabaseConfig};
let config = DatabaseConfig {
name: "test_params".to_string(),
..Default::default()
};
let mut db = Database::new(config)
.await
.expect("Failed to create database");
db.execute("CREATE TABLE test (id INTEGER PRIMARY KEY, value TEXT)")
.await
.expect("Create should succeed");
let initial_count = db
.metrics()
.expect("Metrics should be available")
.queries_total()
.get();
let params = vec![ColumnValue::Text("test".to_string())];
let params_js = serde_wasm_bindgen::to_value(¶ms).unwrap();
db.execute_with_params("INSERT INTO test (value) VALUES (?)", params_js)
.await
.expect("Insert should succeed");
let final_count = db
.metrics()
.expect("Metrics should be available")
.queries_total()
.get();
assert!(final_count > initial_count);
}
#[cfg(target_arch = "wasm32")]
#[wasm_bindgen_test]
async fn test_cache_metrics_tracking() {
use absurder_sql::{Database, DatabaseConfig};
let config = DatabaseConfig {
name: "test_cache".to_string(),
..Default::default()
};
let mut db = Database::new(config)
.await
.expect("Failed to create database");
db.execute("CREATE TABLE test (id INTEGER PRIMARY KEY, value TEXT)")
.await
.expect("Create should succeed");
db.execute("INSERT INTO test (value) VALUES ('test')")
.await
.expect("Insert should succeed");
db.execute("SELECT * FROM test")
.await
.expect("Select should succeed");
db.execute("SELECT * FROM test")
.await
.expect("Select should succeed");
let metrics = db.metrics().expect("Metrics should be available");
let total_cache_ops = metrics.cache_hits().get() + metrics.cache_misses().get();
assert!(total_cache_ops >= 0.0);
}
#[cfg(not(target_arch = "wasm32"))]
#[test]
fn test_metrics_available_on_native() {
use absurder_sql::telemetry::Metrics;
let metrics = Metrics::new().expect("Should create metrics");
assert_eq!(metrics.queries_total().get(), 0.0);
}