"""报告结论反馈的纯函数与 schema 校验(T-P3-21 最小可用版,不连库)。 覆盖:ok_dimension_keys 的可反馈维度集合口径(status=ok 才可选)、 FeedbackCreateRequest 的 verdict 枚举与 correction 长度上限。 """ from __future__ import annotations import pytest from pydantic import ValidationError from packages.report.feedback_service import ok_dimension_keys from packages.report.schemas import FeedbackCreateRequest def _result(dimensions: list[dict[str, object]]) -> dict[str, object]: return {"diagnosis": {"dimensions": dimensions, "coverage": {"total": len(dimensions)}}} class TestOkDimensionKeys: def test_only_status_ok_dimensions_are_feedbackable(self) -> None: result = _result( [ {"key": "body_shape", "status": "ok"}, {"key": "color_season", "status": "skipped"}, {"key": "style_type", "status": "ok"}, ] ) assert ok_dimension_keys(result) == {"body_shape", "style_type"} def test_empty_or_missing_diagnosis_yields_empty(self) -> None: assert ok_dimension_keys({}) == set() assert ok_dimension_keys({"diagnosis": {}}) == set() assert ok_dimension_keys({"diagnosis": {"dimensions": "not-a-list"}}) == set() def test_malformed_items_are_ignored(self) -> None: result = _result( [ "garbage", {"status": "ok"}, # 缺 key {"key": 123, "status": "ok"}, # key 非字符串 {"key": "face_shape", "status": "ok"}, ] ) assert ok_dimension_keys(result) == {"face_shape"} class TestFeedbackCreateRequest: def test_verdict_enum_rejects_unknown_value(self) -> None: with pytest.raises(ValidationError): FeedbackCreateRequest.model_validate( {"dimension_key": "body_shape", "verdict": "kind-of"} ) def test_correction_max_200_chars(self) -> None: with pytest.raises(ValidationError): FeedbackCreateRequest.model_validate( { "dimension_key": "body_shape", "verdict": "inaccurate", "correction": "长" * 201, } ) def test_minimal_valid_payload(self) -> None: req = FeedbackCreateRequest.model_validate( {"dimension_key": "body_shape", "verdict": "accurate"} ) assert req.correction is None