"""Unit tests for the per-query watchdog verdict logic. The grace window is the whole point: a search that has just finished is briefly 'unknown' on the librarian while its result is still in flight, and we must NOT flag that as lost. Only a uuid that stays unknown-but-pending past the grace window is a genuinely lost result. """ from librarian_watchdog import FLAG, WAIT, pending_verdict GRACE = 45 def test_known_resets_clock_and_waits(): action, unknown_since = pending_verdict( known=True, unknown_since=100.0, now=200.0, grace_seconds=GRACE ) assert action == WAIT assert unknown_since is None # clock reset while it's still known def test_first_unknown_starts_grace_but_does_not_flag(): action, unknown_since = pending_verdict( known=False, unknown_since=None, now=1000.0, grace_seconds=GRACE ) assert action == WAIT assert unknown_since == 1000.0 # clock started now def test_unknown_within_grace_keeps_waiting(): action, unknown_since = pending_verdict( known=False, unknown_since=1000.0, now=1000.0 + GRACE - 1, grace_seconds=GRACE ) assert action == WAIT assert unknown_since == 1000.0 # unchanged, still counting def test_unknown_past_grace_flags_lost(): action, unknown_since = pending_verdict( known=False, unknown_since=1000.0, now=1000.0 + GRACE, grace_seconds=GRACE ) assert action == FLAG assert unknown_since == 1000.0 def test_recovered_to_known_after_being_unknown_resets(): # It reappeared (e.g. requeued / status flapped): do not flag, reset. action, unknown_since = pending_verdict( known=True, unknown_since=1000.0, now=1000.0 + GRACE + 10, grace_seconds=GRACE ) assert action == WAIT assert unknown_since is None