Ctrl K
ComunidadGuías…

scripts/__tests__/test_sync_broker_sdk_refs.py

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

Archivo original ↗Preguntar a KiBot
from __future__ import annotations

import hashlib
import json
import textwrap

import pytest

from scripts import sync_broker_sdk_refs as syncer


def test_active_sdk_entries_ignores_placeholders_and_unknowns() -> None:
    entries = [
        {"name": "dhanhq", "version": "2.2.0"},
        {"name": "future-sdk", "version": "PLACEHOLDER"},
        {"name": "unknown-sdk", "version": "1.0.0"},
        {"name": "kotakneoapi", "version": "3.0.7", "release_version": "3.0.7"},
    ]

    assert syncer.active_sdk_entries(entries) == [
        {"name": "dhanhq", "version": "2.2.0", "source_commit": ""},
        {"name": "kotakneoapi", "version": "3.0.7", "release_version": "3.0.7", "source_commit": ""},
    ]


@pytest.mark.parametrize("release_version", [None, "", "v3.0.7", "3.0.7rc1"])
def test_kotak_reference_sync_requires_an_explicit_stable_release_version(release_version):
    entry = {"name": "kotakneoapi", "version": "3.0.8"}
    if release_version is not None:
        entry["release_version"] = release_version

    with pytest.raises(ValueError, match="release_version"):
        syncer.active_sdk_entries([entry])


def test_select_pypi_artifact_prefers_universal_py3_wheel() -> None:
    files = [
        {"filename": "pkg-1.0.0.tar.gz", "packagetype": "sdist", "python_version": "source"},
        {"filename": "pkg-1.0.0-cp312-macosx.whl", "packagetype": "bdist_wheel", "python_version": "cp312"},
        {"filename": "pkg-1.0.0-py3-none-any.whl", "packagetype": "bdist_wheel", "python_version": "py3"},
    ]

    assert syncer.select_pypi_artifact(files)["filename"] == "pkg-1.0.0-py3-none-any.whl"


def test_download_pypi_artifact_verifies_digest(tmp_path) -> None:
    body = b"wheel-bytes"
    digest = hashlib.sha256(body).hexdigest()
    release = {
        "releases": {
            "1.0.0": [
                {
                    "filename": "pkg-1.0.0-py3-none-any.whl",
                    "packagetype": "bdist_wheel",
                    "python_version": "py3",
                    "url": "https://files.example/pkg.whl",
                    "digests": {"sha256": digest},
                }
            ]
        }
    }

    def opener(url: str) -> tuple[int, bytes]:
        if url == "https://pypi.org/pypi/pkg/json":
            return 200, json.dumps(release).encode("utf-8")
        if url == "https://files.example/pkg.whl":
            return 200, body
        raise AssertionError(url)

    result = syncer.download_pypi_artifact("pkg", "1.0.0", tmp_path, opener)

    assert result["filename"] == "pkg-1.0.0-py3-none-any.whl"
    assert result["sha256"] == digest
    assert (tmp_path / "pkg-1.0.0-py3-none-any.whl").read_bytes() == body


def test_latest_pypi_version_reads_info_version() -> None:
    def opener(url: str) -> tuple[int, bytes]:
        assert url == "https://pypi.org/pypi/pkg/json"
        return 200, json.dumps({"info": {"version": "1.2.3"}}).encode("utf-8")

    assert syncer.latest_pypi_version("pkg", opener) == "1.2.3"


def test_load_broker_lock_reads_toml_entries(tmp_path) -> None:
    lock = tmp_path / "brokers.lock"
    lock.write_text(
        textwrap.dedent(
            """
            [[broker]]
            name = "dhanhq"
            version = "2.2.0"

            [[broker]]
            name = "growwapi"
            version = "1.5.0"
            """
        ),
        encoding="utf-8",
    )

    assert [entry["name"] for entry in syncer.load_broker_lock(lock)] == ["dhanhq", "growwapi"]


def test_sync_records_pypi_drift(tmp_path, monkeypatch) -> None:
    body = b"wheel-bytes"
    digest = hashlib.sha256(body).hexdigest()
    release = {
        "info": {"version": "2.3.0"},
        "releases": {
            "2.2.0": [
                {
                    "filename": "dhanhq-2.2.0-py3-none-any.whl",
                    "packagetype": "bdist_wheel",
                    "python_version": "py3",
                    "url": "https://files.example/dhanhq.whl",
                    "digests": {"sha256": digest},
                }
            ]
        },
    }

    def opener(url: str) -> tuple[int, bytes]:
        if url == "https://pypi.org/pypi/dhanhq/json":
            return 200, json.dumps(release).encode("utf-8")
        if url == "https://files.example/dhanhq.whl":
            return 200, body
        raise AssertionError(url)

    monkeypatch.setattr(syncer, "load_broker_lock", lambda _path: [{"name": "dhanhq", "version": "2.2.0"}])
    monkeypatch.setattr(
        syncer,
        "sync_git_mirror",
        lambda _source, _audit_root: {"path": "repo", "remote": "origin", "head": "abc", "describe": "abc"},
    )

    manifest = syncer.sync(audit_root=tmp_path / "audit", check_missing=False, opener=opener)

    assert manifest["sdks"][0]["pypi_latest_version"] == "2.3.0"
    assert manifest["sdks"][0]["pypi_current"] is False
    assert "uv run python scripts/sync_broker_sdk_refs.py" in (tmp_path / "audit" / "README.md").read_text(
        encoding="utf-8"
    )
    assert manifest["drift"] == [{"package": "dhanhq", "source": "pypi", "locked": "2.2.0", "upstream": "2.3.0"}]


