"""Tests for the release-time conda recipe synchronizer."""

from __future__ import annotations

import pytest

from scripts.sync_conda_recipe import update_recipe

_OLD_SHA = "a" * 64
_NEW_SHA = "b" * 64
_RECIPE = f"""\
schema_version: 1

context:
  version: "1.2.3"

source:
  sha256: {_OLD_SHA}
"""


def test_update_recipe_replaces_version_and_hash() -> None:
    updated = update_recipe(_RECIPE, version="2.0.0", sha256=_NEW_SHA)

    assert '  version: "2.0.0"' in updated
    assert f"  sha256: {_NEW_SHA}" in updated
    assert "1.2.3" not in updated
    assert _OLD_SHA not in updated


@pytest.mark.parametrize("sha256", ["", "A" * 64, "f" * 63, "not-a-hash"])
def test_update_recipe_rejects_invalid_hash(sha256: str) -> None:
    with pytest.raises(ValueError, match="sha256"):
        update_recipe(_RECIPE, version="2.0.0", sha256=sha256)


def test_update_recipe_rejects_ambiguous_recipe() -> None:
    duplicate = _RECIPE + f"\nsource_two:\n  sha256: {_OLD_SHA}\n"

    with pytest.raises(ValueError, match="exactly one"):
        update_recipe(duplicate, version="2.0.0", sha256=_NEW_SHA)
