Files
werkrevisor/tests/test_merge_conflict.py
claude-code dac5d5b162
werkator build succeeded after 00:12
werkator/werkrevisor-statistics build succeeded after 00:34
werkrevisor 0.38.0: a PR in conflict with its base asks for a rebase, not for a human review (#94)
Co-authored-by: claude-code <claude-code@javagil.de>
2026-10-12 15:09:52 +02:00

62 lines
2.6 KiB
Python

import unittest
from unittest import mock
from tests.test_flow import DOC, FakeModel, config, docs_gitea, review_data, run
from werkrevisor.verdict import Verdict
CFG = {"gate": {"yellow_gate": "approval", "human_reviewers": ["alice"], "require_wip_transition": True,
"automerge": True}}
REBASE = "merge conflict with main: the author rebases the branch onto main and pushes"
def conflicting(gitea, refusals=(405, 405)):
gitea.schedule_merge_refusals = list(refusals)
gitea.mergeable = False
return gitea
class MergeConflictTest(unittest.TestCase):
def setUp(self):
patcher = mock.patch("werkrevisor.cli.time.sleep")
self.sleep = patcher.start()
self.addCleanup(patcher.stop)
def test_a_yellow_pr_in_conflict_requests_no_human_review(self):
"""Scenario#94.01"""
gitea = conflicting(docs_gitea())
model = FakeModel(data=review_data(risk="high"), prompt_files=[DOC])
outcome, _ = run(gitea, model, cfg=config(**CFG))
self.assertIs(outcome.result.verdict, Verdict.YELLOW)
self.assertEqual((gitea.requested, gitea.scheduled_merges), ([], []))
self.assertEqual(outcome.result.gate_note, "no human review requested; " + REBASE)
self.assertIn(REBASE, gitea.edited_comments[-1][1])
def test_a_green_pr_in_conflict_names_the_conflict(self):
"""Scenario#94.02"""
gitea = conflicting(docs_gitea())
outcome, _ = run(gitea, cfg=config(**CFG))
self.assertIs(outcome.result.verdict, Verdict.GREEN)
self.assertEqual(outcome.result.gate_note, "approved by werkrevisor; " + REBASE)
self.assertIn(REBASE, gitea.edited_comments[-1][1])
def test_a_base_branch_still_being_checked_is_no_conflict(self):
"""Scenario#94.03"""
gitea = docs_gitea()
gitea.schedule_merge_refusals = [405]
model = FakeModel(data=review_data(risk="high"), prompt_files=[DOC])
outcome, _ = run(gitea, model, cfg=config(**CFG))
self.assertEqual((gitea.scheduled_merges, gitea.requested), ([(7, "squash", True)], ["alice"]))
self.sleep.assert_called_once_with(5)
def test_a_refusal_of_a_mergeable_pr_keeps_the_review_request(self):
gitea = docs_gitea()
gitea.schedule_merge_refusals = [405, 405]
model = FakeModel(data=review_data(risk="high"), prompt_files=[DOC])
outcome, _ = run(gitea, model, cfg=config(**CFG))
self.assertEqual(gitea.requested, ["alice"])
self.assertIn("merge not scheduled: POST merge failed with HTTP 405", outcome.result.gate_note)
if __name__ == "__main__":
unittest.main()