#[cfg(test)]
#[cfg(feature = "duckdb")]
mod tests {
use crate::duckdb_session::DuckSession;
use crate::types::TypedValue;
use crate::ast::ArgValue;
use crate::duckdb_verbs::map_verb_to_sql;
use std::path::PathBuf;
#[test]
fn test_sql_direct_query() {
let session = DuckSession::new().expect("Failed to create DuckSession");
let query = TypedValue {
kind: crate::types::ValueKind::String,
value: ArgValue::String("SELECT 42 AS answer".to_string()),
};
let args = vec![query];
let result = map_verb_to_sql("sql", &args, &session);
assert!(result.is_ok());
let sql_query = result.unwrap();
assert_eq!(sql_query, "SELECT 42 AS answer");
let query_result = session.execute_sql(&sql_query);
assert!(query_result.is_ok());
let typed_value = query_result.unwrap();
if let ArgValue::Table(table) = typed_value.value {
assert_eq!(table.data.len(), 1);
assert_eq!(table.data[0].len(), 1);
if let ArgValue::Number(n) = &table.data[0][0].value {
assert_eq!(*n, 42.0);
} else {
panic!("Expected a number in the result");
}
} else {
panic!("Expected a table result from SQL query");
}
}
#[test]
fn test_sql_empty_query() {
let session = DuckSession::new().expect("Failed to create DuckSession");
let args = vec![];
let result = map_verb_to_sql("sql", &args, &session);
assert!(result.is_err());
if let Err(e) = result {
assert!(e.to_string().contains("sql command requires a query string"));
}
}
#[test]
fn test_sql_invalid_argument_type() {
let session = DuckSession::new().expect("Failed to create DuckSession");
let invalid_arg = TypedValue {
kind: crate::types::ValueKind::Number,
value: ArgValue::Number(42.0),
};
let args = vec![invalid_arg];
let result = map_verb_to_sql("sql", &args, &session);
assert!(result.is_err());
if let Err(e) = result {
assert!(e.to_string().contains("sql command requires a string argument"));
}
}
}