62 lines
2.6 KiB
Python
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()
|