"""Watermark probe: abstain-by-default, and absence is never counter-evidence.""" from text_detection.detectors.watermark import WatermarkDetector from text_detection.schema import Verdict async def test_abstains_when_no_keys_configured(monkeypatch): from text_detection.config import settings monkeypatch.setattr(settings, "synthid_keys_path", None, raising=False) det = WatermarkDetector() res = await det.detect_text("Some ordinary text with no watermark at all.") assert res.detector == "text_watermark" assert res.confidence == 0.0 # abstain -> ignored by fusion assert res.verdict == Verdict.UNCERTAIN assert res.error is None # abstain is NOT an error async def test_absent_watermark_does_not_lower_p_fake(monkeypatch): # Absence of a watermark says nothing about authorship: p_fake must stay # neutral at 0.5, never drop toward "human". from text_detection.config import settings monkeypatch.setattr(settings, "synthid_keys_path", "/tmp/fake-keys", raising=False) det = WatermarkDetector() res = await det.detect_text("Some ordinary text with no watermark at all.") assert res.p_fake == 0.5 assert res.confidence == 0.0 async def test_detected_watermark_is_high_confidence_ai(monkeypatch): from text_detection.detectors import watermark as wm monkeypatch.setattr(wm.settings, "synthid_keys_path", "/tmp/fake-keys", raising=False) monkeypatch.setattr(wm, "_synthid_detect", lambda text, keys: (True, 0.91)) res = await wm.WatermarkDetector().detect_text("Watermarked output.") assert res.verdict == Verdict.AI_GENERATED assert res.p_fake > 0.9 assert res.confidence > 0.9 assert res.generator == "watermarked-LLM" async def test_empty_text_returns_error(): det = WatermarkDetector() res = await det.detect_text("") assert res.error is not None