use super::*;
#[test]
fn test_procedure_not_found_error_message() {
let mut db = setup_test_db();
let proc1 = CreateProcedureStmt {
procedure_name: "my_proc".to_string(),
parameters: vec![],
body: ProcedureBody::BeginEnd(vec![]),
sql_security: None,
comment: None,
language: None,
};
advanced_objects::execute_create_procedure(&proc1, &mut db).unwrap();
let proc2 = CreateProcedureStmt {
procedure_name: "test_proc".to_string(),
parameters: vec![],
body: ProcedureBody::BeginEnd(vec![]),
sql_security: None,
comment: None,
language: None,
};
advanced_objects::execute_create_procedure(&proc2, &mut db).unwrap();
let call_stmt = CallStmt {
procedure_name: "my_proce".to_string(), arguments: vec![],
};
let result = advanced_objects::execute_call(&call_stmt, &mut db);
assert!(result.is_err());
let error_msg = result.unwrap_err().to_string();
assert!(error_msg.contains("my_proce"));
assert!(error_msg.contains("my_proc") || error_msg.contains("test_proc"));
assert!(error_msg.contains("Did you mean"));
}
#[test]
fn test_parameter_count_mismatch_error_message() {
let mut db = setup_test_db();
let proc = CreateProcedureStmt {
procedure_name: "add_numbers".to_string(),
parameters: vec![
ProcedureParameter {
mode: ParameterMode::In,
name: "a".to_string(),
data_type: DataType::Integer,
},
ProcedureParameter {
mode: ParameterMode::In,
name: "b".to_string(),
data_type: DataType::Integer,
},
],
body: ProcedureBody::BeginEnd(vec![]),
sql_security: None,
comment: None,
language: None,
};
advanced_objects::execute_create_procedure(&proc, &mut db).unwrap();
let call_stmt = CallStmt {
procedure_name: "add_numbers".to_string(),
arguments: vec![Expression::Literal(SqlValue::Integer(5))],
};
let result = advanced_objects::execute_call(&call_stmt, &mut db);
assert!(result.is_err());
let error_msg = result.unwrap_err().to_string();
assert!(error_msg.contains("add_numbers"));
assert!(error_msg.contains("2 parameter"));
assert!(error_msg.contains("1 argument"));
assert!(error_msg.contains("IN a"));
assert!(error_msg.contains("IN b"));
}
#[test]
fn test_variable_not_found_error_message() {
use crate::procedural::{executor::execute_procedural_statement, ExecutionContext};
let mut db = setup_test_db();
let mut ctx = ExecutionContext::new();
ctx.set_variable("x", SqlValue::Integer(1));
ctx.set_variable("y", SqlValue::Integer(2));
ctx.set_parameter("count", SqlValue::Integer(10));
let set_stmt = ProceduralStatement::Set {
name: "result".to_string(), value: Box::new(Expression::Literal(SqlValue::Integer(42))),
};
let result = execute_procedural_statement(&set_stmt, &mut ctx, &mut db);
assert!(result.is_err());
let error_msg = result.unwrap_err().to_string();
assert!(error_msg.contains("result"));
assert!(error_msg.contains("Available variables"));
let error_upper = error_msg.to_uppercase();
assert!(error_upper.contains("X"));
assert!(error_upper.contains("Y"));
assert!(error_upper.contains("COUNT"));
}
#[test]
fn test_parameter_type_documentation() {
}