- 10 translate plugin test files (100% coverage on 12 modules) - assistant/handler tools: 85+ tests covering dispatch, registry, resolvers, routes, llm_planner, 13 tool handlers - clean release: artifact_catalog_loader, mappers, approval, publication tests - API routes: translate_helpers, validation_service extensions, datasets to 100% - notifications: providers/service tests - services: profile_preference_service - docs/orthogonal-test-report.md — full speckit.tests audit - Fixes: 3 git_base async mock failures, 4 assistant handler permission-check patches - .gitignore: coverage artifacts
106 lines
3.6 KiB
Python
106 lines
3.6 KiB
Python
# #region Test.TranslateHelpers [C:2] [TYPE Module] [SEMANTICS test,translate,helpers,run,dict]
|
|
# @BRIEF Unit tests for shared translate helper functions.
|
|
# @RELATION BINDS_TO -> [TranslateHelpersModule]
|
|
|
|
from pathlib import Path
|
|
import sys
|
|
sys.path.insert(0, str(Path(__file__).parent.parent / "src"))
|
|
|
|
from unittest.mock import MagicMock
|
|
from datetime import datetime, UTC
|
|
import pytest
|
|
|
|
|
|
def make_run(**overrides):
|
|
run = MagicMock()
|
|
run.id = "run-1"
|
|
run.job_id = "job-1"
|
|
run.status = "completed"
|
|
run.trigger_type = "manual"
|
|
run.started_at = datetime(2026, 1, 1, 12, 0, 0, tzinfo=UTC)
|
|
run.completed_at = datetime(2026, 1, 1, 14, 0, 0, tzinfo=UTC)
|
|
run.error_message = None
|
|
run.total_records = 100
|
|
run.successful_records = 90
|
|
run.failed_records = 5
|
|
run.skipped_records = 5
|
|
run.cache_hits = 10
|
|
run.insert_status = "completed"
|
|
run.superset_execution_id = "exec-1"
|
|
run.config_snapshot = {"key": "val"}
|
|
run.key_hash = "abc123"
|
|
run.config_hash = "def456"
|
|
run.dict_snapshot_hash = "ghi789"
|
|
run.created_by = "testuser"
|
|
run.created_at = datetime(2026, 1, 1, 12, 0, 0, tzinfo=UTC)
|
|
for k, v in overrides.items():
|
|
setattr(run, k, v)
|
|
return run
|
|
|
|
|
|
class TestRunToResponse:
|
|
"""_run_to_response — convert TranslationRun to dict."""
|
|
|
|
def test_full_run(self):
|
|
from src.api.routes.translate._helpers import _run_to_response
|
|
run = make_run()
|
|
result = _run_to_response(run)
|
|
assert result["id"] == "run-1"
|
|
assert result["job_id"] == "job-1"
|
|
assert result["status"] == "completed"
|
|
assert result["total_records"] == 100
|
|
|
|
def test_null_dates(self):
|
|
from src.api.routes.translate._helpers import _run_to_response
|
|
run = make_run(started_at=None, completed_at=None)
|
|
result = _run_to_response(run)
|
|
assert result["started_at"] is None
|
|
assert result["completed_at"] is None
|
|
|
|
|
|
class TestDictToResponse:
|
|
"""_dict_to_response — convert TerminologyDictionary to dict."""
|
|
|
|
def test_basic_conversion(self):
|
|
from src.api.routes.translate._helpers import _dict_to_response
|
|
d = MagicMock()
|
|
d.id = "dict-1"
|
|
d.name = "My Dictionary"
|
|
d.description = "Test desc"
|
|
d.is_active = True
|
|
d.created_by = "admin"
|
|
d.created_at = datetime(2026, 1, 1, 12, 0, 0, tzinfo=UTC)
|
|
d.updated_at = datetime(2026, 1, 1, 13, 0, 0, tzinfo=UTC)
|
|
|
|
result = _dict_to_response(d, entry_count=42)
|
|
assert result["id"] == "dict-1"
|
|
assert result["name"] == "My Dictionary"
|
|
assert result["entry_count"] == 42
|
|
assert result["is_active"] is True
|
|
|
|
|
|
class TestGetDictionaryEntryCounts:
|
|
"""_get_dictionary_entry_counts — query entry counts."""
|
|
|
|
def test_returns_counts(self):
|
|
from src.api.routes.translate._helpers import _get_dictionary_entry_counts
|
|
from sqlalchemy import func
|
|
|
|
db = MagicMock()
|
|
mock_row_1 = ("dict-1", 10)
|
|
mock_row_2 = ("dict-2", 5)
|
|
db.query.return_value.filter.return_value.group_by.return_value.all.return_value = [
|
|
mock_row_1, mock_row_2,
|
|
]
|
|
|
|
result = _get_dictionary_entry_counts(db, ["dict-1", "dict-2"])
|
|
assert result == {"dict-1": 10, "dict-2": 5}
|
|
|
|
def test_empty_input(self):
|
|
from src.api.routes.translate._helpers import _get_dictionary_entry_counts
|
|
db = MagicMock()
|
|
db.query.return_value.filter.return_value.group_by.return_value.all.return_value = []
|
|
result = _get_dictionary_entry_counts(db, [])
|
|
assert result == {}
|
|
# #endregion Test.TranslateHelpers
|