| import pytest |
| from fastapi.testclient import TestClient |
| from unittest.mock import patch, MagicMock |
|
|
| from tensorus.api import app |
| from tensorus.config import settings as global_settings |
| from tensorus.metadata import InMemoryStorage, PostgresMetadataStorage, storage_instance as global_storage_instance |
| from tensorus.metadata.storage_abc import MetadataStorage |
|
|
| |
|
|
| @pytest.fixture |
| def client(): |
| |
| |
| with TestClient(app) as c: |
| yield c |
|
|
| |
|
|
| def test_health_check_in_memory(client: TestClient, monkeypatch): |
| |
| |
| |
| |
|
|
| |
| |
|
|
| |
| |
|
|
| |
| |
|
|
| with patch.object(global_storage_instance, 'check_health', return_value=(True, "in_memory_mocked")) as mock_check: |
| response = client.get("/health") |
| assert response.status_code == 200 |
| data = response.json() |
| assert data["status"] == "ok" |
| assert data["backend"] == "in_memory_mocked" |
| mock_check.assert_called_once() |
|
|
| def test_health_check_postgres_ok(client: TestClient, monkeypatch): |
| |
| with patch.object(global_storage_instance, 'check_health', return_value=(True, "postgres_mocked")) as mock_check: |
| response = client.get("/health") |
| assert response.status_code == 200 |
| data = response.json() |
| assert data["status"] == "ok" |
| assert data["backend"] == "postgres_mocked" |
| mock_check.assert_called_once() |
|
|
| def test_health_check_postgres_error(client: TestClient, monkeypatch): |
| |
| with patch.object(global_storage_instance, 'check_health', return_value=(False, "postgres_mocked_fail")) as mock_check: |
| response = client.get("/health") |
| assert response.status_code == 503 |
| data = response.json() |
| assert data["status"] == "error" |
| assert data["backend"] == "postgres_mocked_fail" |
| assert "Storage backend connection failed" in data["detail"] |
| mock_check.assert_called_once() |
|
|
|
|
| |
|
|
| def test_metrics_endpoint_empty(client: TestClient, monkeypatch): |
| |
| with patch.object(global_storage_instance, 'get_tensor_descriptors_count', return_value=0) as mock_td_count, \ |
| patch.object(global_storage_instance, 'get_extended_metadata_count') as mock_ext_count: |
|
|
| |
| mock_ext_count.return_value = 0 |
|
|
| response = client.get("/metrics") |
| assert response.status_code == 200 |
| data = response.json() |
|
|
| expected_metrics = { |
| "total_tensor_descriptors": 0, |
| "semantic_metadata_count": 0, |
| "lineage_metadata_count": 0, |
| "computational_metadata_count": 0, |
| "quality_metadata_count": 0, |
| "relational_metadata_count": 0, |
| "usage_metadata_count": 0 |
| } |
| assert data == expected_metrics |
| mock_td_count.assert_called_once() |
| |
| assert mock_ext_count.call_count == 6 |
|
|
|
|
| def test_metrics_endpoint_with_data(client: TestClient, monkeypatch): |
| |
| with patch.object(global_storage_instance, 'get_tensor_descriptors_count', return_value=5) as mock_td_count, \ |
| patch.object(global_storage_instance, 'get_extended_metadata_count') as mock_ext_count: |
|
|
| def ext_count_side_effect(model_name: str): |
| counts = { |
| "SemanticMetadata": 10, "LineageMetadata": 4, "ComputationalMetadata": 3, |
| "QualityMetadata": 2, "RelationalMetadata": 1, "UsageMetadata": 5 |
| } |
| return counts.get(model_name, 0) |
|
|
| mock_ext_count.side_effect = ext_count_side_effect |
|
|
| response = client.get("/metrics") |
| assert response.status_code == 200 |
| data = response.json() |
|
|
| expected_metrics = { |
| "total_tensor_descriptors": 5, |
| "semantic_metadata_count": 10, |
| "lineage_metadata_count": 4, |
| "computational_metadata_count": 3, |
| "quality_metadata_count": 2, |
| "relational_metadata_count": 1, |
| "usage_metadata_count": 5 |
| } |
| assert data == expected_metrics |
| mock_td_count.assert_called_once() |
| assert mock_ext_count.call_count == 6 |
|
|
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|