"""Tests para detect_time_column (grupo eda). Self-contained, sin DuckDB.""" from detect_time_column import detect_time_column def test_golden_datetime_y_numericas(): columns = [ {"name": "fecha", "inferred_type": "datetime", "semantic_type": "datetime_iso"}, {"name": "ventas", "inferred_type": "numeric"}, {"name": "unidades", "inferred_type": "numeric"}, {"name": "region", "inferred_type": "text"}, ] res = detect_time_column(columns) assert res["time_col"] == "fecha" assert res["time_semantic"] == "datetime_iso" assert res["numeric_cols"] == ["ventas", "unidades"] assert res["n_datetime_cols"] == 1 assert res["datetime_cols"] == ["fecha"] assert isinstance(res["reason"], str) and res["reason"] def test_deteccion_por_semantic_type_date_eu(): # inferred_type no es datetime, pero semantic_type date_eu => temporal. columns = [ {"name": "id", "inferred_type": "numeric"}, {"name": "dia", "inferred_type": "text", "semantic_type": "date_eu"}, {"name": "importe", "inferred_type": "numeric"}, ] res = detect_time_column(columns) assert res["time_col"] == "dia" assert res["time_semantic"] == "date_eu" assert res["numeric_cols"] == ["id", "importe"] assert res["n_datetime_cols"] == 1 assert res["datetime_cols"] == ["dia"] def test_sin_columna_temporal(): columns = [ {"name": "id", "inferred_type": "numeric"}, {"name": "nombre", "inferred_type": "text"}, {"name": "activo", "inferred_type": "boolean"}, ] res = detect_time_column(columns) assert res["time_col"] is None assert res["time_semantic"] == "" assert res["numeric_cols"] == ["id"] assert res["n_datetime_cols"] == 0 assert res["datetime_cols"] == [] assert res["reason"] == "no se detecto columna de fecha/datetime" def test_columns_none_no_revienta(): res = detect_time_column(None) assert res["time_col"] is None assert res["time_semantic"] == "" assert res["numeric_cols"] == [] assert res["n_datetime_cols"] == 0 assert res["datetime_cols"] == [] assert res["reason"] == "no se detecto columna de fecha/datetime" def test_columns_vacia_no_revienta(): res = detect_time_column([]) assert res["time_col"] is None assert res["numeric_cols"] == [] assert res["n_datetime_cols"] == 0 def test_columns_no_lista_no_revienta(): # Un dict (no lista) tambien debe caer en el caso "no aplica". res = detect_time_column({"name": "fecha", "inferred_type": "datetime"}) assert res["time_col"] is None assert res["numeric_cols"] == [] def test_elementos_basura_se_ignoran(): columns = [ None, "no soy un dict", 42, {"name": "ts", "inferred_type": "datetime"}, {"name": "valor", "inferred_type": "numeric"}, ] res = detect_time_column(columns) assert res["time_col"] == "ts" assert res["numeric_cols"] == ["valor"] assert res["n_datetime_cols"] == 1 def test_varias_datetime_elige_la_primera(): columns = [ {"name": "created_at", "inferred_type": "datetime", "semantic_type": "datetime_iso"}, {"name": "metric", "inferred_type": "numeric"}, {"name": "updated_at", "inferred_type": "datetime", "semantic_type": "datetime_iso"}, {"name": "fecha_baja", "inferred_type": "text", "semantic_type": "date_eu"}, ] res = detect_time_column(columns) assert res["time_col"] == "created_at" assert res["time_semantic"] == "datetime_iso" assert res["n_datetime_cols"] == 3 assert res["datetime_cols"] == ["created_at", "updated_at", "fecha_baja"] assert res["numeric_cols"] == ["metric"]