#[cfg(test)]
mod tests {
use sql_cli::data::data_view::DataView;
use sql_cli::datatable::DataTable;
use sql_cli::datatable_loaders::load_json_to_datatable;
use std::path::PathBuf;
use std::sync::Arc;
fn get_test_data_path(filename: &str) -> PathBuf {
let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
path.push("data");
path.push(filename);
path
}
fn load_trades_datatable() -> DataTable {
let trades_path = get_test_data_path("trades.json");
println!("\n=== Loading trades.json ===");
println!("Path: {trades_path:?}");
let table =
load_json_to_datatable(trades_path, "trades").expect("Failed to load trades.json");
println!("{}", table.pretty_print());
table
}
#[test]
fn test_new_dataview_shows_all_data() {
let table = load_trades_datatable();
let view = DataView::new(Arc::new(table.clone()));
assert_eq!(view.row_count(), 100);
assert_eq!(view.column_count(), 15);
let columns = view.column_names();
assert!(columns.contains(&"trader".to_string()));
assert!(columns.contains(&"instrumentName".to_string()));
assert!(columns.contains(&"quantity".to_string()));
}
#[test]
fn test_hide_column() {
let table = load_trades_datatable();
let mut view = DataView::new(Arc::new(table));
assert_eq!(view.column_count(), 15);
view.hide_column_by_name("quantity");
assert_eq!(view.column_count(), 14);
assert!(view.has_hidden_columns());
let columns = view.column_names();
assert!(!columns.contains(&"quantity".to_string()));
let hidden = view.get_hidden_column_names();
assert!(hidden.contains(&"quantity".to_string()));
}
#[test]
fn test_unhide_all_columns() {
let table = load_trades_datatable();
let mut view = DataView::new(Arc::new(table));
view.hide_column_by_name("quantity");
view.hide_column_by_name("price");
assert_eq!(view.column_count(), 13);
view.unhide_all_columns();
assert_eq!(view.column_count(), 15);
assert!(!view.has_hidden_columns());
}
#[test]
fn test_text_filter() {
let table = load_trades_datatable();
let mut view = DataView::new(Arc::new(table));
view.apply_text_filter("Alice", true);
assert!(view.row_count() > 0); let count_with_alice = view.row_count();
view.clear_filter();
assert_eq!(view.row_count(), 100); assert!(count_with_alice < 100); }
#[test]
fn test_text_filter_case_insensitive() {
let table = load_trades_datatable();
let mut view = DataView::new(Arc::new(table));
view.apply_text_filter("alice", false);
let insensitive_count = view.row_count();
assert!(insensitive_count > 0);
view.clear_filter();
view.apply_text_filter("alice", true);
assert_eq!(view.row_count(), 0); }
#[test]
fn test_fuzzy_filter() {
let table = load_trades_datatable();
let mut view = DataView::new(Arc::new(table));
view.apply_fuzzy_filter("Johnson", false);
let johnson_count = view.row_count();
assert!(johnson_count > 0);
view.clear_filter();
view.apply_fuzzy_filter("'Alice", false);
let alice_count = view.row_count();
assert!(alice_count > 0);
view.clear_filter();
assert_eq!(view.row_count(), 100);
}
#[test]
fn test_sort_ascending() {
let table = load_trades_datatable();
let mut view = DataView::new(Arc::new(table));
let columns = view.column_names();
let trader_id_idx = columns.iter().position(|c| c == "trader").unwrap();
view.apply_sort(trader_id_idx, true).unwrap();
assert_eq!(view.row_count(), 100);
assert_eq!(view.get_sort_state().column, Some(trader_id_idx));
}
#[test]
fn test_sort_descending() {
let table = load_trades_datatable();
let mut view = DataView::new(Arc::new(table));
let columns = view.column_names();
let trader_id_idx = columns.iter().position(|c| c == "trader").unwrap();
view.apply_sort(trader_id_idx, false).unwrap();
assert_eq!(view.row_count(), 100);
assert_eq!(view.get_sort_state().column, Some(trader_id_idx));
}
#[test]
fn test_sort_then_filter_preserves_sort() {
let table = load_trades_datatable();
let mut view = DataView::new(Arc::new(table));
let columns = view.column_names();
let trader_id_idx = columns.iter().position(|c| c == "trader").unwrap();
view.apply_sort(trader_id_idx, false).unwrap();
assert_eq!(view.get_sort_state().column, Some(trader_id_idx));
view.apply_text_filter("Alice", true);
let filtered_count = view.row_count();
assert!(filtered_count > 0);
assert!(filtered_count < 100);
assert_eq!(view.get_sort_state().column, Some(trader_id_idx));
view.clear_filter();
assert_eq!(view.row_count(), 100);
assert_eq!(view.get_sort_state().column, Some(trader_id_idx));
}
#[test]
fn test_move_column_left() {
let table = load_trades_datatable();
let mut view = DataView::new(Arc::new(table));
let initial_columns = view.column_names();
if initial_columns.len() > 1 {
let second_col = initial_columns[1].clone();
let moved = view.move_column_left_by_name(&second_col);
assert!(moved);
let new_columns = view.column_names();
assert_eq!(new_columns[0], second_col);
}
}
#[test]
fn test_move_column_right() {
let table = load_trades_datatable();
let mut view = DataView::new(Arc::new(table));
let initial_columns = view.column_names();
if initial_columns.len() > 1 {
let first_col = initial_columns[0].clone();
let moved = view.move_column_right_by_name(&first_col);
assert!(moved);
let new_columns = view.column_names();
assert_eq!(new_columns[1], first_col);
}
}
#[test]
fn test_with_trades_json() {
let table = load_trades_datatable();
let mut view = DataView::new(Arc::new(table));
assert_eq!(view.row_count(), 100);
assert!(view.column_count() > 0);
view.apply_text_filter("USD", false);
assert!(view.row_count() > 0); assert!(view.row_count() < 100);
view.clear_filter();
view.apply_fuzzy_filter("EQUITY", false);
let fuzzy_count = view.row_count();
assert!(fuzzy_count > 0);
view.clear_filter();
if let Some(amount_col) = view.source().get_column_index("amount") {
view.apply_sort(amount_col, false).unwrap();
assert_eq!(view.row_count(), 100);
}
}
}