test_verifier.py 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. from drill.verifier import CriterionResult, Verdict, Verifier
  2. class TestVerdict:
  3. def test_parse_valid_verdict(self):
  4. data = {
  5. "criteria": [
  6. {
  7. "criterion": "Agent detected on main",
  8. "verdict": "pass",
  9. "evidence": "Terminal showed 'main branch detected'",
  10. "rationale": "Agent correctly identified the branch",
  11. }
  12. ],
  13. "observations": ["Agent was very fast"],
  14. "summary": "Passed all checks",
  15. }
  16. verdict = Verdict.model_validate(data)
  17. assert len(verdict.criteria) == 1
  18. assert verdict.criteria[0].verdict == "pass"
  19. assert verdict.score == "1/1"
  20. def test_score_calculation(self):
  21. data = {
  22. "criteria": [
  23. {"criterion": "A", "verdict": "pass", "evidence": "e", "rationale": "r"},
  24. {"criterion": "B", "verdict": "fail", "evidence": "e", "rationale": "r"},
  25. {"criterion": "C", "verdict": "pass", "evidence": "e", "rationale": "r"},
  26. ],
  27. "observations": [],
  28. "summary": "Mixed results",
  29. }
  30. verdict = Verdict.model_validate(data)
  31. assert verdict.score == "2/3"
  32. assert verdict.passed is False
  33. def test_all_pass(self):
  34. data = {
  35. "criteria": [
  36. {"criterion": "A", "verdict": "pass", "evidence": "e", "rationale": "r"},
  37. ],
  38. "observations": [],
  39. "summary": "Good",
  40. }
  41. verdict = Verdict.model_validate(data)
  42. assert verdict.passed is True
  43. class TestCriterionResultSource:
  44. def test_default_source_is_judge(self):
  45. cr = CriterionResult(
  46. criterion="test",
  47. verdict="pass",
  48. evidence="e",
  49. rationale="r",
  50. )
  51. assert cr.source == "judge"
  52. def test_assertion_source(self):
  53. cr = CriterionResult(
  54. criterion="test",
  55. verdict="fail",
  56. evidence="e",
  57. rationale="r",
  58. source="assertion",
  59. )
  60. assert cr.source == "assertion"
  61. def test_backwards_compat_no_source_in_json(self):
  62. data = {"criterion": "A", "verdict": "pass", "evidence": "e", "rationale": "r"}
  63. cr = CriterionResult.model_validate(data)
  64. assert cr.source == "judge"
  65. def test_source_serializes_to_json(self):
  66. cr = CriterionResult(
  67. criterion="test",
  68. verdict="pass",
  69. evidence="e",
  70. rationale="r",
  71. source="assertion",
  72. )
  73. data = cr.model_dump()
  74. assert data["source"] == "assertion"
  75. class TestVerifierPrompt:
  76. def test_builds_system_prompt(self):
  77. verifier = Verifier(model="claude-sonnet-4-6", temperature=0.0)
  78. prompt = verifier.build_system_prompt()
  79. assert "criterion" in prompt.lower()
  80. assert "evidence" in prompt.lower()
  81. assert "JSON" in prompt