import contextlib import io import unittest from werkrevisor.redact import Redactor from tests.fakes import FakeGitea, FakeModel, config, deps, diff_for, gitea_file, pr_ref from werkrevisor import review from werkrevisor.cli import execute from werkrevisor.review import configure_logging, note_added_and_deleted_files from werkrevisor.rules import files_from_gitea def log_from_gitea_provider(message): from loguru import logger err = io.StringIO() with contextlib.redirect_stderr(err): configure_logging(Redactor(), "ERROR") logger.patch(lambda record: record.update(name="pr_agent.git_providers.gitea_provider")).error(message) configure_logging(Redactor(), "CRITICAL") return err.getvalue() class ExpectedMissingVersionTest(unittest.TestCase): def test_404_for_an_added_deleted_or_renamed_file_is_not_logged(self): note_added_and_deleted_files(["docs/prs/2026-10-05-PR#12-x.md", "old.py", "n.py"]) for path in ("docs/prs/2026-10-05-PR#12-x.md", "old.py", "n.py"): with self.subTest(path=path): self.assertEqual(log_from_gitea_provider(f"Error getting file: {path}, content: (404)"), "") def test_other_errors_stay_visible(self): note_added_and_deleted_files(["new.py"]) for message in ("Error getting file: changed.py, content: (404)", "Error getting file: new.py, content: (500)", "Failed to publish comment"): with self.subTest(message=message): self.assertIn(message, log_from_gitea_provider(message)) class AddedDeletedRenamedTest(unittest.TestCase): def test_changed_file_knows_added_deleted_and_renamed(self): added, deleted, renamed, changed = files_from_gitea([ gitea_file("a.py", status="added"), gitea_file("d.py", status="deleted"), {**gitea_file("n.py", status="renamed"), "previous_filename": "o.py"}, gitea_file("c.py")]) self.assertEqual([(f.added, f.deleted, f.renamed) for f in (added, deleted, renamed, changed)], [(True, False, False), (False, True, False), (False, False, True), (False, False, False)]) def test_the_review_notes_the_added_deleted_and_renamed_files(self): files = [gitea_file("a.py", status="added"), gitea_file("d.py", status="deleted"), {**gitea_file("n.py", status="renamed"), "previous_filename": "o.py"}, gitea_file("c.py")] gitea = FakeGitea(files=files, diff=diff_for("a.py", added=["x = 1"], new=True) + diff_for("c.py", added=["y = 2"])) execute(config(), pr_ref(), deps(gitea, FakeModel()), Redactor(), publish=False) self.assertEqual(review._files_without_one_version, {"a.py", "d.py", "n.py"})