from pathlib import Path import pandas as pd import pytest from backend.mini_data import DatasetNormalizer, UnsupportedDatasetTypeError def test_csv_upload_creates_canonical_data_and_mini_data(tmp_path: Path) -> None: source_file = tmp_path / "iris.csv" source_file.write_text( "a,b,target\n1,2,x\n3,4,y\n", encoding="utf-8", ) session_data_dir = tmp_path / "session" / "data" session_data_dir.mkdir(parents=True) normalizer = DatasetNormalizer(mini_data_sample_rows=1000, chunk_size_rows=50000) summary = normalizer.normalize(source_file=source_file, data_dir=session_data_dir) assert (session_data_dir / "data.csv").is_file() assert (session_data_dir / "mini_data.csv").is_file() assert summary.row_count == 2 assert summary.column_count == 3 assert summary.data_type == "csv" assert summary.columns == ["a", "b", "target"] def test_excel_upload_preserves_source_and_creates_csv(tmp_path: Path) -> None: source_file = tmp_path / "data.xlsx" pd.DataFrame({"a": [1, 2], "target": ["x", "y"]}).to_excel( source_file, index=False, ) session_data_dir = tmp_path / "session" / "data" session_data_dir.mkdir(parents=True) normalizer = DatasetNormalizer(mini_data_sample_rows=1000, chunk_size_rows=50000) summary = normalizer.normalize(source_file=source_file, data_dir=session_data_dir) assert (session_data_dir / "source.xlsx").is_file() assert (session_data_dir / "data.csv").is_file() assert (session_data_dir / "mini_data.csv").is_file() assert summary.row_count == 2 assert summary.column_count == 2 assert summary.data_type == "excel" def test_mini_data_contains_transposed_describe_output(tmp_path: Path) -> None: source_file = tmp_path / "data.csv" source_file.write_text( "feature,target\n1,a\n2,b\n3,c\n", encoding="utf-8", ) session_data_dir = tmp_path / "session" / "data" session_data_dir.mkdir(parents=True) normalizer = DatasetNormalizer(mini_data_sample_rows=1000, chunk_size_rows=2) normalizer.normalize(source_file=source_file, data_dir=session_data_dir) mini_data = pd.read_csv(session_data_dir / "mini_data.csv", index_col=0) assert "feature" in mini_data.index assert "count" in mini_data.columns def test_unsupported_upload_extension_fails(tmp_path: Path) -> None: source_file = tmp_path / "images.zip" source_file.write_bytes(b"not supported") session_data_dir = tmp_path / "session" / "data" session_data_dir.mkdir(parents=True) normalizer = DatasetNormalizer(mini_data_sample_rows=1000, chunk_size_rows=50000) with pytest.raises(UnsupportedDatasetTypeError): normalizer.normalize(source_file=source_file, data_dir=session_data_dir)