#!/usr/bin/env python3 """Test regresyjny przyrostowej aktualizacji repo.json w pagsync. Sprawdza, że po pojedynczym buildzie indeks repo.json: * gubi wpisy, których plik .pag został skasowany (clean_old_versions), * podmienia wpis zbudowanej paczki na nową wersję, * dopisuje pliki obecne na dysku, a nieobecne w indeksie (samoleczenie), * zachowuje pozostałe wpisy i nie nadpisuje indeksu przy DO_SIGN=False. Uruchomienie: python3 test_pagsync_incremental.py """ import importlib.util, importlib.machinery, json, os, sys, tarfile, tempfile, io HERE = os.path.dirname(os.path.abspath(__file__)) loader = importlib.machinery.SourceFileLoader("pagsync_mod", os.path.join(HERE, "pagsync")) spec = importlib.util.spec_from_loader("pagsync_mod", loader) mod = importlib.util.module_from_spec(spec) loader.exec_module(mod) def make_pag(path, name, version, release): meta = { "name": name, "version": version, "release": release, "arch": "x86_64", "description": f"{name} test", "depends": [], "provides": [], "license": ["GPL2"], } with tarfile.open(path, "w:xz") as tf: data = json.dumps(meta).encode() ti = tarfile.TarInfo("metadata.json") ti.size = len(data) tf.addfile(ti, io.BytesIO(data)) def main(): tmp = tempfile.mkdtemp(prefix="pagsync-test-") cat = os.path.join(tmp, "stable") os.makedirs(cat) # bar: aktualny plik + wpis w indeksie make_pag(os.path.join(cat, "bar-2.0-1.pag"), "bar", "2.0", 1) # foo: NOWY plik 1.0 (stara 0.9 skasowana przez clean_old_versions) make_pag(os.path.join(cat, "foo-1.0-1.pag"), "foo", "1.0", 1) # baz: plik jest na dysku, ale w ogóle nie ma go w indeksie (przerwana seria) make_pag(os.path.join(cat, "baz-3.0-1.pag"), "baz", "3.0", 1) # Stary indeks: foo-0.9 (plik już nie istnieje) + bar-2.0 with open(os.path.join(cat, "repo.json"), "w") as f: json.dump({ "category": "stable", "updated": "old", "count": 2, "pag_version": "1.2.3", "packages": [ {"name": "foo", "version": "0.9", "release": 1, "filename": "foo-0.9-1.pag", "size": 1, "sha256": "x", "arch": "x86_64", "description": "", "depends": [], "provides": [], "license": []}, {"name": "bar", "version": "2.0", "release": 1, "filename": "bar-2.0-1.pag", "size": 1, "sha256": "x", "arch": "x86_64", "description": "", "depends": [], "provides": [], "license": []}, ], }, f) # Stub zapisu/podpisu – testujemy logikę indeksu bez GPG. def fake_write(cat_dir, packages, catname, verbose=True): with open(os.path.join(cat_dir, "repo.json"), "w") as f: json.dump({"category": catname, "updated": "new", "count": len(packages), "pag_version": "1.2.3", "packages": packages}, f, indent=2) return False mod._write_and_sign_repo_json = fake_write mod.DO_SIGN = True assert mod.update_repo_json_after_build(cat, "foo-1.0-1.pag"), "update zwróciło False" result = json.load(open(os.path.join(cat, "repo.json"))) names = {p["name"]: p for p in result["packages"]} print("wpisy:", sorted((p["name"], p["version"], p["filename"]) for p in result["packages"])) assert set(names) == {"foo", "bar", "baz"}, f"zły zestaw pakietów: {set(names)}" assert names["foo"]["filename"] == "foo-1.0-1.pag", "foo nie podmieniony na nową wersję" assert names["foo"]["version"] == "1.0" assert names["bar"]["filename"] == "bar-2.0-1.pag", "bar zniknął" assert names["baz"]["filename"] == "baz-3.0-1.pag", "plik z dysku nie dopisany do indeksu" assert "foo-0.9-1.pag" not in {p["filename"] for p in result["packages"]}, "stary wpis nie usunięty" assert result["count"] == 3 assert result["pag_version"] == "1.2.3" print("✅ TEST OK: stary wpis usunięty, nowy dodany, plik z dysku dopisany, pozostałe zachowane") # DO_SIGN=False → brak zmian (nie nadpisujemy podpisanego indeksu) before = open(os.path.join(cat, "repo.json")).read() mod.DO_SIGN = False assert mod.update_repo_json_after_build(cat, "foo-1.0-1.pag") is False assert open(os.path.join(cat, "repo.json")).read() == before print("✅ TEST OK: DO_SIGN=False nie nadpisuje indeksu") import shutil shutil.rmtree(tmp, ignore_errors=True) print("🎉 Wszystkie testy przeszły.") if __name__ == "__main__": main()