Files
werkrevisor/tests/test_changed_lines.py
claude-code edcb9e3665
werkator build succeeded after 00:09
werkator/werkrevisor-statistics build succeeded after 00:28
werkrevisor 0.36.0: from the second round on, a hint on unchanged text holds no merge (#91)
Co-authored-by: claude-code <claude-code@javagil.de>
2026-10-12 08:01:59 +02:00

94 lines
4.4 KiB
Python

import unittest
from tests.fakes import BOT, HEAD, FakeGitea, FakeModel, config, diff_for, gitea_file, review_data
from tests.test_flow import run
from werkrevisor.verdict import Verdict
AUTOMERGE = {"yellow_gate": "approval", "human_reviewers": ["alice"], "automerge": True, "require_wip_transition": True}
DOC = "docs/prs/1.md"
EARLIER = "e" * 40
LONG_LINE = "A sentence that runs on and on " * 6
OLD_TEXT = f"# Title\n\nFirst sentence.\n{LONG_LINE}\n"
NEW_TEXT = f"# Title\n\nFirst sentence.\n{LONG_LINE}\nA new sentence.\n"
def earlier_round():
return {"id": 1, "user": {"login": BOT}, "created_at": "2026-10-12T08:00:00Z",
"body": f"<!-- werkrevisor:{EARLIER} -->\n<!-- werkrevisor-verdict:GREEN -->\n## werkrevisor"}
def doc_run(hint_line, earlier=True, review=None, old=OLD_TEXT, new=NEW_TEXT):
gitea = FakeGitea(files=[gitea_file(DOC, status="added", additions=5)],
diff=diff_for(DOC, added=new.rstrip("\n").split("\n"), new=True),
comments=[earlier_round()] if earlier else ())
gitea.raw_files[DOC] = new.encode()
gitea.raw_files_at[(DOC, EARLIER)] = old.encode()
gitea.raw_files_at[(DOC, HEAD)] = new.encode()
data = review_data(issues=[DOC] if hint_line else [], header="[low] Wording")
for issue in data["review"]["key_issues_to_review"]:
issue.update(start_line=hint_line, end_line=hint_line)
cfg = config(gate=AUTOMERGE, review=review or {})
outcome, _ = run(gitea, FakeModel(data=data, prompt_files=[DOC]), cfg=cfg)
return outcome, gitea
def commented_lines(gitea):
return sorted(c["new_position"] for comments in gitea.review_comments for c in comments)
class ChangedLinesTest(unittest.TestCase):
def test_new_hint_on_old_text(self):
outcome, gitea = doc_run(hint_line=3)
self.assertIs(outcome.result.verdict, Verdict.GREEN)
self.assertEqual(commented_lines(gitea), [])
self.assertIn("Wording", gitea.created_comments[0])
self.assertEqual(len(gitea.scheduled_merges), 1)
def test_hint_on_changed_line(self):
outcome, gitea = doc_run(hint_line=5)
self.assertEqual(commented_lines(gitea), [5])
self.assertEqual(gitea.scheduled_merges, [])
self.assertIn("merge waits for 1 open hint(s)", outcome.result.gate_note)
def test_first_round(self):
outcome, gitea = doc_run(hint_line=3, earlier=False)
self.assertEqual(commented_lines(gitea), [3, 4])
self.assertEqual(gitea.scheduled_merges, [])
def test_writing_rule_on_old_text(self):
outcome, gitea = doc_run(hint_line=None)
self.assertEqual(commented_lines(gitea), [])
self.assertIn("line longer than 128 characters", gitea.created_comments[0])
self.assertEqual(len(gitea.scheduled_merges), 1)
def test_unreadable_earlier_file(self):
gitea = FakeGitea(files=[gitea_file(DOC, status="added", additions=5)],
diff=diff_for(DOC, added=NEW_TEXT.rstrip("\n").split("\n"), new=True),
comments=[earlier_round()])
gitea.raw_files[DOC] = NEW_TEXT.encode()
gitea.raw_files_at[(DOC, EARLIER)] = None
data = review_data(issues=[DOC], header="[low] Wording")
for issue in data["review"]["key_issues_to_review"]:
issue.update(start_line=3, end_line=3)
outcome, _ = run(gitea, FakeModel(data=data, prompt_files=[DOC]), cfg=config(gate=AUTOMERGE))
self.assertEqual(commented_lines(gitea), [3, 4])
def test_doc_hint_line_comments_keeps_the_hint(self):
outcome, gitea = doc_run(hint_line=3, review={"doc_hint_line_comments": True})
self.assertEqual(commented_lines(gitea), [3])
self.assertEqual(gitea.scheduled_merges, [])
def test_a_finding_on_a_heading_covers_its_section(self):
old = "# Title\n\n## Solution\n\nOld text.\n"
new = "# Title\n\n## Solution\n\nNew text.\n"
outcome, gitea = doc_run(hint_line=3, old=old, new=new)
self.assertEqual(commented_lines(gitea), [3])
self.assertEqual(gitea.scheduled_merges, [])
def test_a_paragraph_rule_covers_its_paragraph(self):
old = "# Title\n\nOne.\nTwo.\nThree.\nFour.\nFive.\n"
new = "# Title\n\nOne.\nTwo.\nThree.\nFour.\nFive.\nSix.\n"
outcome, gitea = doc_run(hint_line=None, old=old, new=new)
self.assertEqual(commented_lines(gitea), [3])
self.assertEqual(gitea.scheduled_merges, [])