import pytest from unittest.mock import AsyncMock, patch, MagicMock from fastapi import FastAPI from fastapi.testclient import TestClient from app.api.v1.data import data_router app = FastAPI() app.include_router(data_router, prefix="/v1") @pytest.fixture def data_client(): from app.api.v1.data import acccess_token_bearer # Override authentication and authorization app.dependency_overrides[acccess_token_bearer] = lambda: {"user_id": "test_user"} with TestClient(app) as client: yield client app.dependency_overrides.clear() @pytest.fixture def mock_data_service(): with patch("app.api.v1.data.data_service") as mock_service: yield mock_service def test_read_from_url(data_client, mock_data_service): mock_data_service.read_file = AsyncMock(return_value={"data": "parsed contents"}) response = data_client.get("/v1/data/read-file?url=http://example.com/data.csv") assert response.status_code == 200 assert response.json()["status"] is True assert response.json()["data"] == "parsed contents" mock_data_service.read_file.assert_called_once_with("http://example.com/data.csv") def test_save_metadata(data_client, mock_data_service): mock_data_service.save_metadata = AsyncMock(return_value="mock_id_123") payload = { "columns": {"feature_1": "float"}, "target_columns": ["target"], "file_url": "http://example.com/data.csv" } response = data_client.post("/v1/data/metadata", json=payload) assert response.status_code == 200 assert response.json()["message"] == "Metadata saved successfully" mock_data_service.save_metadata.assert_called_once() def test_update_metadata_success(data_client, mock_data_service): mock_data_service.update_metadata = AsyncMock(return_value=True) payload = { "metadata_id": "meta_1", "columns": {"feature_1": "float", "feature_2": "int"} } response = data_client.put("/v1/data/metadata", json=payload) assert response.status_code == 200 assert response.json()["message"] == "Metadata updated successfully" def test_get_column_types(data_client): response = data_client.get("/v1/data/column-types") assert response.status_code == 200 assert response.json()["status"] is True assert "data" in response.json()