flowcode-core 0.4.3-alpha

Core execution engine for FlowCode data scripting language
Documentation
// duckdb load verb integration tests
#![cfg(feature = "duckdb")]

use std::io::Write;
use tempfile::Builder;

use flowcode_core::duckdb_session::DuckSession;
use flowcode_core::types::TypedValue;
use flowcode_core::ast::ArgValue;

fn create_test_csv(content: &str) -> String {
    let mut temp_file = Builder::new()
        .prefix("test_")
        .suffix(".csv")
        .tempfile()
        .unwrap();
    writeln!(temp_file, "{}", content).unwrap();
    temp_file.path().to_str().unwrap().to_string()
}

#[test]
fn test_load_valid_csv() {
    let csv_content = "region,sales\nEast,1200\nWest,800";
    let file_path = create_test_csv(csv_content);
    let mut session = DuckSession::new().unwrap();
    let table_name = "test_sales";

    let result = session.load_csv_auto(table_name, &file_path);
    assert!(result.is_ok(), "Failed to load CSV: {:?}", result.err());

    let query_result = session.execute_sql(&format!("SELECT * FROM {}", table_name));
    assert!(query_result.is_ok(), "Query failed: {:?}", query_result.err());

    if let Ok(TypedValue { value: ArgValue::Table(data), .. }) = query_result {
        assert_eq!(data.len(), 2, "Expected 2 rows in the loaded table");
    } else {
        panic!("Expected table data in query result");
    }
}

#[test]
fn test_load_empty_csv() {
    let csv_content = "region,sales";
    let file_path = create_test_csv(csv_content);
    let mut session = DuckSession::new().unwrap();
    let table_name = "test_empty_sales";

    let result = session.load_csv_auto(table_name, &file_path);
    assert!(result.is_ok(), "Failed to load empty CSV: {:?}", result.err());

    let query_result = session.execute_sql(&format!("SELECT * FROM {}", table_name));
    assert!(query_result.is_ok(), "Query failed: {:?}", query_result.err());

    if let Ok(TypedValue { value: ArgValue::Table(data), .. }) = query_result {
        assert_eq!(data.len(), 0, "Expected 0 rows in the loaded table");
    } else {
        panic!("Expected table data in query result");
    }
}

#[test]
fn test_load_invalid_path() {
    let mut session = DuckSession::new().unwrap();
    let table_name = "test_invalid";
    let file_path = "nonexistent/path/to/file.csv";

    let result = session.load_csv_auto(table_name, file_path);
    assert!(result.is_err(), "Expected error for invalid file path");
}