Ctrl K
ComunidadGuías…

scripts/__tests__/test_audit_repos.py

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

Archivo original ↗Preguntar a KiBot
"""Tests for scripts/audit_repos.py."""

from __future__ import annotations

import json
import sys
from pathlib import Path

import pytest

# Ensure repo root is on sys.path
REPO_ROOT = Path(__file__).resolve().parents[2]
if str(REPO_ROOT) not in sys.path:
    sys.path.insert(0, str(REPO_ROOT))

from scripts.audit_repos import (  # noqa: E402
    filter_repos,
    format_summary,
    format_table,
    load_status,
)


@pytest.fixture()
def sample_repos() -> dict[str, dict]:
    """Sample repo data for testing."""
    return {
        "sample-gateway": {
            "status": "integrated",
            "target_package": "gateway",
            "absorbed_patterns": ["REST API", "WebSocket"],
            "last_examined": "2026-03-24",
            "upstream_url": "https://github.com/marketcalls/sample-gateway",
            "notes": "Submodule. Adapter pattern.",
        },
        "FinRL": {
            "status": "unexamined",
            "target_package": "backtest-engine",
            "absorbed_patterns": [],
            "last_examined": None,
            "upstream_url": "https://github.com/AI4Finance-Foundation/FinRL",
            "notes": "Deep RL framework",
        },
        "sample-chatbot": {
            "status": "examined",
            "target_package": "ai",
            "absorbed_patterns": ["ChromaDB RAG"],
            "last_examined": "2026-03-22",
            "upstream_url": "https://github.com/marketcalls/sample-chatbot",
            "notes": "RAG patterns",
        },
    }


class TestFilterRepos:
    """Tests for filter_repos function."""

    def test_filter_by_status(self, sample_repos: dict) -> None:
        """Filter repos by status returns only matching repos."""
        result = filter_repos(sample_repos, status="integrated")
        assert len(result) == 1
        assert "sample-gateway" in result

    def test_filter_by_package(self, sample_repos: dict) -> None:
        """Filter repos by package returns only matching repos."""
        result = filter_repos(sample_repos, package="ai")
        assert len(result) == 1
        assert "sample-chatbot" in result

    def test_filter_no_match(self, sample_repos: dict) -> None:
        """Filter with no matches returns empty dict."""
        result = filter_repos(sample_repos, status="verified")
        assert len(result) == 0


class TestFormatTable:
    """Tests for format_table function."""

    def test_table_has_header(self, sample_repos: dict) -> None:
        """Table output includes header row."""
        output = format_table(sample_repos)
        assert "Repo" in output
        assert "Status" in output
        assert "Package" in output

    def test_table_has_all_repos(self, sample_repos: dict) -> None:
        """Table output includes all repo names."""
        output = format_table(sample_repos)
        assert "sample-gateway" in output
        assert "FinRL" in output
        assert "sample-chatbot" in output


class TestFormatSummary:
    """Tests for format_summary function."""

    def test_summary_counts(self, sample_repos: dict) -> None:
        """Summary shows correct counts per status."""
        output = format_summary(sample_repos, total_declared=222)
        assert "Tracked repos: 3" in output
        assert "Declared total: 222" in output
        assert "integrated: 1" in output
        assert "unexamined: 1" in output
        assert "examined: 1" in output


class TestLoadStatus:
    """Tests for load_status function."""

    def test_load_missing_file(self, tmp_path: Path) -> None:
        """Loading a missing file raises FileNotFoundError."""
        with pytest.raises(FileNotFoundError):
            load_status(tmp_path / "nonexistent.json")

    def test_load_valid_file(self, tmp_path: Path) -> None:
        """Loading a valid file returns parsed JSON."""
        data = {"version": "1.0", "repos": {"test": {"status": "examined"}}}
        target = tmp_path / "status.json"
        target.write_text(json.dumps(data), encoding="utf-8")
        result = load_status(target)
        assert result["version"] == "1.0"
        assert "test" in result["repos"]