import numpy as np import pandas as pd import pytest from tabicl_mcp import server from tabicl_mcp.report import build_report CSV = "x1,x2,label\n" + "\n".join( f"{i % 10},{(i * 7) % 5},{'yes' if i % 10 > 4 else 'no'}" for i in range(60) ) def test_load_data_inline(): result = server.load_data(csv_content=CSV, target_column="label") assert result["dataset_id"].startswith("ds_") assert result["n_rows"] == 60 assert result["target"]["suggested_task"] == "classification" def test_load_data_requires_one_source(): assert "error" in server.load_data() assert "error" in server.load_data(csv_content=CSV, url="https://x.com/a.csv") def test_load_data_bad_target_warns(): result = server.load_data(csv_content=CSV, target_column="nope") assert "target_warning" in result def test_evaluate_unknown_dataset_id_is_friendly(): result = server.evaluate(target_column="label", dataset_id="ds_missing") assert "not found" in result["error"] def test_export_predictions_pages(): df = pd.DataFrame({"a": range(10), "p": range(10)}) result_id = server.D.CACHE.put(df, prefix="pred") page = server.export_predictions(result_id, offset=8, limit=5) assert page["total_rows"] == 10 assert page["returned_rows"] == 2 assert "csv" in page @pytest.mark.slow def test_full_flow_and_report(tmp_path, monkeypatch): monkeypatch.setattr(server, "REPORTS_DIR", str(tmp_path)) loaded = server.load_data(csv_content=CSV) ds = loaded["dataset_id"] evaluation = server.evaluate(target_column="label", dataset_id=ds) assert "metrics" in evaluation, evaluation report = server.create_report(target_column="label", dataset_id=ds) assert "report_file" in report, report html = open(report["report_file"], encoding="utf-8").read() assert "