Source code for tests.test_checksums

# Copyright Kevin Deldycke <kevin@deldycke.com> and contributors.
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

"""Tests for the binary tool registry checksum update logic."""

from __future__ import annotations

from unittest.mock import patch

from repomatic.checksums import update_registry_checksums
from repomatic.tool_runner import TOOL_REGISTRY

FAKE_HASH_OLD = "a" * 64
FAKE_HASH_NEW = "b" * 64


[docs] def test_update_registry_checksums_replaces_stale_hash(tmp_path): """update_registry_checksums replaces stale hashes in tool_runner.py.""" spec = next(s for s in TOOL_REGISTRY.values() if s.binary is not None) assert spec.binary is not None old_hash = next(iter(spec.binary.checksums.values())) registry = tmp_path / "tool_runner.py" registry.write_text( f' checksums={{\n "linux-x64": "{old_hash}",\n }},\n', encoding="UTF-8", ) with patch("repomatic.checksums._download_sha256", return_value=FAKE_HASH_NEW): updated = update_registry_checksums(registry) # Every binary platform gets a fresh hash because the mock differs. assert len(updated) >= 1 content = registry.read_text(encoding="UTF-8") assert old_hash not in content assert FAKE_HASH_NEW in content
[docs] def test_update_registry_checksums_noop_when_current(tmp_path): """update_registry_checksums does not rewrite when all hashes match.""" registry = tmp_path / "tool_runner.py" content = "# no checksums to update\n" registry.write_text(content, encoding="UTF-8") def same_hash(url): # Return each tool's real checksum so nothing changes. for spec in TOOL_REGISTRY.values(): if spec.binary is None: continue for platform_key, url_template in spec.binary.urls.items(): if url_template.format(version=spec.version) == url: return spec.binary.checksums[platform_key] return FAKE_HASH_OLD with patch("repomatic.checksums._download_sha256", side_effect=same_hash): updated = update_registry_checksums(registry) assert updated == [] assert registry.read_text(encoding="UTF-8") == content
[docs] def test_update_registry_checksums_reconciles_version_stamp(tmp_path): """A stale VERSIONS stamp is reconciled to the registry version.""" name, spec = next((n, s) for n, s in TOOL_REGISTRY.items() if s.binary is not None) assert spec.version != "9.9.9" def real_hash(url): # Return each tool's real checksum so no hash changes; only the stale # version stamp should be reconciled. for s in TOOL_REGISTRY.values(): if s.binary is None: continue for pk, tmpl in s.binary.urls.items(): if tmpl.format(version=s.version) == url: return s.binary.checksums[pk] return FAKE_HASH_OLD registry = tmp_path / "tool_runner.py" registry.write_text( f'VERSIONS = {{\n "{name}": "9.9.9",\n}}\n', encoding="UTF-8" ) with patch("repomatic.checksums._download_sha256", side_effect=real_hash): update_registry_checksums(registry) content = registry.read_text(encoding="UTF-8") assert f'"{name}": "{spec.version}"' in content assert "9.9.9" not in content
[docs] def test_update_registry_checksums_version_override(tmp_path): """version_overrides downloads at the override version and stamps it. Models the `sync-tool-versions` flow: the source was bumped (so the file holds the new version) while the in-memory registry still holds the old one, and the override drives both the download URL and the VERSIONS stamp. """ name, spec = next((n, s) for n, s in TOOL_REGISTRY.items() if s.binary is not None) assert spec.binary is not None new_version = "99.0.0" old_hash = next(iter(spec.binary.checksums.values())) registry = tmp_path / "tool_runner.py" registry.write_text( f'VERSIONS = {{\n "{name}": "9.9.9",\n}}\n# {old_hash}\n', encoding="UTF-8", ) seen_urls: list[str] = [] def capture(url): seen_urls.append(url) return FAKE_HASH_NEW with patch("repomatic.checksums._download_sha256", side_effect=capture): update_registry_checksums(registry, version_overrides={name: new_version}) content = registry.read_text(encoding="UTF-8") # The stamp is reconciled to the override, not the in-memory version. assert f'"{name}": "{new_version}"' in content # The override version drove the download URL. override_url = next(iter(spec.binary.urls.values())).format(version=new_version) assert override_url in seen_urls