🔒 Repository is read-only – file editing is disabled.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
#!/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()