from app import session as session_module from app.config import Settings from app.providers.base import CriticalEntity, Review from app.providers.mock import MockASRProvider, MockMTProvider, MockReviewerProvider from app.providers.registry import ProviderSet from app.risk import RiskResult def test_high_risk_reviewer_failure_blocks_turn(db_session, monkeypatch) -> None: created = session_module.crud.create_session(db_session, {"ai_disclosure": True}) monkeypatch.setattr( session_module, "classify_risk", lambda *args: RiskResult(tier="high", spans=[{"kind": "dose"}]), ) providers = ProviderSet( asr=MockASRProvider(), mt=MockMTProvider(), reviewer=MockReviewerProvider(fail=True), ) turn = session_module.process_text_turn( db_session, providers, Settings(), session_id=created.id, speaker="doctor", lang="vi", text="Uống nửa viên", asr_confidence=1, ) assert turn.status == "blocked" assert turn.readback_json is not None assert "reviewer_failed" in turn.readback_json def test_high_risk_readback_stores_entity_text(db_session, monkeypatch) -> None: created = session_module.crud.create_session(db_session, {"ai_disclosure": True}) monkeypatch.setattr( session_module, "classify_risk", lambda *args: RiskResult(tier="high", spans=[{"kind": "dose"}]), ) providers = ProviderSet( asr=MockASRProvider(), mt=MockMTProvider(), reviewer=MockReviewerProvider( canned={ ( "vi", "en", "Uống 0.5 viên", "[vi->en] Uống 0.5 viên", ): Review( back_translation="Uống nửa viên", entities=[ CriticalEntity( kind="dose", source_text="nửa viên", translated_text="half a tablet", ) ], flags=[], ) } ), ) turn = session_module.process_text_turn( db_session, providers, Settings(), session_id=created.id, speaker="doctor", lang="vi", text="Uống nửa viên", asr_confidence=1, ) assert turn.readback_json is not None assert "source_text" in turn.readback_json assert "nửa viên" in turn.readback_json assert "source_span" not in turn.readback_json