def test_non_kotak_git_drift_still_tracks_remote_head(tmp_path, monkeypatch) -> None:
    digest = hashlib.sha256(b"wheel-bytes").hexdigest()
    release = {
        "info": {"version": "2.3.0"},
        "releases": {
            "2.3.0": [
                {
                    "filename": "dhanhq-2.3.0-py3-none-any.whl",
                    "packagetype": "bdist_wheel",
                    "python_version": "py3",
                    "url": "https://files.example/dhanhq.whl",
                    "digests": {"sha256": digest},
                }
            ]
        },
    }

    def opener(url: str) -> tuple[int, bytes]:
        if url == "https://pypi.org/pypi/dhanhq/json":
            return 200, json.dumps(release).encode("utf-8")
        if url == "https://files.example/dhanhq.whl":
            return 200, b"wheel-bytes"
        raise AssertionError(url)

    locked_commit = "a" * 40
    upstream_head = "b" * 40
    monkeypatch.setattr(
        syncer,
        "load_broker_lock",
        lambda _path: [{"name": "dhanhq", "version": "2.3.0", "source_commit": locked_commit, "sha256": digest}],
    )
    monkeypatch.setattr(
        syncer,
        "sync_git_mirror",
        lambda _source, _audit_root: {
            "path": "repo",
            "remote": "origin",
            "head": upstream_head,
            "describe": "v2.3.0",
        },
    )

    manifest = syncer.sync(audit_root=tmp_path / "audit", check_missing=False, opener=opener)

    assert manifest["sdks"][0]["git_current"] is False
    assert manifest["drift"] == [
        {"package": "dhanhq", "source": "git", "locked": locked_commit, "upstream": upstream_head}
    ]
    assert "locked behind upstream HEAD" in (tmp_path / "audit" / "README.md").read_text(encoding="utf-8")


@pytest.mark.parametrize(
    ("git_change", "pypi_version", "expected_source"),
    [
        ({}, "3.0.7", None),
        ({"head": "b" * 40, "head_tree": "1" * 40}, "3.0.7", None),
        ({"latest_stable_tag": "v3.0.8"}, "3.0.8", "release-tag"),
        ({"release_commit": "c" * 40}, "3.0.7", "release-commit"),
        ({"latest_stable_tag": "v3.0.10"}, "3.0.10", "release-tag"),
    ],
)
def test_kotak_dual_track_drift_is_independent(
    tmp_path,
    monkeypatch,
    git_change: dict[str, str],
    pypi_version: str,
    expected_source: str | None,
) -> None:
    wheel = b"release wheel"
    sdist = b"release sdist"
    wheel_hash = hashlib.sha256(wheel).hexdigest()
    sdist_hash = hashlib.sha256(sdist).hexdigest()
    locked = {
        "name": "kotakneoapi",
        "version": "3.0.8",
        "release_version": "3.0.7",
        "source_commit": "a" * 40,
        "source_tree": "d" * 40,
        "release_tag": "v3.0.7",
        "release_commit": "e" * 40,
        "release_tree": "f" * 40,
        "release_wheel_sha256": wheel_hash,
        "release_sdist_sha256": sdist_hash,
        "sha256": wheel_hash,
    }
    git = {
        "path": "mirror",
        "remote": "origin",
        "head": locked["source_commit"],
        "head_tree": locked["source_tree"],
        "describe": "v3.0.7",
        "latest_stable_tag": locked["release_tag"],
        "release_commit": locked["release_commit"],
        "release_tree": locked["release_tree"],
    }
    git.update(git_change)
    monkeypatch.setattr(syncer, "load_broker_lock", lambda _path: [locked])
    monkeypatch.setattr(syncer, "sync_git_mirror", lambda _source, _root: git)

    def opener(url: str) -> tuple[int, bytes]:
        if url == "https://pypi.org/pypi/kotakneoapi/json":
            data = {
                "info": {"version": pypi_version},
                "releases": {
                    "3.0.7": [
                        {
                            "filename": "kotakneoapi-3.0.7-py3-none-any.whl",
                            "packagetype": "bdist_wheel",
                            "python_version": "py3",
                            "url": "https://files.example/wheel",
                            "digests": {"sha256": wheel_hash},
                        },
                        {
                            "filename": "kotakneoapi-3.0.7.tar.gz",
                            "packagetype": "sdist",
                            "python_version": "source",
                            "url": "https://files.example/sdist",
                            "digests": {"sha256": sdist_hash},
                        },
                    ]
                },
            }
            return 200, json.dumps(data).encode()
        if url == "https://files.example/wheel":
            return 200, wheel
        if url == "https://files.example/sdist":
            return 200, sdist
        raise AssertionError(url)

    manifest = syncer.sync(audit_root=tmp_path / "audit", check_missing=False, opener=opener)

    sdk = manifest["sdks"][0]
    if expected_source is None:
        assert manifest["drift"] == []
        assert sdk["git_current"] is True
    else:
        assert any(d["package"] == "kotakneoapi" and d["source"] == expected_source for d in manifest["drift"])
        if expected_source == "release-commit":
            assert sdk["git_current"] is False
    if "head" in git_change:
        readme = (tmp_path / "audit" / "README.md").read_text(encoding="utf-8")
        assert "locked behind upstream HEAD" not in readme
        assert "git status: current" in readme
    assert sdk["version"] == "3.0.8"
    assert manifest["sdks"][0]["release_version"] == "3.0.7"
    assert manifest["sdks"][0]["pypi"]["filename"] == "kotakneoapi-3.0.7-py3-none-any.whl"