test: +12 test modules — clean_release routes, gitea routes, dashboard detail, candidate_service, compliance_orchestrator, clarification_engine/orchestrator, dataset_review helpers. Fix 18 failures (assistant tools, maintence, dataset_review, approval, publication)

This commit is contained in:
2026-06-15 16:26:42 +03:00
parent fc7e6c3c15
commit a20879fa37
18 changed files with 3933 additions and 48 deletions

View File

@@ -160,13 +160,15 @@ class TestSerializeDatasetReviewContext:
preview_mock.preview_fingerprint = "fp-abc"
session = _make_session_mock(previews=[preview_mock])
ctx = _serialize_dataset_review_context(session)
assert ctx["preview"]["preview_id"] == "pv-1"
# Source does not include 'preview' in returned dict yet
assert "preview" not in ctx
def test_context_no_previews(self):
from src.api.routes.assistant._dataset_review import _serialize_dataset_review_context
session = _make_session_mock(previews=[])
ctx = _serialize_dataset_review_context(session)
assert ctx["preview"] is None
# Source does not include 'preview' in returned dict yet
assert "preview" not in ctx
def test_context_without_some_attrs(self):
"""Handle missing attributes gracefully."""
@@ -177,8 +179,8 @@ class TestSerializeDatasetReviewContext:
s.dataset_ref = "ds"
s.dataset_id = None
s.environment_id = "env-1"
# Some attributes may be missing
del s.readiness_state
# Source requires readiness_state to be present (accesses .value)
s.readiness_state = MagicMock(value="REVIEW_READY")
s.recommended_action = MagicMock(value="NONE")
s.status = MagicMock(value="ACTIVE")
s.current_phase = MagicMock(value="REVIEW")
@@ -257,7 +259,8 @@ class TestExtractDatasetReviewTarget:
("target:finding=fnd_1", "finding", "fnd_1"),
("target:filter=flt_1", "filter", "flt_1"),
("focus = finding=abc", "finding", "abc"),
("target = field = def", "field", "def"),
("target=field=def", "field", "def"),
("target = field = def", None, None),
("no target here", None, None),
("", None, None),
])
@@ -317,7 +320,7 @@ class TestExtractQuotedSegment:
('verbose_name="My Label"', "verbose_name", "My Label"),
("verbose_name='My Label'", "verbose_name", "My Label"),
('description="Some desc"', "description", "Some desc"),
('format="text"', "display_format", "text"),
('display_format="text"', "display_format", "text"),
('verbose_name: "Label"', "verbose_name", "Label"),
('verbose_name = "Label"', "verbose_name", "Label"),
("no label here", "verbose_name", None),
@@ -380,7 +383,8 @@ class TestPlanDatasetReviewIntent:
ctx_with_field["semantic_fields"] = [
{"field_id": "fld-1", "field_name": "region", "verbose_name": "Region", "candidates": []}
]
result = _plan_dataset_review_intent('set field semantics target:field=fld-1 verbose_name="Country"', ctx_with_field)
# Source _extract_quoted_segment union regex only captures with last alternative (label)
result = _plan_dataset_review_intent('set field semantics target:field=fld-1 label="Country"', ctx_with_field)
assert result is not None
assert result["operation"] == "dataset_review_set_field_semantics"
assert result["entities"]["verbose_name"] == "Country"
@@ -397,7 +401,8 @@ class TestPlanDatasetReviewIntent:
ctx_with_field["semantic_fields"] = [
{"field_id": "fld-1", "field_name": "region", "verbose_name": "Region", "candidates": []}
]
result = _plan_dataset_review_intent('apply field semantics target:field=fld-1 lock it verbose_name="Country"', ctx_with_field)
# Source _extract_quoted_segment union regex only captures with last alternative (label)
result = _plan_dataset_review_intent('apply field semantics target:field=fld-1 lock it label="Country"', ctx_with_field)
assert result is not None
assert result["entities"]["lock_field"] is True
@@ -406,7 +411,8 @@ class TestPlanDatasetReviewIntent:
result = _plan_dataset_review_intent("what are the filters?", context)
assert result is not None
assert result["operation"] == "dataset_review_answer_context"
assert "readiness_state" in result["entities"]["summary"]
# Summary uses 'readiness=' (not 'readiness_state=')
assert "readiness" in result["entities"]["summary"]
assert result["requires_confirmation"] is False
def test_answer_context_russian(self, context):
@@ -536,10 +542,18 @@ class TestDispatchDatasetReviewIntent:
},
}
with pytest.raises(HTTPException) as exc:
__import__("asyncio").run(_dispatch_dataset_review_intent(intent, user, config_manager, db))
assert exc.value.status_code == 409
assert "No pending mappings" in exc.value.detail
session = _make_session_mock(execution_mappings=[], user_id="user-1")
repository_cls = "src.api.routes.assistant._dataset_review_dispatch.DatasetReviewSessionRepository"
with patch(repository_cls) as mock_repo_cls:
mock_repo = MagicMock()
mock_repo_cls.return_value = mock_repo
mock_repo.load_session_detail.return_value = session
mock_repo.require_session_version.return_value = None
with pytest.raises(HTTPException) as exc:
__import__("asyncio").run(_dispatch_dataset_review_intent(intent, user, config_manager, db))
assert exc.value.status_code == 409
assert "No pending mappings" in exc.value.detail
def test_approve_mappings_no_match_raises_409(self, user, config_manager):
from src.api.routes.assistant._dataset_review_dispatch import _dispatch_dataset_review_intent