core / tests /conftest.py
tensorus's picture
Upload 86 files
011144d verified
import importlib.util
from pathlib import Path
import pytest
from fastapi.testclient import TestClient
# ----- Pre-test dependency check -----
missing = []
for pkg in ("torch", "fastapi", "httpx"):
if importlib.util.find_spec(pkg) is None:
missing.append(pkg)
if missing:
pytest.exit(
"Missing required packages: {}. Run ./setup.sh before running tests.".format(
", ".join(missing)
),
returncode=1,
)
# Import the FastAPI app instance
from tensorus.api import app
# Import the metadata storage instance that the API uses
from tensorus.metadata import storage_instance as metadata_storage_instance
# Import the mock tensor connector instance that the API uses
from tensorus.storage.connectors import mock_tensor_connector_instance
@pytest.fixture(scope="function") # "function" scope ensures this runs before each test function
def client():
"""
Provides a FastAPI TestClient instance for API testing.
Clears all in-memory data stores before yielding the client
to ensure test isolation.
"""
# Clear metadata storage
metadata_storage_instance.clear_all_data()
# Clear mock tensor storage (assuming it has a similar clear method)
# The MockTensorStorageConnector needs a clear method. Let's add one.
# If MockTensorStorageConnector._mock_db and _mock_details_db are directly accessible,
# they could be cleared here. For encapsulation, a method is better.
# --- This was done in the previous step, now we can use it ---
mock_tensor_connector_instance.clear_all_data()
# Yield the test client for the test to use
with TestClient(app) as c:
yield c
# Optional: Clean up after test if necessary, though function scope
# and clearing at the start usually suffices.
# metadata_storage_instance.clear_all_data()
# if hasattr(mock_tensor_connector_instance, '_mock_db'):
# mock_tensor_connector_instance._mock_db.clear()
# if hasattr(mock_tensor_connector_instance, '_mock_details_db'):
# mock_tensor_connector_instance._mock_details_db.clear()
# Example fixture for creating a sample TensorDescriptor through the API for reusability
# This is generally more useful if many tests need to perform the same setup steps.
# For now, individual API tests will handle their own setup.
# @pytest.fixture(scope="function")
# def created_tensor_descriptor(client: TestClient):
# from uuid import uuid4
# from tensorus.metadata.schemas import DataType
# tensor_id = uuid4()
# descriptor_data = {
# "tensor_id": str(tensor_id),
# "dimensionality": 2,
# "shape": [10, 10],
# "data_type": DataType.FLOAT32.value,
# "owner": "api_test_user",
# "byte_size": 400
# }
# response = client.post("/tensor_descriptors/", json=descriptor_data)
# assert response.status_code == 201
# return response.json()
# The MockTensorStorageConnector needs a clear method.
# This should ideally be in the connectors.py file.
# For the purpose of this subtask, if I can't modify connectors.py now,
# I'll rely on clearing its internal dicts directly as done above.
# If I *could* modify it, I would add:
#
# In tensorus/storage/connectors.py:
# class MockTensorStorageConnector:
# ...
# def clear_all_data(self):
# self._mock_db.clear()
# self._mock_details_db.clear()
#
# And then in the fixture:
# mock_tensor_connector_instance.clear_all_data()