GCMD_Keyword_Classifier_MVP / tests /test_review_flagging.py
igerasimov's picture
classification review-risk flagging
5ab38b4
Raw
History Blame Contribute Delete
4.21 kB
from __future__ import annotations
from gcmd_classifier.models import (
ClassificationFinalStatus,
ClassificationRecord,
ConfidenceMetadata,
DeterministicValidationResult,
SupportType,
)
from gcmd_classifier.pipeline.review import (
REVIEW_RECOMMENDED_WEAK_SUPPORT,
flag_review_risk,
)
def _record(
*,
level: str = "Variable_Level_1",
support_type: SupportType | None = SupportType.EXPLICIT,
confidence_final: float | None = 0.9,
final_status: ClassificationFinalStatus = ClassificationFinalStatus.ACCEPTED,
) -> ClassificationRecord:
return ClassificationRecord(
UUID=f"uuid-{level.lower()}",
name=f"Name {level}",
level=level,
canonical_path=f"ATMOSPHERE > TERM > {level}",
path_components=("ATMOSPHERE", "TERM", level),
topic="ATMOSPHERE",
term="TERM" if level != "Topic" else None,
confidence=ConfidenceMetadata(final=confidence_final),
classifier_evidence="Evidence.",
support_type=support_type,
deterministic_validation=DeterministicValidationResult(valid=True),
final_status=final_status,
)
def _flagged(record: ClassificationRecord) -> ClassificationRecord:
return flag_review_risk((record,))[0]
def test_inferred_variable_level_2_is_flagged_even_with_high_confidence() -> None:
record = _flagged(
_record(level="Variable_Level_2", support_type=SupportType.INFERRED, confidence_final=0.95)
)
assert record.review_required is True
assert record.final_status is ClassificationFinalStatus.ACCEPTED
assert record.warnings[-1].code == REVIEW_RECOMMENDED_WEAK_SUPPORT
def test_inferred_variable_level_3_is_flagged_even_with_high_confidence() -> None:
record = _flagged(
_record(level="Variable_Level_3", support_type=SupportType.INFERRED, confidence_final=0.95)
)
assert record.review_required is True
assert record.warnings[-1].code == REVIEW_RECOMMENDED_WEAK_SUPPORT
def test_inferred_low_confidence_is_flagged() -> None:
record = _flagged(
_record(level="Variable_Level_1", support_type=SupportType.INFERRED, confidence_final=0.74)
)
assert record.review_required is True
assert record.warnings[-1].code == REVIEW_RECOMMENDED_WEAK_SUPPORT
def test_mixed_low_confidence_is_flagged() -> None:
record = _flagged(_record(level="Term", support_type=SupportType.MIXED, confidence_final=0.69))
assert record.review_required is True
assert record.warnings[-1].code == REVIEW_RECOMMENDED_WEAK_SUPPORT
def test_inferred_or_mixed_topic_is_flagged() -> None:
inferred = _flagged(
_record(level="Topic", support_type=SupportType.INFERRED, confidence_final=0.9)
)
mixed = _flagged(_record(level="Topic", support_type=SupportType.MIXED, confidence_final=0.9))
assert inferred.review_required is True
assert mixed.review_required is True
def test_explicit_or_strong_mixed_classification_is_not_flagged() -> None:
explicit = _flagged(
_record(level="Variable_Level_3", support_type=SupportType.EXPLICIT, confidence_final=0.1)
)
strong_mixed = _flagged(
_record(level="Variable_Level_1", support_type=SupportType.MIXED, confidence_final=0.70)
)
assert explicit.review_required is False
assert explicit.warnings == ()
assert strong_mixed.review_required is False
assert strong_mixed.warnings == ()
def test_non_accepted_classification_is_not_flagged() -> None:
record = _flagged(
_record(
level="Variable_Level_3",
support_type=SupportType.INFERRED,
confidence_final=0.1,
final_status=ClassificationFinalStatus.REJECTED,
)
)
assert record.review_required is False
assert record.warnings == ()
def test_review_warning_appears_in_json_output() -> None:
record = _flagged(
_record(level="Variable_Level_2", support_type=SupportType.INFERRED, confidence_final=0.95)
)
dumped = record.model_dump(mode="json")
assert dumped["review_required"] is True
assert dumped["final_status"] == "accepted"
assert dumped["warnings"][-1]["code"] == REVIEW_RECOMMENDED_WEAK_SUPPORT