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()