Ctrl K
ComunidadGuías…

tests/test_bugfixes.py

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
"""Regression tests for bugs fixed during review of the agent-generated build."""

from __future__ import annotations

import sys
import tempfile
import unittest
from pathlib import Path
from typing import Sequence

ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT / "src"))

from chorus.backends import is_quota_exhaustion  # noqa: E402
from chorus.persistence import open_store  # noqa: E402
from chorus.projects import CloneError, CommandResult, ProjectImporter  # noqa: E402


class QuotaDetectionTests(unittest.TestCase):
    def test_stdout_429_is_not_flagged(self) -> None:
        # A bare "429" in the agent's own output must not be misread as quota.
        self.assertFalse(is_quota_exhaustion("def handle_429(): return 429\n", ""))

    def test_generic_phrase_on_stdout_not_flagged(self) -> None:
        self.assertFalse(is_quota_exhaustion("the rate limit middleware was added", ""))

    def test_rate_limit_on_stderr_is_flagged(self) -> None:
        self.assertTrue(is_quota_exhaustion("", "Error: rate limit exceeded, retry later"))

    def test_specific_phrase_anywhere_is_flagged(self) -> None:
        self.assertTrue(is_quota_exhaustion("insufficient quota for this request", ""))


class MigrationIdempotencyTests(unittest.TestCase):
    def test_migrate_is_repeatable_without_error(self) -> None:
        with tempfile.TemporaryDirectory() as tmp:
            store = open_store(Path(tmp) / "chorus.db")
            try:
                # open_store already migrated; running again must be a safe no-op
                # (the pre-fix code could raise "duplicate column name: body").
                store.migrate()
                ids = [
                    row[0]
                    for row in store.connection.execute(
                        "SELECT id FROM schema_migrations ORDER BY id"
                    ).fetchall()
                ]
                self.assertIn("001_core", ids)
                self.assertIn("002_ticket_body", ids)
            finally:
                store.close()


class _Runner:
    def __init__(self, handler) -> None:
        self.handler = handler

    def run(self, args: Sequence[str], *, cwd: Path | None = None) -> CommandResult:
        return self.handler(tuple(args), cwd)


class CloneCleanupTests(unittest.TestCase):
    def test_partial_clone_removed_when_post_clone_step_fails(self) -> None:
        with tempfile.TemporaryDirectory() as tmp:
            root = Path(tmp)
            store = open_store(root / "chorus.db")
            projects_dir = root / "projects"
            repo_url = "https://github.com/faridani/chorus.git"
            expected = projects_dir / "chorus"

            def handler(cmd: tuple[str, ...], cwd: Path | None) -> CommandResult:
                if cmd == ("gh", "auth", "status"):
                    return CommandResult(cmd, 0, stdout="Logged in\n")
                if cmd[:3] == ("gh", "repo", "clone"):
                    expected.mkdir(parents=True)
                    return CommandResult(cmd, 0, stdout="Cloned\n")
                # Every git default-branch probe fails → import raises mid-way.
                return CommandResult(cmd, 1, stderr="boom")

            importer = ProjectImporter(
                store, projects_dir=projects_dir, command_runner=_Runner(handler)
            )
            try:
                with self.assertRaises(CloneError):
                    importer.import_from_url(repo_url)
                self.assertFalse(
                    expected.exists(),
                    "partial clone directory should be cleaned up on failure",
                )
            finally:
                store.close()


if __name__ == "__main__":
    unittest.main()