Files
ss-tools/backend/tests/services/test_services_mapping.py
busya c33792c8ee test(services): add unit tests for 7 service-layer modules
- profile_utils: 40 tests, 100% coverage (sanitize, normalize, mask, validate payload)
- security_badge_service: 17 tests, 100% coverage (role/permission extraction, security summary)
- services_mapping: 4 tests, 100% coverage (client resolution, get_suggestions)
- superset_lookup_service: 10 tests, 100% coverage (resolve environment, lookup success/degraded)
- notification_providers: 16 tests, 95% coverage (SMTP, Telegram, Slack providers)
- llm_provider: 25 tests, 91% coverage (mask_api_key, CRUD with encrypted API keys)
- rbac_permission_catalog: 12 tests, 79% coverage (route scanning, sync to DB)
2026-06-10 14:57:04 +03:00

91 lines
3.6 KiB
Python

# #region Test.Services.Mapping [C:3] [TYPE Module] [SEMANTICS test,mapping,superset,suggestions]
# @BRIEF Tests for mapping_service.py (services/mapping_service.py) — get_client, get_suggestions.
# @RELATION BINDS_TO -> [MappingService]
from pathlib import Path
import sys
sys.path.insert(0, str(Path(__file__).parent.parent / "src"))
from unittest.mock import AsyncMock, MagicMock, patch
import pytest
class MockEnvironment:
def __init__(self, env_id, name="test-env"):
self.id = env_id
self.name = name
self.username = "admin"
self.password = "pass"
self.url = "http://localhost:8080"
self.verify_ssl = False
self.timeout = 30
class TestGetMappingService:
"""MappingService — orchestrates DB fetching and fuzzy matching suggestions."""
@pytest.fixture
def config_manager(self):
cm = MagicMock()
cm.get_environments.return_value = [
MockEnvironment("source-1", "Source"),
MockEnvironment("target-1", "Target"),
]
return cm
@pytest.fixture
def service(self, config_manager):
from src.services.mapping_service import MappingService
return MappingService(config_manager)
def test_init(self, config_manager):
from src.services.mapping_service import MappingService
svc = MappingService(config_manager)
assert svc.config_manager is config_manager
def test_get_client_success(self, service):
from src.core.superset_client import SupersetClient
client = service._get_client("source-1")
assert isinstance(client, SupersetClient)
assert client.env.id == "source-1"
def test_get_client_not_found(self, service):
with pytest.raises(ValueError, match="Environment unknown-env not found"):
service._get_client("unknown-env")
@pytest.mark.asyncio
async def test_get_suggestions_success(self, service):
from src.services.mapping_service import MappingService
source_dbs = [{"database_name": "sales_db", "id": 1}]
target_dbs = [{"database_name": "sales", "id": 2}]
with (
patch.object(MappingService, "_get_client") as mock_get_client,
patch("src.services.mapping_service.suggest_mappings") as mock_suggest,
):
mock_source_client = MagicMock()
mock_target_client = MagicMock()
mock_source_client.get_databases_summary.return_value = source_dbs
mock_target_client.get_databases_summary.return_value = target_dbs
mock_get_client.side_effect = [mock_source_client, mock_target_client]
mock_suggest.return_value = [{"source": "sales_db", "target": "sales", "score": 0.9}]
result = await service.get_suggestions("source-1", "target-1")
assert result == [{"source": "sales_db", "target": "sales", "score": 0.9}]
mock_suggest.assert_called_once_with(source_dbs, target_dbs)
@pytest.mark.asyncio
async def test_get_suggestions_passes_envs_to_client(self, service):
from src.services.mapping_service import MappingService
with patch.object(MappingService, "_get_client") as mock_get_client:
mock_client = MagicMock()
mock_client.get_databases_summary.return_value = []
mock_get_client.return_value = mock_client
with patch("src.services.mapping_service.suggest_mappings", return_value=[]):
result = await service.get_suggestions("source-1", "target-1")
assert result == []
assert mock_get_client.call_count == 2
# #endregion Test.MappingService