Files
claude-code e8b256ef92
werkator build succeeded after 00:22
werkrevisor 0.14.0: severity of the model findings (#14)
werkrevisor 0.14.0: the severity of the model findings decides between ORANGE and YELLOW.

- The model marks every finding as `[high]`, `[medium]` or `[low]`; werkrevisor reads and strips the mark.
- ORANGE needs one high finding or `[review] orange_min_medium` (default 2) medium ones; other findings give YELLOW.
- `[review] orange_min_medium` replaces `red_min_findings`.

Details: the PR document under `docs/prs/`.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Reviewed-on: #14
Co-authored-by: claude-code <claude-code@javagil.de>
2026-10-05 20:39:29 +02:00

46 lines
2.6 KiB
Python

import unittest
from tests.fakes import BASE, pr_ref
from werkrevisor.redact import Redactor
from werkrevisor.report import ReviewResult, render_comment
from werkrevisor.verdict import Finding, Reason, Verdict
class ReasonOrderTest(unittest.TestCase):
def test_reasons_are_listed_from_the_most_to_the_least_severe(self):
reasons = [Reason("a", "first yellow", Verdict.YELLOW), Reason("b", "orange", Verdict.ORANGE),
Reason("c", "second yellow", Verdict.YELLOW), Reason("d", "red", Verdict.RED)]
body = render_comment(ReviewResult(verdict=Verdict.RED, reasons=reasons), pr_ref(), BASE, 3, Redactor())
listed = [line for line in body.splitlines() if line.startswith("- **")]
self.assertEqual(listed, ["- **RED** red", "- **ORANGE** orange",
"- **YELLOW** first yellow", "- **YELLOW** second yellow"])
def finding(header, severity="medium", known=True, line=1):
return Finding("a.py", line, line, header, "Text.", severity, known)
class FindingOrderTest(unittest.TestCase):
def numbered(self, findings, max_findings=10):
result = ReviewResult(verdict=Verdict.ORANGE, findings=findings)
body = render_comment(result, pr_ref(), BASE, max_findings, Redactor())
return [line for line in body.splitlines() if line[:1].isdigit() and ". **" in line]
def test_findings_are_listed_from_high_to_low_severity(self):
findings = [finding("First Low", "low", line=1), finding("Possible Bug", "high", line=2),
finding("Second Low", "low", line=3), finding("Missing Test", "medium", line=4)]
self.assertEqual(self.numbered(findings), ["1. **[high] Possible Bug** at `a.py:2`",
"2. **[medium] Missing Test** at `a.py:4`",
"3. **[low] First Low** at `a.py:1`",
"4. **[low] Second Low** at `a.py:3`"])
def test_the_cut_at_max_findings_keeps_the_severe_ones(self):
findings = [finding("Low", "low"), finding("Bug", "high")]
self.assertEqual(self.numbered(findings, max_findings=1), ["1. **[high] Bug** at `a.py:1`"])
def test_unknown_severity_is_shown_as_counted_as_medium(self):
findings = [finding("[critical] Possible Bug", known=False, line=1), finding("Log Noise", "low", line=2)]
self.assertEqual(self.numbered(findings),
["1. **[critical] Possible Bug** at `a.py:1`, severity unknown, counted as medium",
"2. **[low] Log Noise** at `a.py:2`"])